問題
送信すると、送信された情報を処理してデータベースに挿入し、通知Webサイトに表示するための基本的なコードを実行するフォームがあります。さらに、これらの通知を電子メールおよびSMSメッセージで受信するようにサインアップした人々のリストがあります。このリストは今のところささいなことです(プッシュするのは約150)が、サブスクライバーのテーブル全体を循環して150通以上の電子メールを送信するには、1分以上かかる場合があります。(メールは大量メールポリシーのため、メールサーバーのシステム管理者からの要求に応じて個別に送信されます。)
この間、アラートを投稿した個人はフォームの最後のページに1分間ほど座って、通知が投稿されているという明確な補強はありません。これは他の潜在的な問題を引き起こし、私が考えている解決策はすべて理想的ではないと感じています。
まず、投稿者はサーバーが遅れていると考えて、もう一度[送信]ボタンをクリックすると、スクリプトが最初から実行されるか、2回実行される可能性があります。JavaScriptを使用してボタンを無効にし、「Processing ...」のようなテキストを置き換えることでこれを解決できますが、スクリプトの実行中はユーザーがページにとどまるため、これは理想的とは言えません。(また、JavaScriptが無効になっている場合でも、この問題は依然として存在します。)
次に、ポスターはフォームを送信した後、途中でタブまたはブラウザを閉じる可能性があります。スクリプトは、ブラウザに書き戻すまでサーバー上で実行され続けますが、ユーザーが(スクリプトの実行中に)ドメイン内の任意のページを参照すると、スクリプトが終了するまでブラウザはページの読み込みを停止します。 。(これは、ブラウザーアプリケーション全体ではなく、ブラウザーのタブまたはウィンドウが閉じている場合にのみ発生します。)それでも、これは理想的とは言えません。
(可能)解決策
スクリプトの「メール」の部分を、通知が投稿された後に呼び出すことができる別のファイルに分割することにしました。通知が正常に投稿された後、これを確認ページに表示することを当初は考えていました。ただし、ユーザーはこのスクリプトが実行されていることを知らないため、異常は明らかではありません。このスクリプトは失敗しません。
しかし、このスクリプトをバックグラウンドプロセスとして実行できるとしたらどうでしょう。だから、私の質問はこれです:バックグラウンドサービスとしてトリガーするPHPスクリプトを実行して、ユーザーがフォームレベルで行ったこととは完全に独立して実行するにはどうすればよいですか?
編集:これは croned することはできません。フォームが送信された瞬間に実行する必要があります。これらは優先度の高い通知です。さらに、サーバーを実行しているシステム管理者は、cronが5分を超えて実行されることを許可していません。
exec()
、私はこれを試したことはありません。
ajax
しsleep()
、ループ内に時間間隔を置いて挿入し(私の場合はforeachを使用)、バックグラウンドプロセスを実行します。それは私のサーバーで完全に動作します。他についてはわかりません。また、ループの前にignore_user_abort()
とset_time_limit()
(計算された終了時間を使用して)を追加して、使用しているサーバーによってスクリプトが停止しないことを確認しています。私のテストによると、スクリプトはignore_user_abort()
となしでタスクを完了していますset_time_limit()
。
gearman
phpでバックグラウンドタスクを処理するために使用します。時間のかかる処理と重い負荷に遭遇した場合は、拡張するのに最適です。調べてみてください。