4

私は会社のCMSをプラグインする必要があるメール送信システムに取り組んでいます。管理者がブラウザをナビゲートしたり閉じたりしながら、メール送信者スクリプトをバックグラウンドで実行する方法を探しています。

ignore_user_abort()タイムアウトした場合でもページを実行し続けるために必要なという名前のPHP関数を見つけました。

これで、「スクリプトを開始する」ための3つの解決策があります。

  1. iframeを使用できます

  2. 以前に非常に早くタイムアウトするように構成したAjax呼び出しを使用できます。例:jQueryフレームワークの使用:$.ajaxSetup({ timeout: 1000 });

  3. cronジョブを使用することもできますが、これらは「仮想」であり、そのサーバー上で不安定であるため、このソリューションは避けたいと思います。

他に解決策はありますか?私はiframeソリューションが本当に好きではありませんが、すでにAjaxアップローダースクリプトでそれらを使用しています。

管理者がF5を押して、その2番目のインスタンスを開始することを望んでいません。

同社のユーザーは、Firefoxを使用してCMSにのみログインするように言われています。ありがとうございました

4

3 に答える 3

11

を使用して、バックグラウンドでPHPスクリプトを実行できますExec()

php docsは、それを行う方法の例を提供します。

function execInBackground($cmd) { 
    if (substr(php_uname(), 0, 7) == "Windows"){ 
        pclose(popen("start /B ". $cmd, "r"));  
    } 
    else { 
        exec($cmd . " > /dev/null &");   
    } 
}
于 2010-11-12T15:51:12.993 に答える
0

私があなたなら、これを行うためのバックグラウンドデーモンを作成します。元のHTTP呼び出しですべての電子メールをデータベースに保存し、バックグラウンドで常に実行されているスクリプトを使用して、たとえば30秒ごとに、保留中の電子メールがあるかどうかを確認してから送信します。

これにより、キューにメールを追加するときに重複をチェックすることもできるため、複数の追加について心配する必要はありません。


編集cronジョブを使用しない理由(つまり、サーバーへのシェルアクセスがない)を考えると、このアプローチは使用しません。

代わりに、PHPがすべての電子メールをデータベースに挿入し、Javascriptにキーを返す最初のAJAX呼び出しを行います。次に、そのキーを使用してJavascriptを呼び出し、PHPが電子メールを5秒間処理してから、残りの電子メールの数をブラウザーに返します。次に、メールがなくなるまでJavascriptにこのリクエストを繰り返してもらいます。

これには、進行状況の通知があり、何らかの理由でサーバーがクラッシュした場合に、電子メールを回復できるという追加の利点があります。

于 2010-11-12T15:57:19.027 に答える
0

ブラウザを閉じたからといって、phpによって開始されたスクリプトの実行が停止することはありません。ですから、私が見ているように、これを行うにはいくつかの方法があります。

  1. サーバーにPOSTを送信して、何らかのアクションを実行するように指示すると、スクリプトは終了するまで実行されます。ページをリロードすると、データの再送信などが必要になることをブラウザに警告します。これを防ぎ、スクリプトの実行中に他のことを実行できるように、JavaScriptを使用して非同期でPOSTを実行できます。ここで注意すべきことの1つは、スクリプトの実行時間が制限される可能性があることです。

  2. POSTをスクリプトに送信します。スクリプトは、同じことを実行するバックグラウンドシステムプロセスを開始します。しかし、データベースなどのどこかに状態を保存しない限り、進行状況を確認することはできません。

  3. cron(すでにこのオプションを検討しているようです)

于 2010-11-12T15:58:36.427 に答える