Опрос очереди Azure возвращает Broken pipe

При длительном опросе хранилища очередей 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

Если я установлю для функции sleep значение 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);
        }
    }

}

person fedeisas    schedule 28.03.2013    source источник
comment
Что такое строки 180-200 файла /SocketWrapper.php ??   -  person Abela    schedule 07.04.2013
comment
@Yokhannan они используют пакет PEAR (HTTP_Request2). Я создал суть с запрошенными вами строками: gist. github.com/fedeisas/5331164#file-socketwrapper-php-L175. Спасибо1   -  person fedeisas    schedule 07.04.2013


Ответы (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

person rogal111    schedule 10.04.2013
comment
Эта строка, на которую вы ссылаетесь, была там только для целей тестирования. Я пытался reopen сокет... Проблема в том, что сокет умирает, если я не делаю запрос в течение 30 секунд. Вот почему я пытался возродить сокет. - person fedeisas; 12.04.2013
comment
Итак, это azure-sdk-for-php проблема, QueueService следует повторно открыть сокет на listMessages, если это необходимо. - person rogal111; 12.04.2013