我完全不知道这个...我编写了一个函数,首先检查缓存目录中是否存在缓存推文的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 & 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
之前还是阻止它存储在第一个位置?
答案 0 :(得分:1)
这是罪魁祸首:
fwrite($fp, serialize($content));
你看到的额外内容是PHP serialize
的输出;它将输出标记为8,200个字符的字符串。
由于看起来$content
始终是一个字符串,您可能只想这样做:
fwrite($fp, $content);
或者,如果您确实要存储序列化字符串,则在阅读时需要unserialize
。
答案 1 :(得分:1)
您将数据序列化,但将其作为纯文本读取。分别对读取和写入进行序列化和反序列化,或者以字符串形式写入/读取。
如果您要序列化/读入,请删除序列化元数据。