[解決済み] フォームが送信された後、バックグラウンドでPHPスクリプトを実行するにはどうすればよいですか?
質問
問題点
フォームを送信すると、基本的なコードが実行され、送信された情報を処理してデータベースに挿入し、通知用のWebサイトに表示させることができます。さらに、電子メールと SMS メッセージでこれらの通知を受け取るためにサインアップした人々のリストがあります。このリストは、今のところ些細なものですが(約150人)、購読者のテーブル全体を循環させ、150以上の電子メールを送信するのに1分以上かかるほどです。(大量電子メール ポリシーのため、電子メール サーバーのシステム管理者が要求したように、電子メールは個別に送信されます。)
この間、警告を投稿した個人は、通知が投稿されているという肯定的な強化がないまま、ほぼ 1 分間、フォームの最後のページに表示されます。これは、他の潜在的な問題にもつながりますが、どれも理想的とは言えないと感じる可能性のある解決策を有しています。
-
まず、投稿者はサーバーが遅延していると考え、「投稿」ボタンを再度クリックし、スクリプトが最初からやり直されるか、2 回実行されるかもしれません。JavaScript を使用してボタンを無効にし、テキストを「Processing...」のように置き換えることでこれを解決できますが、ユーザーがスクリプトの実行時間の間、ページ上で立ち往生することになるので、これはあまり理想的ではありません (また、JavaScript を無効にしても、この問題はまだ存在します)。(また、JavaScriptが無効になっている場合も、この問題はまだ存在します)。
-
第二に、投稿者はフォームを送信した後、タブまたはブラウザを早々に閉じるかもしれません。スクリプトは、ブラウザに書き戻そうとするまでサーバー上で実行され続けますが、ユーザーが (スクリプトがまだ実行されている間に) 私たちのドメイン内の任意のページを参照すると、スクリプトが終了するまでブラウザはページの読み込みを停止します。(この現象は、ブラウザのタブやウィンドウが閉じられた場合にのみ発生し、ブラウザアプリケーション全体が閉じられた場合には発生しません)。それでも、これは理想的ではありません。
(可能な)解決策
私は、スクリプトの "email" の部分を、通知が投稿された後に呼び出すことができる別のファイルに分割することにしました。私はもともと、通知が正常に投稿された後の確認ページにこれを置くことを考えました。しかし、ユーザーはこのスクリプトが実行されていることを知らないので、異常があっても明らかになりません。このスクリプトは失敗できません。
しかし、このスクリプトをバックグラウンド プロセスとして実行できるとしたらどうでしょうか。そこで、私の質問はこうです。バックグラウンド サービスとしてトリガーする PHP スクリプトを実行し、ユーザーがフォーム レベルで行ったことから完全に独立して実行するにはどうしたらよいでしょうか。
EDIT。 これは はできません をクーロンで実行することはできません。フォームが送信された瞬間に実行されなければなりません。これらは優先度の高い通知です。さらに、私たちのサーバーを実行しているシステム管理者は、クーロンが5分以上の頻度で実行されることを禁止しています。
どのように解決するのですか?
いくつかの実験をして
exec
と
shell_exec
私は完璧に機能する解決策を発見しました! 私は
shell_exec
を使うことにしたので、起こる(あるいは起こらない)すべての通知プロセスを記録することができます。(
shell_exec
は文字列として返すので、これは
exec
を使い、出力を変数に代入し、ファイルを開いて書き込むよりも簡単でした)。
メールスクリプトを起動するために以下の行を使用しています。
shell_exec("/path/to/php /path/to/send_notifications.php '".$post_id."' 'alert' >> /path/to/alert_log/paging.log &");
ここで重要なのは
&
に注目することが重要である(@netcoderの指摘による)。この UNIX コマンドはバックグラウンドでプロセスを実行します。
スクリプトへのパスの後に一重引用符で囲まれた余分な変数が設定されています。
$_SERVER['argv']
変数として設定され、スクリプト内で呼び出すことができます。
メールスクリプトはログファイルに出力します。
>>
を使ってログファイルに出力し、このように出力されます。
[2011-01-07 11:01:26] Alert Notifications Sent for http://alerts.illinoisstate.edu/2049 (SCRIPT: 38.71 seconds)
[2011-01-07 11:01:34] CRITICAL ERROR: Alert Notifications NOT sent for http://alerts.illinoisstate.edu/2049 (SCRIPT: 23.12 seconds)
関連
-
[解決済み】接続の取得に失敗しました: php_network_getaddresses: getaddrinfo failed: 名前またはサービスが不明
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] シェルスクリプトでブール変数を宣言して使用するにはどうすればよいですか?
-
[解決済み] PHPでユーザー入力をサニタイズするにはどうすればよいですか?
-
[解決済み] PHPのセッションを30分後に失効させるにはどうしたらいいですか?
-
[解決済み] Bashスクリプトで、ある条件が発生したらスクリプト全体を終了させるにはどうしたらいいですか?
-
[解決済み] Bashで現在の作業ディレクトリをスクリプトのディレクトリに設定するにはどうすればよいですか?
-
[解決済み] スクリプターによるウェブサイト叩きを阻止する
-
[解決済み】PowerShellスクリプトを実行する方法
-
[解決済み】bash/sedスクリプトを使用してテキストファイルの最初の行を削除するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】XAMPPポート80をPID 4の「Unable to open process」が使用中 [重複] XAMPPポート80をPID 4の「Unable to open process」が使用中。]
-
[解決済み] SAJAXは死んだか?何を置き換えるべきか?
-
[解決済み】pdo - 非オブジェクトのメンバー関数prepare()への呼び出し【重複】。
-
[解決済み】foreach()に与えられた引数が無効です。)
-
[解決済み】警告:mysql_fetch_array()はパラメータ1がリソースであることを期待、ブール値は[重複]で与えられる]
-
[解決済み] * vchiqインスタンスを開くのに失敗しました。
-
[解決済み] 入力ファイルが指定されていない
-
[解決済み] PHPの配列を別の配列にコピーする関数はありますか?
-
[解決済み] $_SERVER['DOCUMENT_ROOT'] と $_SERVER['HTTP_HOST'] の違いについて
-
[解決済み】phpでバックグラウンドプロセスを実行する