public function startWorker2()
{
$worker = new Worker();
$worker->count = 4;
$worker->onWorkerStart = function ($worker) {
try {
// 为每个子进程创建独立的 MQTT 客户端实例
$mqttClient = new \Workerman\Mqtt\Client(env('MQTT_URL'), ['client_id' => "sy-mqtt-client-".mt_rand(), 'username' => env('MQTT_USERNAME'), 'password' => env('MQTT_PASSWORD')]);
$mqttClient->connect();
switch ($worker->id) {
case 0:
app()->make(\App\Services\DeviceModelService::class, ['mqttClient' => $mqttClient]); // 执行485设备定时采集数据
break;
case 1:
app()->make(\App\Services\ModelReceiveService::class, ['mqttClient' => $mqttClient]); // 执行485设备收集数据
break;
default:
break;
}
} catch (\Exception $e) {
// Log::error("An error occurred in Worker_" . $worker->id . ": " . $e->getMessage(), [ // 记录错误日志
// 'worker_id' => $worker->id,
// 'exception' => $e,
// ]);
echo "An error occurred in Worker_" . $worker->id . ": " . $e->getMessage();
echo $e->getFile() . $e->getLine();
}
};
}
问题出现在这里, app()->make(\App\Services\DeviceModelService::class, ['mqttClient' => $mqttClient]); 怎么能确保里面的mqtt一定是这个进程所对应的mqtt呢?
这个不用咱们操心。文档中说:onWorkerstart在每个线程中都会执行一次。你这个问题我认为你可以这样理解:你假设是fpm开发模式,你代码中创建了一个MySQL连接对象。此时有两个请求并发来到,我相信你不会担心这两个请求中的MySQL连接对象共享(竞争)问题。