私はいくつかのバックエンド処理を実行するphpスクリプトをコーディングしており、8時間程度ごとに実行する必要があります。スクリプトの実行には時間がかかります。なんと、ブラウザから試してみたところ、スクリプトが終了するかなり前にサーバーへの接続がリセットされました。私の質問は-私がそれを直接実行するかどうか、すなわち。cronジョブとしてのphp-afile.php、実行に内部時間の制約はありますか?このスクリプトは完了するまでに2〜5分かかる場合があり、中断することはできません。私はこれまでこれを行ったことがないので、重いスクリプトを実行するときにphpに癖があるかどうかはわかりません。
3 に答える
前述のように、CLI スクリプトにはデフォルトで時間制限がありません。
しかし、cron ジョブのアプローチに代わる方法についても言及したいと思います。Web
サーバーの制御下で、PHP スクリプトから CLI PHP スクリプトをフォークできます。私はこれを何度もやりました。これは、Web サイトのユーザー アクション (非常に大きなアーカイブ ファイルを作成し、ファイルが完成したときに電子メールでダウンロード リンクを送信するなど) によってトリガーする必要がある実行時間の長いスクリプトがある場合に特に便利です。通常、popen() 関数を使用して Web サーバーの PHP スクリプトから CLI スクリプトをフォークします。これにより、次のようにパラメーターを新しいスクリプト インスタンスに適切に転送できます。
$bgproc = popen('php "/my/path/my-bckgrnd-proc.php"', 'w');
if($bgproc===false){
die('Could not open bgrnd process');
}else{
// send params through stdin pipe to bgrnd process:
$p1 = serialize($param1);
$p2 = serialize($param2);
$p3 = serialize($param3);
fwrite($bgproc, $p1 . "\n" . $p2 . "\n" . $p3 . "\n");
pclose($bgproc);
}
CLI スクリプトでは、これらのパラメータを次のように受け取ります...
$fp = fopen('php://stdin', 'r');
$param1 = unserialize(fgets($fp));
$param2 = unserialize(fgets($fp));
$param3 = unserialize(fgets($fp));
fclose($fp);
...そして、ウェブサーバーの制御下で時間がかかるようなことは何でもします。
この手法は、*nix 環境でも Windows 環境でも同様に機能します。
いいえ、コマンド ラインから php を実行する場合、php 自体に時間制限はありません。
ただし、mysql への接続など、他のタイムアウトが発生する可能性があります。そのため、コードに mysql 接続がある場合は、接続を維持するか、コードを実行するのに十分な値に mysql タイムアウトを設定してください。別のこと: いくつかの Web ホスティング プロバイダーが、数分以上実行されている php アプリを強制終了しているのを見てきました。そのため、プロバイダーがそうしないようにしてください。
デフォルトでは、PHP スクリプトは 30 秒後にタイムアウトになりますが、PHP.ini を編集するか、これをスクリプトの先頭に追加することでオーバーライドできます。
set_time_limit(0);
これにより、スクリプトの実行時間が無制限に設定されます。つまり、スクリプトの実行が終了するか、サーバーがダウンするか、ファイルが削除されるか、致命的なエラーが発生しない限り、終了しません。
さらに、
これをスクリプトに追加してブラウザで開いてスクリプトを開始すると、ブラウザでスクリプトを開いてブラウザを開いたままにしているかのように実行されます。
ignore_user_abort();
バックグラウンドでスクリプトを実行するだけです。これらは両方ともあなたにとって役に立ちます。
ADD : スクリプトがコマンドライン、Cli から実行される場合、デフォルトのタイムアウトは 0 です。(タイムアウトなし)