客戶端代碼:
服務(wù)端代碼:
控制臺(tái):
不能用sleep,sleep會(huì)讓進(jìn)程睡眠,睡眠的進(jìn)程不執(zhí)行任何代碼,就無(wú)法處理連接。
如果你想定時(shí)emit,用定時(shí)器。
$timer_id = Workerman\Timer::add(3, function() use ($sender_io, &$timer_id) {
static $count = 0;
if ($count++ < 3000) {
$sender_io->emit(...);
} else {
// 執(zhí)行3000次后刪除自己
Workerman\Timer::del($timer_id);
}
});
感謝你的回答,真及時(shí)。
像你那樣寫個(gè)timer的話確實(shí)可以執(zhí)行 并且可以一直往客戶端推送數(shù)據(jù),但是我想的是就像js那種click點(diǎn)擊事件,然后一直給客戶端推送數(shù)據(jù)可以嗎?
如果你的運(yùn)算邏輯一直執(zhí)行,其它代碼就無(wú)法執(zhí)行,包括phpsocket.io接收連接也無(wú)法執(zhí)行,所以就一直pending了。解決方法就是想辦法不讓你的業(yè)務(wù)邏輯長(zhǎng)時(shí)間卡著整個(gè)進(jìn)程的執(zhí)行
我試了一下這種方法不行,因?yàn)楝F(xiàn)在的業(yè)務(wù)是導(dǎo)入數(shù)據(jù),就是從一個(gè)數(shù)據(jù)庫(kù)里取出數(shù)據(jù)導(dǎo)入到另一個(gè)數(shù)據(jù)庫(kù),這個(gè)只能等導(dǎo)入完成,才能客戶端和服務(wù)端連接成功不pending,有什么辦法才能讓它既正在導(dǎo)入也能客戶端連接成功給客戶端推送數(shù)據(jù)?
你可以把phpsocketio.io作為一個(gè)即時(shí)通訊的通道,只做通訊。業(yè)務(wù)邏輯交給其他架構(gòu)或者進(jìn)程去做。
例如導(dǎo)入工作通過(guò)http請(qǐng)求發(fā)給傳統(tǒng)http框架,http框架完成導(dǎo)入后調(diào)用phpsocket.io接口通知對(duì)應(yīng)客戶端。
例如將耗時(shí)操作放到隊(duì)列,隊(duì)列完成后通過(guò)調(diào)用phpsocket.io接口通知對(duì)應(yīng)客戶端。
例如將耗時(shí)操作交給其他進(jìn)程去做,其他進(jìn)程完成后通過(guò)調(diào)用phpsocket.io接口通知對(duì)應(yīng)客戶端。
你可以看下這個(gè)例子,同樣適用于phpsocket.io
http://www.wtbis.cn/doc/workerman/faq/async-task.html
是按照你發(fā)給我的那個(gè)連接做的,現(xiàn)在是拆分成了兩個(gè),但是一個(gè)服務(wù)重啟后另一個(gè)服務(wù)就暫停了,是這樣拆分成兩個(gè)服務(wù)嗎?