N個(gè)群進(jìn)行發(fā)消息,視頻,圖片,文字。視頻圖片文字之間有個(gè)五秒的延遲,一開始用的sleep,導(dǎo)致時(shí)間間隔壓根不對,現(xiàn)在用定時(shí)器去操作,又遇到了定時(shí)器阻塞問題。
循環(huán)讀取群,批量往群內(nèi)去發(fā)送視頻圖片文字。請問這種情況用workman怎么寫,如果是原生php之間用sleep去寫了。但workman里面用sleep又導(dǎo)致了其他的業(yè)務(wù)阻塞。已經(jīng)用了AsyncTcpConnection
我的業(yè)務(wù)比較復(fù)雜。
15分鐘讀取機(jī)器人id,根據(jù)機(jī)器人id讀取他的群,循環(huán)發(fā)送這些群。
現(xiàn)在的寫法如下:
public function sendRobotAllGroup($wxId,$group=[]){
foreach ($group as $k=>$v){
if(!$v['wechatgroup_code']){
Db::name('wechatgroup')->where('id',$v['id'])->update(['status'=>6]);
continue;
}
$send = new Send();
$send->setGroupId($v['id']);
//獲取內(nèi)容
$content = $send->index();
if($k==0){
$space = 1;
}else{
$space = $k*4;
}
//發(fā)送
Timer::add($space, array($this, 'sendByWxId'), [$wxId, $v['wechatgroup_code'] ,$content], false);
// $this->sendByWxId($wxId,$v['wechatgroup_code'],$content);
unset($content);
unset($send);
}
}
public function sendBysWxId($fromId,$toId,$content){
$vedio = $content['vedio']; //視頻
$pic_urls = $content['pic_urls']; //圖片
$text = $content['content']; //文案
$i = 0;
$curr = 0; //當(dāng)前位置 0 視頻 1 圖片 2文案
$v_count = count($vedio);
$p_count = count($pic_urls);
$t_count = count($text);
$timer_id = Timer::add(5, function()use(&$timer_id ,&$fromId, &$toId, &$vedio,&$pic_urls, &$text,&$v_count,&$p_count,&$t_count, &$i ,&$curr)
{
if($curr == 0){
if($i == $v_count){
$i = 0;
$curr = 1;
}else{
$this->sendVideo($fromId, $toId, $vedio[$i]);
}
}
if ($curr == 1){
if($i == $p_count){
$i = 0;
$curr = 2;
}else{
$this->sendImage($fromId, $toId, $pic_urls[$i]);
}
}
if ($curr == 2){
if($i == $t_count){
$i = 0;
}else{
$this->sendText($fromId, $toId, $text[$i]);
}
}
$i++;
if($i >= $t_count && $curr ==2){
Timer::del($timer_id);
}
});
}
現(xiàn)在應(yīng)該是遇到定時(shí)器阻塞,循環(huán)創(chuàng)建的定時(shí)器,如果前面一個(gè)定時(shí)器還沒有跑完,那下面的定時(shí)器是不是不會(huì)執(zhí)行?都要等著他執(zhí)行萬,別告訴我再來一個(gè) AsyncTcpConnection 。我已經(jīng)做了客戶端定時(shí)15分鐘發(fā)起發(fā)送請求,然后AsyncTcpConnection到服務(wù)端來處理發(fā)送了。
sendText , sendImage ,sendVideo都是curl http接口
請大神指點(diǎn)下。
我的本機(jī)環(huán)境和服務(wù)器都是windows,我在測試的過程中發(fā)現(xiàn)定時(shí)器在一個(gè)進(jìn)程里應(yīng)該是串行的,如果你上一個(gè)定時(shí)器里的邏輯比較復(fù)雜,后面的定時(shí)器會(huì)等它執(zhí)行完再執(zhí)行;我現(xiàn)在也在為這個(gè)事找解決方法,我的是在時(shí)間的越往后,我的執(zhí)行越來越慢,得找大神問去了
目前只能按 blogdaren 說的,把curl那些等待放到其他服務(wù)器操作去了,定時(shí)器里面curl調(diào)用遠(yuǎn)程接口,請求不等待。傳遞參數(shù)執(zhí)行的間隔,遠(yuǎn)程服務(wù)用sleep去等待
1、sleep是系統(tǒng)調(diào)用,系統(tǒng)調(diào)用會(huì)導(dǎo)致進(jìn)程掛起,所以不要用sleep.
2、單個(gè)進(jìn)程內(nèi)業(yè)務(wù)都是串行執(zhí)行的、而且上一個(gè)定時(shí)器內(nèi)的業(yè)務(wù)要是規(guī)定時(shí)間內(nèi)沒執(zhí)行完則會(huì)等執(zhí)行完了才會(huì)繼續(xù)執(zhí)行下一個(gè)定時(shí)器內(nèi)的業(yè)務(wù),如此反復(fù)......
3、sendText , sendImage ,sendVideo都是curl http接口
這些屬于典型的繁重網(wǎng)絡(luò)IO,我認(rèn)為還是慣用的異步方案,將這些任務(wù)放到獨(dú)立的進(jìn)程組或機(jī)器上來異步處理;另你客戶端15分鐘的定時(shí)器發(fā)起請求和異步處理任務(wù)之間有什么必然關(guān)系呢?