【问题标题】:Polling Azure queue returns Broken pipe轮询 Azure 队列返回损坏的管道
【发布时间】:2013-03-28 00:42:24
【问题描述】:

当使用 azure-sdk-for-php 长轮询 Azure 队列存储时,如果我的请求间隔超过 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);
        }
    }

}

【问题讨论】:

标签: php sockets azure long-polling azure-storage-queues


【解决方案1】:

这看起来像是过载或超时问题。 PHP 库无法写入 Azure 套接字。可能您使用无限循环 while(true) { ... } 超出了 Azure 负载限制。

不要在每个循环中创建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 - Polling an Azure Queue

【讨论】:

  • 你提到的那一行只是为了测试目的。我试图reopen 套接字...问题是如果我不在 30 秒内发出请求,套接字就会死掉。这就是我试图重生套接字的原因。
  • 好的,这是azure-sdk-for-php 的问题,QueueService 应该在需要时重新打开listMessages 上的套接字。
猜你喜欢
  • 1970-01-01
  • 2021-11-10
  • 2010-10-28
  • 2011-03-19
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多