хранение твитов в виде XML-файла - PullRequest
0 голосов
/ 22 ноября 2011

Я в полном недоумении по этому поводу ... Я написал функцию, которая сначала проверяет, существует ли XML-файл кэшированных твитов в каталоге кэша, затем извлекает твиты либо из файла, либо через cURL.,Проблема в том, что данные, которые хранятся в файле XML, добавляются и дополняются несколькими символами, что нарушает мой SimpleXMLElement.

Вот функция целиком:

<?php
function wpg_get_tweets($user, $number) {
  $cache = false;
  $cPath = get_theme_root().'/'.strtolower(get_current_theme()).'/cache/tweets.xml';
  if(file_exists($cPath)) {
    $modtime = filemtime($cPath);
    $timeago = time() - 600;
    if($modtime < $timeago) {
      $cache = false;
    }
    else {
      $cache = true;
    }
  }

  if($cache === false) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://twitter.com/statuses/user_timeline/'.$user.'.xml?count='.$number);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $content = curl_exec($ch);
    curl_close($ch);
    if($content === false) {
      if(filesize($cPath) != 0) {
        $content = file_get_contents($cPath);
      }
      else {
        $content = 
          '<?xml version="1.0" encoding="UTF-8"?>
           <statuses type="array">
            <status>
              <created_at>'.date('D M d h:i:s O Y').'</created_at>
              <id>138138002546364417</id>
              <text>Twitter API Issue - Users may currently be experiencing some site issues; our engineers are working on it.</text>
            </status>
          </statuses>';
      }
    }
    $fp = fopen($cPath, 'w');
    if(flock($fp, LOCK_EX)) {
      fwrite($fp, serialize($content));
      flock($fp, LOCK_UN);
    }
    fclose($fp);
  }
  else {
    $content = file_get_contents($cPath);
  }
  $data = strstr($content, '<?');
  $xml = new SimpleXMLElement($data);
  return $xml;
}
?>

Вотпример данных, которые хранятся в файле XML, если он не существует или устарел:

s:8200:"<?xml version="1.0" encoding="UTF-8"?>
<statuses type="array">
  <status>
    <created_at>Sun Nov 20 06:14:00 +0000 2011</created_at>
    <id>138138002546364417</id>
    <text>This is just some random text</text>
    <source>web</source>
    <truncated>false</truncated>
    <favorited>false</favorited>
    <in_reply_to_status_id></in_reply_to_status_id>
    <in_reply_to_user_id></in_reply_to_user_id>
    <in_reply_to_screen_name></in_reply_to_screen_name>
    <retweet_count>0</retweet_count>
    <retweeted>false</retweeted>
    <user>
      <id>1234</id>
      <name>Random Guy</name>
      <screen_name>UserName</screen_name>
      <location>Interwebs, Milky Way</location>
      <description>I like peanuts</description>

<profile_image_url>http://a2.twimg.com/profile_images/1234/avatar_normal.jpg</profile_image_url>
      <profile_image_url_https>https://si0.twimg.com/profile_images/1234/avatar_normal.jpg</profile_image_url_https>
      <url></url>
      <protected>false</protected>
      <followers_count>1233</followers_count>
      <profile_background_color>1e1810</profile_background_color>
      <profile_text_color>a83d22</profile_text_color>
      <profile_link_color>3e5e2f</profile_link_color>
      <profile_sidebar_fill_color>33291e</profile_sidebar_fill_color>
      <profile_sidebar_border_color>000000</profile_sidebar_border_color>
      <friends_count>874</friends_count>
      <created_at>Thu Feb 19 05:08:38 +0000 2009</created_at>
      <favourites_count>2</favourites_count>
      <utc_offset>-21600</utc_offset>
      <time_zone>Central Time (US &amp; Canada)</time_zone>
      <profile_background_image_url>http://a0.twimg.com/profile_background_images/1234/tbg.png</profile_background_image_url>
      <profile_background_image_url_https>https://si0.twimg.com/profile_background_images/1234/tbg.png</profile_background_image_url_https>
      <profile_background_tile>false</profile_background_tile>
      <profile_use_background_image>true</profile_use_background_image>
      <notifications></notifications>
      <geo_enabled>true</geo_enabled>
      <verified>false</verified>
      <following></following>
      <statuses_count>2309</statuses_count>
      <lang>en</lang>
      <contributors_enabled>false</contributors_enabled>
      <follow_request_sent></follow_request_sent>
      <listed_count>31</listed_count>
      <show_all_inline_media>false</show_all_inline_media>
      <default_profile>false</default_profile>
      <default_profile_image>false</default_profile_image>
      <is_translator>false</is_translator>
    </user>
    <geo/>
    <coordinates/>
    <place/>
    <contributors/>
  </status>
</statuses>
";

Проблема, похоже, в s:8200:" в самом начале файла и / или"; в самом конце файла ... Я не уверен, как удалить это перед созданием SimpleXMLElement или предотвратить его сохранение?

Ответы [ 2 ]

1 голос
/ 22 ноября 2011

Вы сериализуете данные, но читаете их как обычный текст. Либо сериализуйте и десериализуйте как для чтения, так и для записи соответственно, или для записи / чтения в виде строки.

Если вы собираетесь сериализовать / прочитать, удалите метаданные сериализации.

1 голос
/ 22 ноября 2011

Вот виновник:

fwrite($fp, serialize($content));

Дополнительные вещи, которые вы видите, - это вывод PHP * serialize;он помечает вывод как строку из 8 200 символов.

Так как $content всегда будет строкой, вы, вероятно, просто захотите сделать:

fwrite($fp, $content);

или, еслиВы действительно хотите хранить сериализованные строки, вам нужно unserialize, когда вы читаете их обратно.

...