由于GatewayWorker/Applications/YourApp/start_businessworker.php
里設置的進程數(shù)量是4
$worker->count = 4;
在Events.php
文件的onWorkerStart
事件里設置了一個定時器。
public static function onWorkerStart($businessWorker){
// 每N秒執(zhí)行一次
$time_interval = 60;
Timer::add($time_interval, function () {
echo "[" . date("m-d H:i:s") . "] " . 'onWorkerStart 分鐘定時器' . "\n";
# 進行同步或者異步的數(shù)據(jù)庫寫入操作
});
}
重啟服務后,會連續(xù)打印4條數(shù)據(jù)。說明定時器執(zhí)行了4次。
[10-06 18:27:15] onWorkerStart 分鐘定時器
[10-06 18:27:15] onWorkerStart 分鐘定時器
[10-06 18:27:15] onWorkerStart 分鐘定時器
[10-06 18:27:15] onWorkerStart 分鐘定時器
要在定時器內(nèi)執(zhí)行異步的數(shù)據(jù)庫寫入操作,如何讓多進程下,只有一個全局定時器呢?
在Event::onWorkerStart
里設置了mysql和Redis數(shù)據(jù)庫的初始化配置。
如果有4個businessworker
進程,這里就會初始化4次。
重復的配置和初始化,會不會造成資源浪費呢?
能不能只初始化一次,全局所有的onMessage
事件里就可以用呢。
找到一個解決的辦法,僅供參考。如果有更好的辦法,歡迎提出來。
先在Events.php
里創(chuàng)建一個測試函數(shù)
public static function test()
{
echo "[" . date("m-d H:i:s") . "] " . 'Events 內(nèi)的定時執(zhí)行的方法' . "\n";
// 這里可以引用類里面的一些變量和方法,執(zhí)行定時操作
}
然后在start_worker.php
的onWorkerStart
里創(chuàng)建一個定時器,調(diào)用Events.php
里的測試方法
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 獨立的分鐘定時器' . "\n";
// 測試定時調(diào)用
$Events = new Events();
$Events->test();
});
};
實測這個定時器是單進程的,每分鐘會執(zhí)行一次。而不是每分鐘連續(xù)執(zhí)行4次
然而、但是,上面這個簡單的例子是可以執(zhí)行的。
寫了個復雜點的,在定時器里執(zhí)行Redis寫入操作,就報錯了:
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:
看來這個方法還是不能做數(shù)據(jù)庫操作啊。期待更好的辦法。
試試這樣
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 分鐘定時器' . "\n";
# 進行同步或者異步的數(shù)據(jù)庫寫入操作
});
}
}