2

私は PHP で Web サイトを持っており、ユーザーはメッセージの送信をスケジュールできます。次のようなコマンドでメッセージを送信できます。

php sendMsg.php 249

number はメッセージの ID です。

多くの人が cron ジョブの使用を提案しましたが、私はこれを一定間隔で実行したくないので、cron はオプションではありません (一度だけ - たとえば 3 時間後)。私の考えは次のとおりです。

$seconds = $hours*60*60;
exec('sleep '.$seconds.'; php sendMsg.php 249');

しかし、これはphpをさらに実行するためにブロックするため、うまくいきません。これを達成する最も簡単な方法は何ですか?

4

5 に答える 5

3

メッセージを1回だけ送信したいので、cronジョブを使用したくないとおっしゃいましたが、これは、この種のタスク用にcronジョブが作成される方法を誤解しています。

多くのユーザーがさまざまな時点で送信される多くのメッセージを作成している状況を考えてみます。

これらのメッセージごとに、サーバー上でPHPプログラムを常に実行する必要はありません。sleep()サーバーリソースがすべてその期間だけ使用されていたとしても、サーバーリソースを浪費することになります。

代わりに、cronジョブを使用して、短命のPHPプログラムを1分に1回(または適切な間隔で)実行します。

あなたのメッセージ作成プログラムは、メッセージを実際に送信するようには書かれていません。代わりに、送信する必要のある時間とともに、データベースに挿入します。

一方、cronjob PHPプログラムは、このデータベースを毎分スキャンして、送信する予定であるがまだ送信されていないメッセージがあるかどうかを確認します。次に、それらのメッセージを送信し、DB上で「送信済み」としてマークします。

これはこの種のことを書くための標準的な方法なので、人々があなたにそれを勧めているのは当然のことです。

このようにすることは、システム上で必要以上にプログラムを実行することがないことを意味します。どちらのPHPプログラムも、すばやく機能して終了します。つまり、誰もそれらを待ち続けることはありません。

また、はるかに堅牢になります。サーバーを再起動する必要がある場合を想像してみてください。たくさんのPHPプログラムを何時間も実行して、メッセージを送信する瞬間を待っていると、それらはすべて失われます。一方、メッセージをDBに保存した場合、サーバーが再起動されると、cronジョブはそれらを検出し、正しく送信します。

于 2013-02-13T16:22:15.640 に答える
-1

cron の提案は無視してください。単純に一定期間待ちたい場合は、atスケジューラを使用してください。

$hours = 2;
$command = sprintf('echo "php sendMsg.php 249" | at now + %d hours', $hours);
exec($command);
于 2013-02-13T16:29:02.890 に答える