2012-03-17 3 views
0

Я php noob и нуждаюсь в некоторой помощи. Я создал службу push для отправки push-сообщений на iphone. В комментариях говорится, что более эффективно объединять несколько сообщений в один пакет. Кроме того, прямо сейчас я делаю звонок для удаления каждого сообщения. Как объединить несколько сообщений в один пакет?Сделать этот алгоритм более эффективным

Благодаря

function start() 
{ 
    writeToLog('Connecting to ' . $this->server); 

    if (!$this->connectToAPNS()) 
     exit; 


    while (true) 
    { 
     // Do at most 20 messages at a time. Note: we send each message in 
     // a separate packet to APNS. It would be more efficient if we 
     // combined several messages into one packet, but this script isn't 
     // smart enough to do that. ;-) 

     $stmt = $this->pdo->prepare('SELECT * FROM push_queue WHERE time_sent IS NULL LIMIT 20'); 
     $stmt->execute(); 
     $messages = $stmt->fetchAll(PDO::FETCH_OBJ); 

     foreach ($messages as $message) 
     { 
      if ($this->sendNotification($message->message_id, $message->device_token, $message->payload)) 
      { 
       //$stmt = $this->pdo->prepare('UPDATE push_queue SET time_sent = NOW() WHERE message_id = ?'); 
       //$stmt->execute(array($message->message_id)); 

       $stmt = $this->pdo->prepare('DELETE FROM push_queue WHERE message_id = ?'); 
       $stmt->execute(array($message->message_id)); 

      } 
      else // failed to deliver 
      { 
       $this->reconnectToAPNS(); 
      } 
     } 

     unset($messages);   
     sleep(5); 
    } 
} 
+2

Ваш вопрос не имеет никакого отношения к оптимизация SQL - это то, что делается с результатом SQL ... вам нужно объяснить, что часть с гораздо более подробной информацией, чтобы получить полезные ответы! – Yahia

ответ

4

Вы можете сгруппировать удаленные идентификаторы сообщениями внутри массива

$deletedIds = array() 
foreach ($messages as $message) 
{ 
    if ($this->sendNotification()) 
    { 
     $deletedIds[] = $message->message_id; 
    } 
} 

После этого вы можете удалить такие сообщения, используя метод запроса

$this->pdo->query('DELETE FROM push_queue WHERE message_id IN ('.implode(',', $deletedIds).')'); 
+0

Спасибо. Прекрасно работает. Возможно ли сделать что-то подобное с отправляемым запросом сообщения? – BlackMouse

Смежные вопросы