Rumah >pembangunan bahagian belakang >masalah PHP >Bagaimana untuk mencapai penerimaan automatik barangan dalam php

Bagaimana untuk mencapai penerimaan automatik barangan dalam php

藏色散人
藏色散人asal
2021-09-10 10:18:441924semak imbas

Cara merealisasikan penerimaan barangan secara automatik dalam PHP: 1. Tanya maklumat pesanan yang akan disahkan untuk penghantaran melalui tugas berjadual Linux 2. Simpan maklumat pesanan dalam redis;

Bagaimana untuk mencapai penerimaan automatik barangan dalam php

Persekitaran pengendalian artikel ini: sistem linux5.9.8, PHP versi 7.1, komputer DELL G3

Cara mencapai automatik penerimaan barang dengan php ?

PHP melaksanakan pengesahan automatik penerimaan pesanan e-dagang redis baris gilir

1 🎜> Untuk platform e-dagang yang kami bina sebelum ini, selepas menerima barangan, kebanyakan pengguna tidak akan mengambil inisiatif untuk mengklik untuk mengesahkan resit Akibatnya, apabila membayar kepada peniaga, yang Peniaga merungut macam-macam, jadi Mengikut permintaan, jika anda ingin membuat pesanan, resit akan disahkan secara automatik x hari selepas penghantaran. Apa yang dipanggil pengesahan automatik penerimaan pesanan bermakna melaksanakan kenyataan kemas kini pada masa tertentu untuk menukar status pesanan.

2. IdeaKaedah yang paling menyusahkan ialah menanyakan pesanan yang layak melalui tugas berjadual latar belakang Linux . Sebaik-baiknya, pendekatan ini akan berfungsi jika terdapat pesanan yang perlu dikemas kini setiap minit. Walau bagaimanapun, platformnya terlalu kecil, dan kebanyakan masa penghantaran penjual adalah intensif dan tidak akan berselerak setiap minit dalam 24 jam. Kemudian, untuk tugas yang dijadualkan, terdapat terlalu banyak pertanyaan dan ia tidak sesuai. Di sini, anda boleh menyimpan maklumat pesanan yang secara automatik akan mengesahkan penerimaan dalam media lain, seperti redis, memcache, rabbitmq, dan kemudian melaksanakan skrip untuk mendapatkan maklumat pesanan daripada media sebelumnya untuk pertimbangan Ini boleh mengurangkan pertanyaan tekanan pada pangkalan data.

Pengeluar baris gilir redisSehubungan itu, kami memilih untuk menggunakan tugas berjadual Linux pada pukul dua pagi setiap hari kepada Maklumat pesanan untuk mengesahkan resit disoal dan kemudian disimpan dalam redis Barisan gilir yang kami pilih pada redis dicirikan dengan keluar dahulu semasa membuat pertanyaan, data sebelumnya diisih mengikut masa penghantaran adalah yang pertama ditolak giliran mestilah pesanan yang paling hampir dengan masa penerimaan automatik yang ditentukan. Kodnya adalah seperti berikut

