現(xiàn)在需要通過接口在 es 查數(shù)據(jù),數(shù)據(jù)量較大,直接使用 PHP 查詢,再處理后存庫(kù),時(shí)間較長(zhǎng)。如何使用 workerman 開多個(gè)進(jìn)程同時(shí)執(zhí)行呢?每一次執(zhí)行根據(jù)查詢數(shù)據(jù)的 offset 和 limit 可以拿到對(duì)應(yīng)的數(shù)據(jù),這樣就可以加速查詢。
可以考慮用redis-queue隊(duì)列,開多個(gè)進(jìn)程查詢.
http://wtbis.cn/doc/workerman/components/workerman-redis-queue.html
感謝回答,我現(xiàn)在主要是es中數(shù)據(jù)太大,如果只用php單進(jìn)程來讀,然后保存,效率就會(huì)很低,很低。所以就想用多進(jìn)程的方式,每次通過不同的offset來查詢es中的數(shù)據(jù),這樣可以加快從es中拿到數(shù)據(jù)。對(duì)列這個(gè)方法好像沒法加快從es中拿數(shù)據(jù)這一過程。請(qǐng)問您知道怎么解決嗎?不勝感激
大佬,我現(xiàn)在把這個(gè)異步調(diào)好了, 但是我這個(gè)是定時(shí)任務(wù),每一次啟動(dòng)都都是會(huì)監(jiān)聽這個(gè)端口,但是這樣第二次定時(shí)任務(wù)消息就發(fā)在第一次的代碼中去了,這種怎么處理呢
你把這個(gè)異步服務(wù)作為任務(wù)執(zhí)行端,定時(shí)任務(wù)作為任務(wù)發(fā)布端。定時(shí)任務(wù)執(zhí)行的時(shí)候把需要處理的任務(wù)發(fā)給執(zhí)行端,讓執(zhí)行端慢慢執(zhí)行,執(zhí)行完了之后可以用回調(diào)的方式異步通知你
我昨天完成了這個(gè)實(shí)現(xiàn),然后我異步執(zhí)行的時(shí)候,數(shù)據(jù)太多,執(zhí)行很耗時(shí),我就想著使用 redis-queue 來做,但是數(shù)據(jù)放進(jìn) redis-queue,然后那邊拿到的數(shù)據(jù)會(huì)重復(fù),就很難受了
是不是投送重復(fù)了,投遞消息的時(shí)候記錄日志,看下投遞了幾次。如果用了websocket推送,看下是不是建立了多個(gè)連接導(dǎo)致推送了多次
推送代碼:
$text_worker = new Worker('text://0.0.0.0:56178');
$m = $data['talentId']%10;
$this->redis_queue_send($redis, 'User:'.$m , 1);
接收代碼:總共有10個(gè)隊(duì)列
$client->subscribe('User:0', function($data){
print_r($data);
});
...
$client->subscribe('User:9', function($data){
print_r($data);
});
是上邊網(wǎng)消息隊(duì)列中添加消息的時(shí)候有問題嘛
開多個(gè)進(jìn)程,每個(gè)進(jìn)程按照進(jìn)程id取不同的from,offset。例如
$worker = new Worker();
$worker->count = 10;
$worker->onWorkerStart = function($worker) {
// 進(jìn)程數(shù)為10的話,進(jìn)程id會(huì)是從0到9
$from = $woker->id * $worker->count;
$offset = $worker->count;
while($result = your_es_search($from, $offset)) {
$from = $from + $worker->count*$offset;
}
};
大致思路是這樣,代碼不一定對(duì),你可以試下