2012-11-24 29 views
6

私は5時間まで実行する別のPHPスクリプト "B"を起動するPHPスクリプト "A"を持っています。私はそのためにカール関数を使用します。しかし、私の問題は、スクリプト "A"がスクリプト "B"への接続を保持していないことです。 max_execution_time、timeout、socket-timeoutなどを変更しましたが、何も役に立ちません。接続キープアライブ問題

スクリプト "B"にカールなどでヘッダを送る必要がありますか?

$curl_header[] = "Accept: text/xml,application/xml,application/xhtml+xml,text 
/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"; 
$curl_header[] = "Cache-Control: max-age=0"; 
$curl_header[] = "Connection: keep-alive"; 
$curl_header[] = "Keep-Alive: 84600"; 

$url = 'http://test.de/test_B.php'; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'); 
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $curl_header); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 300); 
curl_setopt($ch, CURLOPT_TIMEOUT, 84600); 
curl_setopt($ch, CURLOPT_NOSIGNAL, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_URL, $url); 
$result = curl_exec($ch); 
$curl_errno = curl_errno($ch); 
curl_close($ch); 

`

+1

いくつかのコードを貼り付けますか? – GBD

+0

呼び出し元のPHPスクリプト自体がタイムアウトしていますか?呼び出し元のsciptのmax_execution時間を0にしましたか?また、低い転送速度を設定していますか?部分応答(空白を含む)が得られた場合、何も返されない場合、CURLOPT_LOW_SPEED_TIMEが入りますか? – Robbie

答えて

1

スクリプト「B」は、生きている接続をmantainいくつかecho "something"; flush();実行中に置くことが有用である可能性を完了するのに長い時間がかかる場合。

私は最近、同様の実行で私に起こります。

0

スクリプトBの出力をどこかに保存し、5時間後に接続して確認します。 HTTPサーバーはこれらの時間に合わせて設計されておらず、あらゆる種類のタイムアウトが発生する可能性があります。

0

次のアーキテクチャを使用することができます。

スクリプトAは、バックグラウンドでシェル要求を経由してスクリプトCを実行し、いくつかのidentificatorを返すスクリプトBを呼び出します。基本的に、スクリプトBはバックグラウンドで動作する5時間のジョブを開始するだけで、接続を維持する必要はありません。進捗状況をデータベースまたは一部のファイルに保存できます。

次に、スクリプトAは、エコーインターフェイスを呼び出すことで、その5時間のスクリプトCの進捗状況を呼び出すことができます。スクリプトDを呼び出して、データベースまたはファイルを読み込み、スクリプトCのタスクの経過時間をトレースします。