onWorkerStart中类的变量会混淆么

程序gg了

运行文件:

<?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 会被下一次执行的数据覆盖么

2059 1 0
1个回答

phpcreeper

不同的进程之间 $this->trade_data 属于不同的worker实例,互不影响;同一个进程之内按照你的代码 foreach 那每次都在迭代覆盖 $this->trade_data

  • 暂无评论
年代过于久远,无法发表回答
×
🔝