Опрос очереди Azure возвращает сломанный канал
При длительном опросе хранилища очереди Azure с помощью azure-sdk-for-php, если мой запрос разделен более чем на 30 секунд, библиотека умирает с этой ошибкой:
PHP Notice: fwrite(): send of 277 bytes failed with errno=32 Broken pipe in ..../vendor/pear-pear.php.net/HTTP_Request2/HTTP/Request2/SocketWrapper.php on line 188
Если я установлю функцию сна на 30 секунд, все будет отлично, но я делаю МНОГО запросов, которые мне не нужны.
Мой рабочий код:
use WindowsAzure\Common\ServicesBuilder;
use WindowsAzure\Common\ServiceException;
Class Worker_Task {
public $queueRestProxy;
public $servicesBuilder;
public $connectionString;
public function __construct() {
$this->connectionString = Config::get('azure.connection_string');
$this->servicesBuilder = ServicesBuilder::getInstance();
$this->queueRestProxy = $this->servicesBuilder->createQueueService($this->connectionString);
}
public function emails() {
$this->write('Processing mails...');
while(true) {
$this->queueRestProxy = $this->servicesBuilder->createQueueService($this->connectionString);
// Get message.
$listMessagesResult = $this->queueRestProxy->listMessages("emails");
$messages = $listMessagesResult->getQueueMessages();
foreach($messages as $message) {
// Process Message
$content = json_decode($message->getMessageText());
// Dispatch Email
// Delete Job
$this->deleteJob('emails', $message->getMessageId(), $message->getPopReceipt());
}
sleep(30);
}
}
}
1 ответ
Это похоже на проблему перегрузки или тайм-аута. Библиотека PHP не может писать в сокет Azure. Возможно, вы превысили пределы нагрузки Azure с бесконечным циклом while(true) { ... }
,
Не создавать queueService
в каждом цикле, потому что вы закрываете и открываете грушу бесконечно.
Попробуйте переместить строку:
$this->queueRestProxy = $this->servicesBuilder->createQueueService($this->connectionString);
до while(true) {
:
$this->write('Processing mails...');
$this->queueRestProxy = $this->servicesBuilder->createQueueService($this->connectionString);
while(true) {
// Get message.
Если это не поможет, то, вероятно, azure-sdk-for-php
библиотека неправильно использует механизм сокетов - создайте новую проблему по адресу https://github.com/WindowsAzure/azure-sdk-for-php ИЛИ используйте этот подход: AzurePHP - опрос очереди Azure