7

たとえば、FastCGIサーバーは、set_time_limit()PHPで使用して変更できないPHPスクリプトに実行時間制限を課します。IISもこれを行っていると思います。

私は、mod_phpでうまく機能するが、FastCGI(mod_fcgid)で失敗する、PHPアプリケーションのインポートスクリプトを作成しました。これは、スクリプトが特定の秒数後に強制終了されるためです。この場合の制限時間を検出する方法はまだわかりません。また、どのように回避するかについても決定していません。リダイレクトを使用して小さなチャンクでそれを行うことは、1つの厄介なように見えますが、どのように?

インポートタスクやエクスポートタスクなど、特定の秒数後に個々のPHPスクリプトがサーバーによって終了される可能性がある、長時間実行されるタスクをコーディングする場合、どのような手法を使用しますか?

ポータブルスクリプトを作成していると仮定してください。そのため、PHPが最終的にmod_php、FastCGI、またはIISで実行されるかどうか、またはサーバーレベルで最大実行時間が適用されるかどうかは必ずしもわかりません。それはおそらくシェルスクリプトなども除外します。

4

3 に答える 3

4

Webサーバーによって課せられるスクリプトの時間制限の対象とならないPHPコマンドラインインターフェイスを使用します。スクリプトの実行を自動化する必要がある場合は、cronを使用してスクリプトをスケジュールできます。

于 2010-05-14T03:16:12.990 に答える
-1

あなたが本当に話しているのは、ジョブキューイングです。これは、フロントエンドリクエストから非同期でPHPコードを実行する方法です。PHPでそれを行う主な方法は2つあります。1つは、Gearmanと呼ばれるプログラムを使用することです。もう1つは、私が個人的によく知っているZendServerジョブキューを使用することです。DoyouQueueというブログ投稿があります。私が持っている実装は非常に使いやすいことがわかりました。

また、ロジックを実行する前にmax_execution_timeを0に設定することもお勧めします。

于 2010-05-14T12:32:32.507 に答える
-1

リダイレクトを使用して小さなチャンクでそれを行うことは、1つの厄介なように見えますが、どのように?

組み込みのエクスポートメカニズムがmax_execution_time制限に達し始めたとき、まさにそれが私が完全なフォーラムデータベースバックアップ(phpBB)を処理した方法です。

一度に1つのテーブルで、5000行のチャンクの大きなテーブルに対して実行しました。(プロセス全体の制限要因は、エクスポートの実行時間ではなく、実際にはphpmyadminがインポートで処理できるファイルサイズであることが判明しました。)

エクスポートの各チャンクの後、ヘッダーにメタリフレッシュタグが含まれるページを返し、次のブロックのテーブル番号とクエリ文字列の開始行を使用してスクリプトをそれ自体にリダイレクトします。

<?php if(!$all_done){
    $new_url=$_SERVER['PHP_SELF'].'?tablecount='.$count;
    if(!$tabledone && ""!=$start_row && null!=$start_row){
        $new_url.="&startrow=".$start_row;
    } else {
        $new_url.="&startrow=0";
    }
    echo('<meta http-equiv="refresh" content="0.5;url='.$new_url.'" />');
} ?>

カウンターは、SHOWTABLESで取得したテーブル名の配列を反復処理できるようにするためのものでした。

エクスポートから巨大な単語一致テーブル(phpBBがそれ自体で再構築できる)を選別する知恵を得る前に、このバックアップスクリプトは完了するのに30分以上かかりました。

于 2010-05-14T13:06:34.570 に答える