$successCount=0;
$failCount=0;
$screen_time = 3600*24*9;//设置筛选天数
$data = array();
$now_time = time();
//查询符合要求的数据
$sql="select id,send_time as deliver_time from `order` where is_send=1 and is_del=0 and is_cancel=0 and is_token=0 and send_time>0 and send_time + {$screen_time} < $now_time
order by send_time asc";
$res = $con->query($sql);
//当队列还有数据时将数据记录并清除
while($redis->LLEN(&#39;auto_recevice_order&#39;)){
$txt = &#39;执行时间:&#39;.date(&#39;Y-m-d H:i:s&#39;).&#39;,信息:&#39;.$redis->RPOP(&#39;auto_recevice_order&#39;);
file_put_contents(&#39;./autoToken/fail_log.txt&#39;,$txt."\r\n".PHP_EOL,FILE_APPEND);
$failCount++;
}
//重新填充数据进队列
while ($row = $res->fetch_assoc()) {
 $successCount++;
 $redis->LPUSH(&#39;auto_recevice_order&#39;,json_encode($row1));
}
 $con->close();
 $success=date(&#39;Y-m-d H:i:s&#39;).&#39;:[推送成功]:本次成功推送数据:&#39;.$successCount.&#39;条;记录上次处理失败数据:&#39;.$failCount."条\r\n";
 file_put_contents(&#39;./success_log.txt&#39;,$success."\r\n".PHP_EOL,FILE_APPEND);

Pengguna baris gilir RedisPengguna baris gilir tidak dilakukan melalui tugas berjadual Linux, tetapi Linux Skrin php mod cli melaksanakan skrip php Pengguna hanya perlu terus membaca maklumat pesanan daripada baris gilir, dan kemudian menentukan masa penghantaran dalam maklumat pesanan Jika keperluan untuk penerimaan automatik dipenuhi, penyata kemas kini dilaksanakan. Pada masa yang sama, jika masa penghantaran belum dicapai, dan jurang antara masa penghantaran dan masa penghantaran agak besar, anda boleh membiarkan skrip php tidur untuk beberapa kali nombor masa ini boleh diselaraskan oleh sendiri. Pesanan yang diperolehi yang tidak memenuhi keperluan masa perlu diset semula ke baris gilir redis, dan ia juga berada di bahagian atas baris gilir. Supaya anda boleh mendapatkannya lain kali. Kodnya adalah seperti berikut:

Untuk melaksanakan skrip php di sini, anda perlu menggunakan skrin Linux atau penyelia atau daemon nohup. Penggunaan khusus boleh didapati di Baidu Sebaik-baiknya mempunyai rekod log yang diperlukan dalam skrip yang sama.
$set_time = 3600*24*10;//设置几天后自动收货
while(true){
if($i%30==0){
usleep(10);//防止while 循环使CPU使用率过高
}
if($redis->LLEN(&#39;auto_recevice_order&#39;)){
$data = json_decode($redis->RPOP(&#39;auto_recevice_order&#39;));
$id = (int)$data->id;//将数据转化为整形
$deliver_time = (int)$data->deliver_time;//将数据转化为整形
$res1 = $res2 =false;
$now_time = time();
if(($deliver_time+$set_time)<$now_time){
 $sql1 = "update `order` set `is_token`=&#39;1&#39;,`token_time` = $now_time where id=$id and is_send=1 and is_del=0 and is_cancel=0 and is_token=0 and send_time + {$set_time} < $now_time";
 $res1 = $con->query($sql1);//更新数据
$rows = mysqli_affected_rows($con);
if($rows){
 $ip = $this->getIp();
 $sql2 = "insert into `order_log`(`order_id`,`log_msg`,`log_ip`,`log_role`,`log_user`,`log_order_state`,`log_time`) VALUES($id,&#39;系统自动收货&#39;,&#39;$ip&#39;,&#39;系统&#39;,&#39;服务器&#39;,&#39;收货&#39;,$now_time)";//写入订单日志
 $res2 = $con->query($sql2);//添加日志数据
 }
 }
 if($res1==false){//将没达到条件的数据重新插入队列中
  $redis->RPUSH(&#39;auto_recevice_order&#39;,json_encode(array(&#39;id&#39;=>$id,&#39;deliver_time&#39;=>$deliver_time)));
 }
}
 $i++;
}

3. BerfikirDengan pertumbuhan perniagaan, terdapat beberapa pesanan yang perlu diproses dalam baris gilir pada saat yang sama, dan Apabila hanya satu maklumat pesanan yang berkaitan boleh diambil daripada baris gilir pada satu masa, model satu pengeluar dan berbilang pengguna boleh diguna pakai Dalam kes ini, mekanisme kunci boleh digunakan untuk memastikan mesej hanya boleh sampai kepada satu pengguna. Apabila data redis mencapai jumlah tertentu, kekerapan pelaksanaan pengeluar dan keadaan yang sepadan boleh dilaraskan dengan sewajarnya.

Pembelajaran yang disyorkan: "

Tutorial Video PHP

"

Atas ialah kandungan terperinci Bagaimana untuk mencapai penerimaan automatik barangan dalam php. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn