1. ホーム
  2. php

[解決済み] フォームが送信された後、バックグラウンドでPHPスクリプトを実行するにはどうすればよいですか?

2022-11-05 06:57:22

質問

問題点

フォームを送信すると、基本的なコードが実行され、送信された情報を処理してデータベースに挿入し、通知用のWebサイトに表示させることができます。さらに、電子メールと SMS メッセージでこれらの通知を受け取るためにサインアップした人々のリストがあります。このリストは、今のところ些細なものですが(約150人)、購読者のテーブル全体を循環させ、150以上の電子メールを送信するのに1分以上かかるほどです。(大量電子メール ポリシーのため、電子メール サーバーのシステム管理者が要求したように、電子メールは個別に送信されます。)

この間、警告を投稿した個人は、通知が投稿されているという肯定的な強化がないまま、ほぼ 1 分間、フォームの最後のページに表示されます。これは、他の潜在的な問題にもつながりますが、どれも理想的とは言えないと感じる可能性のある解決策を有しています。

  1. まず、投稿者はサーバーが遅延していると考え、「投稿」ボタンを再度クリックし、スクリプトが最初からやり直されるか、2 回実行されるかもしれません。JavaScript を使用してボタンを無効にし、テキストを「Processing...」のように置き換えることでこれを解決できますが、ユーザーがスクリプトの実行時間の間、ページ上で立ち往生することになるので、これはあまり理想的ではありません (また、JavaScript を無効にしても、この問題はまだ存在します)。(また、JavaScriptが無効になっている場合も、この問題はまだ存在します)。

  2. 第二に、投稿者はフォームを送信した後、タブまたはブラウザを早々に閉じるかもしれません。スクリプトは、ブラウザに書き戻そうとするまでサーバー上で実行され続けますが、ユーザーが (スクリプトがまだ実行されている間に) 私たちのドメイン内の任意のページを参照すると、スクリプトが終了するまでブラウザはページの読み込みを停止します。(この現象は、ブラウザのタブやウィンドウが閉じられた場合にのみ発生し、ブラウザアプリケーション全体が閉じられた場合には発生しません)。それでも、これは理想的ではありません。

(可能な)解決策

私は、スクリプトの "email" の部分を、通知が投稿された後に呼び出すことができる別のファイルに分割することにしました。私はもともと、通知が正常に投稿された後の確認ページにこれを置くことを考えました。しかし、ユーザーはこのスクリプトが実行されていることを知らないので、異常があっても明らかになりません。このスクリプトは失敗できません。

しかし、このスクリプトをバックグラウンド プロセスとして実行できるとしたらどうでしょうか。そこで、私の質問はこうです。バックグラウンド サービスとしてトリガーする PHP スクリプトを実行し、ユーザーがフォーム レベルで行ったことから完全に独立して実行するにはどうしたらよいでしょうか。

EDIT。 これは はできません をクーロンで実行することはできません。フォームが送信された瞬間に実行されなければなりません。これらは優先度の高い通知です。さらに、私たちのサーバーを実行しているシステム管理者は、クーロンが5分以上の頻度で実行されることを禁止しています。

どのように解決するのですか?

いくつかの実験をして execshell_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)