3

更新:さらに掘り下げた後、解決策はかなり簡単であることがわかりました. 私がしなければならなかったのは、に置き換えることだけでしcurl_setopt($ch, CURLOPT_FILE, $fp2);curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'writeCallback');WriteCallbackデータが書き込まれるファイルを開き、データをファイルに書き込んでからファイルを閉じるだけです。以下に示すコードが意図したとおりに機能しなかった理由は、curl が twitter api との永続的な接続を開きcurl_close($ch)close($fp). これが同じ問題に直面している可能性のある人に役立つことを願っています.

最近になって、curl ライブラリに精通しました。現在、curl を使用して、Twitter のストリーミング APIとの一貫した接続を維持しようとしています。

これまでの私のコードは次のとおりです。

$fp2 = fopen('file:///Users/KareemYousrii/dump.txt', "r+");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER,0);
curl_setopt($ch, CURLOPT_FILE, $fp2);
curl_setopt($ch, CURLOPT_TIMEOUT, 99999999);
curl_exec($ch);
curl_close($ch);
fclose($fp);

行を削除しcurl_setopt($ch, CURLOPT_FILE, $fp2);て端末からファイルを実行すると、必要な応答が得られます。ただし、例に示すように保持すると、一貫性のないデータを含むテキスト ファイルが生成されます。つまり、特定のイベント (つまり、ツイートのお気に入りやリツイート) に関するデータは、別のイベントが発生しない限り、ファイルに完全には書き込まれません。その時点で、最初のイベントは完全に書き込まれますが、2 番目のイベントは部分的にしか書き込まれません。

これは、最新のイベントのファイル コンテンツの例です。

{
    "target_object": {
    "retweeted": false,
    "retweet_count": 0,
    "in_reply_to_user_id": 261119681,
    "in_reply_to_status_id": 219191541426688001,
    "in_reply_to_status_id_str": "219191541426688001",
    "truncated": false,
    "user": {
    "id": 99786716,
    "location": "",
    "profile_use_background_image": true,
    "profile_text_color": "333333",
    "following": true,
    "verified": false,
    "id_str": "99786716",
    "default_profile": true,
    "utc_offset": 7200,
    "profile_sidebar_border_color": "C0DEED",
    "friends_count": 231,
    "name": "kareem ahmed",
    "profile_background_image_url_https": "https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png",
    "notifications": false,
    "protected": false,
    "listed_count": 0,
    "profile_background_tile": false,
    "screen_name": "KareemYousrii",
    "contributors_enabled": false,
    "profile_sidebar_fill_color": "DDEEF6",
    "profile_image_url": "http:\/\/a0.twimg.com\/profile_images\/1240332836\/40753_10150118794908242_529098241_7875682_6258916_n_normal.jpg",
    "geo_enabled": true,
    "followers_count": 107,
    "description": "",
    "statuses_count": 386,
    "is_translator": false,
    "show_all_inline_media": true,
    "profile_background_color": "C0DEED",
    "url": null,
    "profile_image_url_https": "https:\/\/si0.twimg.com\/profile_images\/1240332836\/40753_10150118794908242_529098241_7875682_6258916_n_normal.jpg",
    "lang": "en",
    "follow_request_sent": false,
    "default_profile_image": false,
    "created_at": "Sun Dec 27 21:29:09 +0000 2009",
    "profile_background_image_url": "http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png",
    "time_zone": "Istanbul",
    "favourites_count": 11,
    "profile_link_color": "0084B4"
    },
    "favorited": false,
    "created_at": "Sat Jun 30 22:14:54 +0000 2012",
    "in_reply_to_user_id_str": "261119681",
    "in_reply_to_screen_name": "salmamostafa90",
    "contributors": null,
    "place": null,
    "coordinates": null,
    "geo": null,
    "source": "web",
    "id_str": "219192312905990146",
    "id": 219192312905990146,
    "text": " \u0635\u0648\u0631\u0629 \u0644\u0642\u0641\u0627 .. \u062c\u0627\u0645\u062f\u0629 \u062c\u062f\u0627"
    },
    "tar

どんな助けでも大歓迎です。

よろしく。

4

1 に答える 1

1

これはおそらく PHP の書き込みバッファの問題であり、実際にファイルに書き込む前に、一定量のデータが受信されるまで待機します。以下を使用して、これを回避できる場合がありますstream_set_write_buffer

$fp2 = fopen('file:///Users/KareemYousrii/dump.txt', "r+");
stream_set_write_buffer($fp2, 0);
$ch = curl_init();
于 2012-07-27T02:02:25.023 に答える