2

curlこれを適応させるような、すでに開いているソケットを介して使用する方法があるのだろうか:

<?php
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET / HTTP/1.1\r\n";
    $out .= "Host: www.example.com\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}
?>

curl_exec()の代わりに使用するfgets($fp, 128)

curl()(または、常に同じストリームを使用する他の方法、私の目標は Twitter ストリーム API を読み取ることです)

ありがとうございました

4

2 に答える 2

2

Twitter Stream API を扱っているので、これでうまくいくかもしれません。

set_time_limit(0);
$ch = curl_init();
echo "<pre>";
curl_setopt($ch, CURLOPT_URL, "https://sitestream.twitter.com/2b/site.json");
curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'cgets');
curl_setopt($ch, CURLOPT_BUFFERSIZE, 128);
curl_setopt($ch, CURLOPT_USERPWD, 'user:password');
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 1000000);
curl_exec($ch);

function cgets($ch, $string) {
    $length = strlen($string);
    printf("Received %d byte\n", $length);
    flush();
    return $length;
}
于 2012-10-16T13:03:51.097 に答える
0

cURL で PHP の既存のソケットを強制的に使用する方法はありません。cURL は内部で接続をプールして再利用しますが、常に同じ接続を強制的に使用したり、開いた接続を決して閉じたりすることはできません。

Phirehose (ストリーミング API への PHP インターフェース) をチェックアウトするか、それで十分でない場合は、Twitter Librariesリストで買い物をしてください。おそらく、誰かが既に PHP で問題を解決し、パッケージ化している可能性があります。

それでも、ストリーム API を使用すると、PHP からすると奇妙に聞こえます。これは Web サーバー上にありますか、それともスタンドアロンの長時間実行スクリプトですか?

于 2012-10-16T12:19:39.690 に答える