PHP不会将数据写入JSON文件

时间:2013-04-11 21:45:27

标签: php json

我的应用程序中有以下PHP代码,它可以在本地json文件中获取并存储一条推文,我可以使用该推文将推文发送到我的网页,而无需继续敲打Twitter API。

if (file_exists( get_site_url() . '/twitter.json' )) {
    $data = json_decode( file_get_contents( get_site_url() . '/twitter.json' ));
    if ($data['timestamp'] > time() - 10 * 60) {
        $twitter_result = $data['twitter_result'];
    }
}

if (!$twitter_result) {
    $twitter_result = file_get_contents('http://api.twitter.com/1/statuses/user_timeline.json?q=@Twitter&rpp=1&screen_name=Twitter&count=1');

   $data = array ('twitter_result' => $twitter_result, 'timestamp' => time());
   file_put_contents( get_site_url() . '/twitter.json', json_encode($data));
}

以前使用serializeunserizalize代替json_encodejson_decode的代码已更改,因为我希望将保存的数据作为纯JSON。

但是,自更改后,数据不再保存到文件中!我推测是因为我正在检查时间戳的行是不正确的,但如果我注释掉top if语句,它实际上甚至不会保存数据。

也许是因为Twitter已经是JSON了?但如果回显json_encode($ data),我会得到以下结果:

{
    "twitter_result": "[{\"created_at\":\"Thu Apr 11 21:11:23 +0000 2013\",\"id\":322456869178310656,\"id_str\":\"322456869178310656\",\"text\":\"We\\u2019re bringing Trends to over 160 new locations. To learn more, check out our blog post: http:\\\/\\\/t.co\\\/2Vn2JRmHV5\",\"source\":\"\\u003ca href=\\\"http:\\\/\\\/itunes.apple.com\\\/us\\\/app\\\/twitter\\\/id409789998?mt=12\\\" rel=\\\"nofollow\\\"\\u003eTwitter for Mac\\u003c\\\/a\\u003e\",\"truncated\":false,\"in_reply_to_status_id\":null,\"in_reply_to_status_id_str\":null,\"in_reply_to_user_id\":null,\"in_reply_to_user_id_str\":null,\"in_reply_to_screen_name\":null,\"user\":{\"id\":783214,\"id_str\":\"783214\",\"name\":\"Twitter\",\"screen_name\":\"twitter\",\"location\":\"San Francisco, CA\",\"url\":\"http:\\\/\\\/blog.twitter.com\\\/\",\"description\":\"Your official source for news, updates and tips from Twitter, Inc.\",\"protected\":false,\"followers_count\":17715897,\"friends_count\":120,\"listed_count\":76561,\"created_at\":\"Tue Feb 20 14:35:54 +0000 2007\",\"favourites_count\":22,\"utc_offset\":-28800,\"time_zone\":\"Pacific Time (US & Canada)\",\"geo_enabled\":true,\"verified\":true,\"statuses_count\":1571,\"lang\":\"en\",\"contributors_enabled\":false,\"is_translator\":false,\"profile_background_color\":\"ACDED6\",\"profile_background_image_url\":\"http:\\\/\\\/a0.twimg.com\\\/profile_background_images\\\/657090062\\\/l1uqey5sy82r9ijhke1i.png\",\"profile_background_image_url_https\":\"https:\\\/\\\/si0.twimg.com\\\/profile_background_images\\\/657090062\\\/l1uqey5sy82r9ijhke1i.png\",\"profile_background_tile\":true,\"profile_image_url\":\"http:\\\/\\\/a0.twimg.com\\\/profile_images\\\/2284174758\\\/v65oai7fxn47qv9nectx_normal.png\",\"profile_image_url_https\":\"https:\\\/\\\/si0.twimg.com\\\/profile_images\\\/2284174758\\\/v65oai7fxn47qv9nectx_normal.png\",\"profile_banner_url\":\"https:\\\/\\\/si0.twimg.com\\\/profile_banners\\\/783214\\\/1347405327\",\"profile_link_color\":\"038543\",\"profile_sidebar_border_color\":\"EEEEEE\",\"profile_sidebar_fill_color\":\"F6F6F6\",\"profile_text_color\":\"333333\",\"profile_use_background_image\":true,\"default_profile\":false,\"default_profile_image\":false,\"following\":null,\"follow_request_sent\":null,\"notifications\":null},\"geo\":null,\"coordinates\":null,\"place\":null,\"contributors\":null,\"retweet_count\":134,\"favorite_count\":63,\"favorited\":false,\"retweeted\":false,\"possibly_sensitive\":false,\"lang\":\"en\"}]",
    "timestamp": 1365717135
}

对我来说,它看起来像是有效的JSON ......

不能看到写作部分有任何问题,因为它之前正在工作。但这样做:

if(file_put_contents( get_site_url() . '/twitter.json', json_encode($data) )){
        echo 'success';
    }
    else
    {
        echo 'error';
    }

我得到了错误echo语句。不知道为什么?位置是正确的,文件应该是可写的并且存在。

然而这样做:

$file = file_get_contents( get_site_url() . '/twitter.json');
echo is_writable($file) ? "is writable<br>" : "not writable<br>";

我收到错误'not writable',但权限设置为777

导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:1)

尝试以下(更新):

<?php

$twitter_result = false;
$file = 'path/to/file/twitter.json';

if (file_exists( $file )) {
    $data = json_decode( file_get_contents( $file ) );
    if ($data->timestamp > (time() - 10 * 60) ) {
        $twitter_result = $data->twitter_result;
    }
}

if (!$twitter_result) {
    $twitter_result = file_get_contents('http://api.twitter.com/1/statuses/user_timeline.json?q=@Twitter&rpp=1&screen_name=Twitter&count=1');

   $data = array ('twitter_result' => $twitter_result, 'timestamp' => time());
   file_put_contents( $file, json_encode($data));
}

?>