【发布时间】:2020-04-29 00:21:24
【问题描述】:
我有几张图片想使用 Twilio 发送到 WhatsApp 号码。只有在所有图像都已交付后,我才想发送短信。在发送图像时,我指定了一个回调来获取交付状态并使用 redis 存储它。在我打电话发送这些图像后,我检查所有图像的交付状态,如果没有一个图像的状态为零,则我发送文本消息,否则我进行检查,直到我得到一个交货状态不为零。但是,我提出的解决方案是超时。我收到此错误 - Maximum execution time of 60 seconds exceeded from Redis 即使图像也没有发送。见附图
这就是我正在做的:
Route::get('test', function (){
$redis = new \Predis\Client();
$images = \App\ProductImage::where('product_id', 7)->get();
foreach ($images as$image){
$imgUrl = url(env('BOT_URL').'/images/'.$image['img_url']);
$sid[] = \App\Libraries\Utilities::sendMediaMessage('+23xxxxx', '', $imgUrl);
}
foreach ($sid as $id){
$statuses[] = $redis->get($id);
}
if(in_array(0, $statuses)){
$check = \App\Libraries\Utilities::checkIfWhatsAppStatusHasChanged($sid);
if ($check){
\App\Libraries\Utilities::sendWhatsAppMessage('+23xxxxx', 'Send message - had to check');
}
}else{
\App\Libraries\Utilities::sendWhatsAppMessage('+23xxxx', 'Send message ');
}
});
这里是 sendMediaMessage 方法
public static function sendMediaMessage($phone, $msg, $mediaUrl){
try{
$client = new Client(env('TWILIO_SID'), env('TWILIO_TOKEN'));
$send = $client->messages->create(
"whatsapp:".$phone, // Text this number
array(
'from' => "whatsapp:".env('TWILIO_NUMBER'), // From a valid Twilio number
'body' => $msg,
'mediaUrl' => $mediaUrl,
'statusCallback' => url(env('BOT_URL').'/whatsapp-delivery-status')
)
);
//
if($send != false){
$message_sid = $send->sid;
return $message_sid;
}
}catch (\Exception $exception){
}
}
这里是回调方法——
public function checkWhatsapDelivery(Request $request)
{
$redis = new Client();
$body = $request->all();
$messageSid = $body['MessageSid'];
$MessageStatus = $body['MessageStatus'];
$status_id = Utilities::getWhatsappMessageStatus($MessageStatus);
$redis->set($messageSid, $status_id);
}
这里是 getWhatsappMessageStatus 方法
public static function getWhatsappMessageStatus($status){
switch (strtolower($status)){
case 'queued':
$id = 1;
break;
case 'failed':
$id = 2;
break;
case 'sent':
$id = 3;
break;
case 'delivered':
$id = 4;
break;
case 'read':
$id = 5;
break;
default:
$id = 0;
}
return $id;
}
这里是 checkIfWhatsAppStatusHasChanged 方法
public static function checkIfWhatsAppStatusHasChanged($sids){
$statuses = self::getWhatsAppStatuses($sids);
if(in_array(0, $statuses)){
self::checkIfWhatsAppStatusHasChanged($sids);
}else{
return true;
}
}
这里是getWhatsAppStatuses方法
public static function getWhatsAppStatuses($sids){
$redis = new \Predis\Client();
foreach ($sids as $id){
$statuses[] = $redis->get($id);
}
return $statuses;
}
请问我做错了什么?
【问题讨论】:
-
你可以在这里找到解决方案stackoverflow.com/questions/1420249/…
-
一个更好的办法是在
checkWhatsapDelivery回调中发送你的最终消息,这样主脚本就不需要等待了。 -
@levi 正是我所做的,它现在工作正常。谢谢。
标签: php laravel redis twilio-api