Sebagai contoh, jika anda perlu mencipta fungsi untuk menghantar mesej teks telefon mudah alih secara berkelompok, jika anda menggunakan gelung for untuk melakukannya, apabila bilangan mesej teks adalah besar, ia bukan sahaja akan memakan masa, tetapi juga mempunyai kadar kejayaan yang sangat rendah.
Jadi saya terfikir untuk menggunakan PHP dan MySQL untuk melaksanakan baris gilir mesej dan menghantar mesej teks satu demi satu.
Pertama, buat jadual data sms, termasuk medan berikut:
id,
telefon, //Nombor telefon bimbit
kandungan //Kandungan SMS
Simpan mesej teks dan nombor telefon bimbit yang perlu dihantar ke dalam jadual sms.
Kod yang dilaksanakan adalah seperti berikut:
<?php
while(true){
$item = $db->getFirstRecord(); //獲取數(shù)據(jù)表第一條記錄
if(!$item){//如果隊(duì)列中沒(méi)有數(shù)據(jù),則結(jié)束定時(shí)器
break;
}
$res = $sms->send($item['phone'],$item['content']); //發(fā)送短信
if($res){
$db->deleteFristRecord(); //刪除發(fā)送成功的記錄
echo $item['phone'].'發(fā)送成功';
}else{
echo $item['phone'].'發(fā)送失敗,稍后繼續(xù)嘗試';
}
sleep(10); //每隔十秒循環(huán)一次
}
echo 'Hantar selesai! ';
?>
Sebagai contoh, terdapat butang hantar di latar belakang Mengkliknya mencetuskan pelaksanaan program di atas. Anggapkan setiap 10 saat sekeping data diambil daripada pangkalan data untuk menghantar mesej teks.
Masalah: Jika saya klik butang hantar dan kemudian terus klik pada halaman lain untuk melakukan perkara lain, daripada terus klik pada halaman dan menunggu sehingga penghantaran selesai sebelum keluar, program di atas akan terus dilaksanakan. Atau jika saya pergi ke halaman lain, gelung akan melompat keluar dan mesej teks tidak akan dihantar
PHP adalah satu-benang, iaitu, apabila anda memulakan pelaksanaan, anda mesti sama ada menunggu untuk ia dilaksanakan sepenuhnya atau mengganggunya terlebih dahulu. Anda tidak boleh melakukan dua akses pada masa yang sama. Jika anda perlu memproses secara tak segerak selepas mengklik butang dan melompat terus untuk melakukan perkara lain, maka anda memerlukan perkhidmatan swoole untuk mengendalikan perkara yang anda mahu proses secara tak segerak.
Dalam kes ini, jalankan terus dalam mod baris arahan tanpa meletakkannya pada halaman web latar belakang. Kemudian kod teratas yang keluar apabila tiada data ditukar kepada tidur untuk satu tempoh masa.
Anda boleh melihat mod PHP-Cli. Terdapat video di MOOC.com, MySQL mensimulasikan penghantaran e-mel melalui baris gilir, dan kesannya serupa dengan soalan utama.
Saya rasa php+mysql poster asal adalah betul, tetapi tugas cron masih perlu digunakan. Tugas cron adalah untuk menetapkan skrip untuk dilaksanakan setiap XX saat.
Jika anda terpaksa melepaskan crontab. Kemudian syorkan kod berikut
ignore_user_abort() //關(guān)掉瀏覽器,php腳本可以繼續(xù)執(zhí)行
set_time_limit(0) // 一直執(zhí)行下去
$item = $db->getFirstRecord(); //獲取數(shù)據(jù)表第一條記錄
if(!$item){//如果隊(duì)列中沒(méi)有數(shù)據(jù),則結(jié)束定時(shí)器
break;
}
$res = $sms->send($item['phone'],$item['content']); //發(fā)送短信
if($res){
$db->deleteFristRecord(); //刪除發(fā)送成功的記錄
echo $item['phone'].'發(fā)送成功';
}else{
echo $item['phone'].'發(fā)送失敗,稍后繼續(xù)嘗試';
}
sleep(10); //每隔十秒循環(huán)一次