6

私はこの質問に対する答えを見つけることに完全に失敗しました。うまくいけば、ここの誰かが助けてくれるでしょう。

ユーザーが画像をヒットしたときに画像を自動的にインポートして処理する PHP スクリプト (具体的には WordPress テンプレート) があります。問題は、特に複数のユーザーが同時にテンプレートにアクセスして画像処理を開始する場合、画像処理が大量のメモリを消費することです。このため、サーバーが何度もクラッシュしました。

これに対する私の解決策は、画像処理機能が既に実行されている場合は実行しないことでした。関数の実行を開始する前に、image_import_running という名前のデータベース エントリが false に設定されているかどうかを確認します。そうであれば、関数は実行されました。関数が最初に行ったことは、image_import_running を true に設定することでした。その後、すべてが終了したら、false に戻します。

理論的にはうまくいきました。それ以来、サイトはクラッシュしていません。しかし、これには次の 2 つの大きな問題があります。

  1. 読み込み中にユーザーがページを閉じた場合、スクリプトは画像の処理を終了しないため、image_import_running を false に戻すことはありません。テンプレートは、手動で false に設定されるまで、画像を再度処理することはありません。

  2. 画像の処理中にスクリプトがタイムアウトした場合 (キューに多くの画像がある場合は可能性が高い)、本質的には 1 と同じ問題があります。間違い。

No. 1 (私が気付いた 2 つの問題のうち最初の 1 つ) を処理するignore_user_abort(true)ために、スクリプトに追加しました。うまくいきましたか?No. 2 はまだ問題なのでわかりません。それが私が困惑しているところです。

スクリプトが実行されているかどうかをサーバーに問い合わせることができれば、次のようなことができます。

if($import_running && $script_not_running) {
    $import_running = false;
}

しかし、どうすればその$script_not_running変数を設定できますか? 私を殴る。

他に素晴らしい解決策がある場合に備えて、このストーリー全体を共有しました.

4

7 に答える 7

1

使用してみる ignore_user_abort(true);と、その人がブラウザを離れて閉じても実行し続けます。

また、db レコードに true false の代わりに数字を入れて、一緒に実行できるプロセスの最大数を設定することもできます。

于 2013-08-08T03:59:39.403 に答える
1

保留中のフラグを立ててジョブをデータベースに保存し、一度に1つのジョブの処理を実行するようにcronジョブを設定します。

于 2013-11-22T16:06:17.983 に答える
1

操作を抑制する有効期限のあるトランジェントを設定するのはどうですか?

if(!get_transient( 'import_running' )) {
  set_transient( 'import_running', true, 30 ); // set a 30 second transient on the import.
  run_the_import_function();
}
于 2013-09-20T17:27:08.683 に答える
0

私にとっては、この単純なアイデアをテキスト ドキュメントで使用します。たとえば
、トップ スクリプトの run.txt ファイルでは次のように使用します。

if((file_get_contents('run.txt') != 'run'){ // here the script will work
$file = fopen('run.txt', 'w+');
fwrite($file, 'run');
fclose('run.txt');
}else{
exit(); // if it find 'run' in run.txt the script will stop
}

これをスクリプトファイルの最後に追加します

$file = fopen('run.txt', 'w+');
fwrite($file, ''); //will delete run word for the next try ;)
fclose('run.txt');

実行ワードが存在するかどうかを確認することで、スクリプトが既に機能しているかどうかを確認しrunt.txtます。実行されません
run.txt

于 2013-08-08T19:40:23.360 に答える
0

cron を実行することは、間違いなくより良い解決策です。URL をテーブルに格納するというアイデアは良いアイデアです。

元の質問に答えるには、 ps auxwww コマンドを exec で実行し (このページを確認してください: PHP exec() を使用して実行中の php スクリプトのリストを取得する方法は? )、別の php ファイルに関数を移動します。

exec("ps auxwww|grep myfunction.php|grep -v grep", $output);
于 2013-08-30T07:14:56.063 に答える
-2

スクリプトの先頭に次を追加するだけです。

<?php
    // Ensures single instance of script run at a time.
    $fileName = basename(__FILE__);
    $output = shell_exec("ps -ef | grep -v grep | grep $fileName | wc -l");
    //echo $output; 
    if ($output > 2)
    {
        echo "Already running - $fileName\n";
        exit;   
    }

    // Your php script code.
?>
于 2016-09-28T06:53:41.687 に答える