下面手冊(cè)的主進(jìn)程和子進(jìn)程與上圖對(duì)應(yīng)嗎 ? 主進(jìn)程不是不處理邏輯嗎?這里不是很懂
三、區(qū)分主進(jìn)程和子進(jìn)程
有必要注意下代碼是運(yùn)行在主進(jìn)程還是子進(jìn)程,一般來(lái)說(shuō)在Worker::runAll();調(diào)用前運(yùn)行的代碼都是在主進(jìn)程運(yùn)行的,onXXX回調(diào)運(yùn)行的代碼都屬于子進(jìn)程。注意寫在Worker::runAll();后面的代碼永遠(yuǎn)不會(huì)被執(zhí)行。
例如下面的代碼
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// 運(yùn)行在主進(jìn)程
$tcp_worker = new Worker("tcp://0.0.0.0:2347");
// 賦值過(guò)程運(yùn)行在主進(jìn)程
$tcp_worker->onMessage = function(TcpConnection $connection, $data)
{
// 這部分運(yùn)行在子進(jìn)程
$connection->send('hello ' . $data);
};
Worker::runAll();
注意: 不要在主進(jìn)程中初始化數(shù)據(jù)庫(kù)、memcache、redis等連接資源,因?yàn)橹鬟M(jìn)程初始化的連接可能會(huì)被子進(jìn)程自動(dòng)繼承(尤其是使用單例的時(shí)候),所有進(jìn)程都持有同一個(gè)連接,服務(wù)端通過(guò)這個(gè)連接返回的數(shù)據(jù)在多個(gè)進(jìn)程上都可讀,會(huì)導(dǎo)致數(shù)據(jù)錯(cuò)亂。同樣的,如果任何一個(gè)進(jìn)程關(guān)閉連接(例如daemon模式運(yùn)行時(shí)主進(jìn)程會(huì)退出導(dǎo)致連接關(guān)閉),都導(dǎo)致所有子進(jìn)程的連接都被一起關(guān)閉,并發(fā)生不可預(yù)知的錯(cuò)誤,例如mysql gone away 錯(cuò)誤。
推薦在onWorkerStart里面初始化連接資源