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