代碼如下:
new Crontab('1 *', function(){
// 建立socket連接到內(nèi)部推送端口
$client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 1);
// 推送的數(shù)據(jù),包含uid字段,表示是給這個(gè)uid推送
$data = array('uid'=>'uid1', 'percent'=>'88%');
// 發(fā)送數(shù)據(jù),注意5678端口是Text協(xié)議的端口,Text協(xié)議需要在數(shù)據(jù)末尾加上換行符
fwrite($client, json_encode($data)."\n");
// 讀取推送結(jié)果
echo fread($client, 8192);
});
通過(guò)日志分析調(diào)用fwrite能成功發(fā)送數(shù)據(jù),在127.0.0.1服務(wù)端onMessage回調(diào)里也能正常接收到數(shù)據(jù),調(diào)用$connection->send("hello\n");的返回值為true,那表示數(shù)據(jù)已經(jīng)成功寫(xiě)入到該連接的操作系統(tǒng)層的socket發(fā)送緩沖區(qū),但fread接收不到結(jié)果。在控制器里調(diào)用fwrite后fread是能正常接收到結(jié)果。不知道什么原因,求解。
直觀上看參數(shù) 1 *
格式應(yīng)該是錯(cuò)誤的,所以示例的定時(shí)器理論上說(shuō)壓根兒應(yīng)該就沒(méi)有啟動(dòng)或者說(shuō)會(huì)被攔截拋異常什么的,但是標(biāo)題中卻描述 new Crontab的回調(diào)函數(shù)里能發(fā)送成功數(shù)據(jù)
,先不說(shuō)回調(diào)函數(shù)本身的邏輯吧,這個(gè)你確定回調(diào)函數(shù)已經(jīng)成功被觸發(fā)執(zhí)行了?
這算是一份偽代碼,刪除了一些讀取數(shù)據(jù)庫(kù)的邏輯,定時(shí)規(guī)則是讀數(shù)據(jù)庫(kù)配置的??梢园? 替換成/5 *,定時(shí)器是執(zhí)行了的,已經(jīng)有打印出日志。
關(guān)于你所描述的格式我這里均不支持,不清楚是不是Crontab庫(kù)版本的原因,依據(jù)手冊(cè)格式好解決,那就進(jìn)一步看:示例中的回調(diào)代碼邏輯看上去也沒(méi)有什么大問(wèn)題,粗暴自測(cè)也未見(jiàn)異常,不過(guò)仍有幾處地方需要注意,調(diào)整下試試看吧:
1、stream_socket_client的第4個(gè)參數(shù)看你設(shè)定的連接超時(shí)是1秒,這個(gè)感覺(jué)太小了,可以調(diào)整為5秒試試看;
2、stream_set_blocking($client, 1);
3、記得末尾調(diào)用fclose($client);