运行文件:
<?php
/**
* 设置订单状态
*/
require_once dirname(__DIR__) . '/vendor/autoload.php';
require_once __DIR__ . '/lib/SetTradeStatus.php';
use Workerman\Worker;
use Workerman\Lib\Timer;
use think\DB;
$task = new Worker();
// 开启多少个进程运行定时任务,注意业务是否在多进程有并发问题
$task->count = 1;
$task->onWorkerStart = function()
{
$SetTradeStatus = new SetTradeStatus();
Timer::add(1, [$SetTradeStatus, 'init'], [], false);
};
// 运行worker
Worker::runAll();
类文件:
<?php
use think\DB;
class SetTradeStatus
{
private $trade_data;
public function init()
{
// 查询订单
$Trade = Db::name("trade");
// 所有订单状态为0的订单
$Trade->where('trade_status', '0');
$data = $Trade->select();
foreach ($data as $key => $value) {
$this->handle_data($value);
}
}
private function handle_data($trade_data)
{
$this->trade_data = $trade_data;
// 设置订单状态
$this->set_trade_status();
// 发送设备通知
$this->add_msg();
}
private function set_trade_status()
{
DB::name('trade')->where('id', $this->trade_data['id'])->data('status', 1)->update();
}
private function add_msg()
{
$data = [
'trade_id' => $this->trade_data['id']
,'msg' -> 'OK'
];
Db::name('msg')->data($data)->insert();
}
}
类文件中, $this->trade_data 会被混淆么,
在执行ID为1的数据的时候,trade_data 为1:;这个trade_data 会被下一次执行的数据覆盖么
不同的进程之间 $this->trade_data 属于不同的worker实例,互不影响;同一个进程之内按照你的代码 foreach 那每次都在迭代覆盖 $this->trade_data