たとえば、携帯電話にテキスト メッセージを一括送信する関数を作成する必要がある場合、for ループを使用して実行すると、テキスト メッセージの数が多い場合、時間がかかるだけでなく、しかし、成功率も非常に低いです。
そこで、PHP と MySQL を使用してメッセージ キューを実装し、テキスト メッセージを 1 つずつ送信することを考えました。
まず、次のフィールドを含むデータ テーブル sms を作成します:
id,
phone, //携帯電話番号
content //SMS コンテンツ
テキスト メッセージと携帯電話番号を保存します。 SMSテーブルを送信する必要があります。
実装されたコードは次のとおりです:
<?php
while(true){
}
echo '送信完了しました! ';
?>
たとえば、バックグラウンドに送信ボタンがあります。これをクリックすると、上記のプログラムが実行されます。10 秒ごとにデータベースからデータが取得され、テキスト メッセージが送信されるとします。
問題: ページをクリックし続けて送信が完了するまで待ってから離れるのではなく、送信ボタンをクリックしてから他のページを直接クリックして別の作業を行うと、上記のプログラムが実行を続けます。または、他のページに移動すると、ループが飛び出してテキスト メッセージが送信されません。
PHP はシングルスレッドです。つまり、実行を開始するときは、完全に実行されるまで待つか、事前に中断する必要があります。同時に 2 つのアクセスを実行することはできません。ボタンをクリックした後に非同期で処理し、他の処理に直接ジャンプする必要がある場合は、非同期で処理したい処理を行うための swoole サービスが必要です。
この場合、バックグラウンド Web ページに置かずに、コマンドライン モードで直接実行してください。次に、データがないときに終了するトップコードは、一定期間スリープするように変更されます。
PHP-Cli モードを見てみましょう。 MOOC.com にビデオがあり、MySQL はキューを介した電子メールの送信をシミュレートしており、その効果は主な質問と同様です。
元の投稿者のphp+mysqlは正しいと思いますが、cronジョブを使用する必要があります。 cron ジョブは、XX 秒ごとにスクリプトが実行されるように設定します。
crontab を諦めなければならない場合。次に、次のコードをお勧めします
リーリー