public function startWorker2()
{
$worker = new Worker();
$worker->count = 4;
$worker->onWorkerStart = function ($worker) {
try {
// 為每個(gè)子進(jìn)程創(chuàng)建獨(dú)立的 MQTT 客戶端實(shí)例
$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]); // 執(zhí)行485設(shè)備定時(shí)采集數(shù)據(jù)
break;
case 1:
app()->make(\App\Services\ModelReceiveService::class, ['mqttClient' => $mqttClient]); // 執(zhí)行485設(shè)備收集數(shù)據(jù)
break;
default:
break;
}
} catch (\Exception $e) {
// Log::error("An error occurred in Worker_" . $worker->id . ": " . $e->getMessage(), [ // 記錄錯(cuò)誤日志
// 'worker_id' => $worker->id,
// 'exception' => $e,
// ]);
echo "An error occurred in Worker_" . $worker->id . ": " . $e->getMessage();
echo $e->getFile() . $e->getLine();
}
};
}
問(wèn)題出現(xiàn)在這里, app()->make(\App\Services\DeviceModelService::class, ['mqttClient' => $mqttClient]); 怎么能確保里面的mqtt一定是這個(gè)進(jìn)程所對(duì)應(yīng)的mqtt呢?
這個(gè)不用咱們操心。文檔中說(shuō):onWorkerstart在每個(gè)線程中都會(huì)執(zhí)行一次。你這個(gè)問(wèn)題我認(rèn)為你可以這樣理解:你假設(shè)是fpm開(kāi)發(fā)模式,你代碼中創(chuàng)建了一個(gè)MySQL連接對(duì)象。此時(shí)有兩個(gè)請(qǐng)求并發(fā)來(lái)到,我相信你不會(huì)擔(dān)心這兩個(gè)請(qǐng)求中的MySQL連接對(duì)象共享(競(jìng)爭(zhēng))問(wèn)題。