4

これが私のコードです

 $url = "partial_response.php";
 $sac_curl = curl_init();
 curl_setopt($sac_curl, CURLOPT_HTTPGET, true);
 curl_setopt($sac_curl, CURLOPT_URL, $url);
 curl_setopt($sac_curl, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($sac_curl, CURLOPT_HEADER, false);
 curl_setopt($sac_curl, CURLOPT_TIMEOUT, 11);
 $resp = curl_exec($sac_curl); 
 curl_close($sac_curl);
 echo $resp;

Partial_response.php

header( 'Content-type: text/html; charset=utf-8' );
echo 'Job waiting ...<br />';
for( $i = 0 ; $i &#60; 10 ; $i++ )
{
echo $i . '<br/>';
flush();
ob_flush();
sleep(1);
}
echo 'End ...<br/>';

about コードから、partial_response.php から部分応答を取得しようとしています。私が望むのは、partial_response.php がループを完了してデータ全体を返すのを待つのではなく、curl が「ジョブ待機中..」を返す必要があるということです。そのため、CURLOPT_TIMEOUT を 11 未満に減らすと、まったく応答がありません。私の疑問を明確にしてください。前もって感謝します。

4

3 に答える 3

2

後で、cURL は自分のやりたいことを実行できないことに気付きました stream_context_get_optionshttp://www.php.net/manual/en/function.stream-context-get-options.phpです。

于 2013-08-21T13:15:43.860 に答える
1

タイムアウトについてはわかりませんが、CURLOPT_WRITEFUNCTION フラグを使用して、cURL を使用して部分的な応答を取得できます。

curl_setopt($ch, CURLOPT_WRITEFUNCTION, $callback);

はCurl$chハンドラ、$callbackはコールバック関数名です。このコマンドは、リモート サイトから応答データをストリーミングします。コールバック関数は次のようになります。

$result = '';
$callback = function ($ch, $str) {
    global $result;
    //$str has the chunks of data streamed back. 
    $result .= $str;
    // here you can mess with the stream data either with $result or $str.
    // i.e. look for the "Job waiting" string and terminate the response.
    return strlen($str);//don't touch this
};

最後に中断されない場合$result、リモート サイトからのすべての応答が含まれます。

したがって、すべてを組み合わせると、次のようになります。

$result = '';
$callback = function ($ch, $str) {
    global $result;
    //$str has the chunks of data streamed back. 
    $result .= $str;
    // here you can mess with the stream data either with $result or $str.
    // i.e. look for the "Job waiting" string and terminate the response.
    return strlen($str);//don't touch this
};

$url = "partial_response.php";
$sac_curl = curl_init();
curl_setopt($sac_curl, CURLOPT_HTTPGET, true);
curl_setopt($sac_curl, CURLOPT_URL, $url);
curl_setopt($sac_curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($sac_curl, CURLOPT_HEADER, false);
curl_setopt($sac_curl, CURLOPT_TIMEOUT, 11);
curl_setopt($ch, CURLOPT_WRITEFUNCTION, $callback);
curl_exec($sac_curl); // the response is now in $result.
curl_close($sac_curl);
echo $result;
于 2020-05-08T10:48:10.400 に答える
1

いいえ、そうではありません。少なくとも私が知っていることはありませんが、これは単純に PHP が同期言語であるためです。つまり、タスクを「スキップ」することはできません。(curl_exec()つまり、リクエストが完了するまで常に - 何があっても - 実行されます)

于 2013-05-14T15:50:44.797 に答える