6

最大 5 時間実行される別の PHP スクリプト「B」を開始する PHP スクリプト「A」があります。そのためにcurl関数を使用します。しかし、私の問題は、スクリプト「A」がスクリプト「B」への接続を確実に保持していないことです。max_execution_time、timeout、socket-timeout などを変更しましたが、何も役に立ちません。

curl などでスクリプト「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);

`

4

3 に答える 3

1

If the script "B" takes long time to finish it could be useful to put during the execution some echo "something"; flush(); that mantain the connection alive.

It happens to me recently on a similar execution.

于 2012-11-24T11:23:55.090 に答える
0

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

于 2012-11-24T15:27:20.917 に答える
0

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

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

次に、スクリプト A は、エコー インターフェイスを呼び出して、その 5 時間のスクリプト C の進行状況を呼び出すことができます。これをスクリプト D と呼びましょう。これは、データベースまたはファイルを読み取り、スクリプト C がそのタスクをどの程度実行したかを追跡します。

于 2012-11-26T08:13:58.983 に答える