由于GatewayWorker/Applications/YourApp/start_businessworker.php
里設(shè)置的進(jìn)程數(shù)量是4
$worker->count = 4;
在Events.php
文件的onWorkerStart
事件里設(shè)置了一個(gè)定時(shí)器。
public static function onWorkerStart($businessWorker){
// 每N秒執(zhí)行一次
$time_interval = 60;
Timer::add($time_interval, function () {
echo "[" . date("m-d H:i:s") . "] " . 'onWorkerStart 分鐘定時(shí)器' . "\n";
# 進(jìn)行同步或者異步的數(shù)據(jù)庫(kù)寫入操作
});
}
重啟服務(wù)后,會(huì)連續(xù)打印4條數(shù)據(jù)。說明定時(shí)器執(zhí)行了4次。
[10-06 18:27:15] onWorkerStart 分鐘定時(shí)器
[10-06 18:27:15] onWorkerStart 分鐘定時(shí)器
[10-06 18:27:15] onWorkerStart 分鐘定時(shí)器
[10-06 18:27:15] onWorkerStart 分鐘定時(shí)器
要在定時(shí)器內(nèi)執(zhí)行異步的數(shù)據(jù)庫(kù)寫入操作,如何讓多進(jìn)程下,只有一個(gè)全局定時(shí)器呢?
在Event::onWorkerStart
里設(shè)置了mysql和Redis數(shù)據(jù)庫(kù)的初始化配置。
如果有4個(gè)businessworker
進(jìn)程,這里就會(huì)初始化4次。
重復(fù)的配置和初始化,會(huì)不會(huì)造成資源浪費(fèi)呢?
能不能只初始化一次,全局所有的onMessage
事件里就可以用呢。
找到一個(gè)解決的辦法,僅供參考。如果有更好的辦法,歡迎提出來(lái)。
先在Events.php
里創(chuàng)建一個(gè)測(cè)試函數(shù)
public static function test()
{
echo "[" . date("m-d H:i:s") . "] " . 'Events 內(nèi)的定時(shí)執(zhí)行的方法' . "\n";
// 這里可以引用類里面的一些變量和方法,執(zhí)行定時(shí)操作
}
然后在start_worker.php
的onWorkerStart
里創(chuàng)建一個(gè)定時(shí)器,調(diào)用Events.php
里的測(cè)試方法
require_once 'Events.php';
$task_worker->onWorkerStart = function ($worker) {
// 每N秒執(zhí)行一次
$time_interval = 60;
Timer::add($time_interval, function () {
echo "[" . date("m-d H:i:s") . "] " . 'onWorkerStart 獨(dú)立的分鐘定時(shí)器' . "\n";
// 測(cè)試定時(shí)調(diào)用
$Events = new Events();
$Events->test();
});
};
實(shí)測(cè)這個(gè)定時(shí)器是單進(jìn)程的,每分鐘會(huì)執(zhí)行一次。而不是每分鐘連續(xù)執(zhí)行4次
然而、但是,上面這個(gè)簡(jiǎn)單的例子是可以執(zhí)行的。
寫了個(gè)復(fù)雜點(diǎn)的,在定時(shí)器里執(zhí)行Redis寫入操作,就報(bào)錯(cuò)了:
Warning: stream_socket_client(): unable to connect to tcp://127.0.0.1:1236 (Connection refused) in /GatewayWorker/vendor/workerman/gateway-worker/src/Lib/Gateway.php on line 1346
[10-06 19:34:18] onWorkerStart Error:Exception: Can not connect to tcp://127.0.0.1:1236 Connection refused in /GatewayWorker/vendor/workerman/gateway-worker/src/Lib/Gateway.php:1352
Stack trace:
看來(lái)這個(gè)方法還是不能做數(shù)據(jù)庫(kù)操作啊。期待更好的辦法。
試試這樣
public static function onWorkerStart($businessWorker){
if(businessWorker->id ==0){
// 每N秒執(zhí)行一次
$time_interval = 60;
Timer::add($time_interval, function () {
echo "[" . date("m-d H:i:s") . "] " . 'onWorkerStart 分鐘定時(shí)器' . "\n";
# 進(jìn)行同步或者異步的數(shù)據(jù)庫(kù)寫入操作
});
}
}