我有一個server.php文件
我在主進(jìn)程中使用GlobalData變量共享組件。每0.5秒隨機(jī)賦予$global_client->param一個數(shù)字,這一切都是正常。
use Workerman\Lib\Timer;
use Workerman\Worker;
$global_server = new GlobalData\Server('127.0.0.1','13145');
$global_client = new GlobalData\Client('127.0.0.1:13145');
$worker = new Worker();
$worker->onWorkerStart = function() use($global_client) {
//每0.5秒隨機(jī)設(shè)置一個數(shù)
Timer::add(0.5, function() use ($global_client){
$global_client->param=rand(1,999999);
});
};
Worker::runAll();
我有一個client.php文件
如果不要while循壞,我再cli模式下能正常獲取數(shù)據(jù),但是加了while循環(huán)幾次后就會出現(xiàn)Alarm Clock,我不知道是什么原因。 哪個朋友能給我說明一下原理嗎?
用for循環(huán)10次也會報這樣的錯誤
$global_client = new GlobalData\Client('127.0.0.1:13145');
while (1){
sleep(1);
print_r($global_client->param);
}
如果用Timer方式循環(huán)可以解決問題, 就是我想知道原理是什么?為什么會這樣?
我的理解GlobalData變量共享組件 好比數(shù)據(jù)庫,我while就是不停的連接數(shù)據(jù)庫,但是沒成功~不知道原理
workerman 不允許這種寫法,文檔中有說明: http://doc.workerman.net/329713
文檔里:"如果在Workerman環(huán)境中使用GlobalData/Client,請?jiān)趏nXXX回調(diào)中實(shí)例化GlobalData/Client對象,例如在onWorkerStart中實(shí)例化。"
https://github.com/walkor/GlobalData/blob/master/src/Client.php#L74
https://github.com/walkor/Workerman/blob/master/Timer.php#L127
追蹤源碼上述源碼可以發(fā)現(xiàn)定時器觸發(fā)了pcntl_alarm(1)行為,即1秒后觸發(fā)了時鐘信號,默認(rèn)會終止當(dāng)前進(jìn)程。
目前尚不清楚Timer這里的pcntl_alarm(1)的影響,不過按照你這while寫法【目測你這是非workerman環(huán)境用法】,原理理解了、客戶端可以暫時通過屏蔽時鐘信號這樣去解決:pcntl_alarm(0); 此外樓上提及的注意事項(xiàng)也要關(guān)注。