2013-03-28 29 views
2

当长轮询天青队列存储与天青-SDK换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); 
     } 
    } 

} 
+0

什么是/SocketWrapper.php的180-200行? – Abela 2013-04-07 03:05:02

+0

@Yhanhannan他们正在使用PEAR软件包(HTTP_Request2)。我用你所要求的几行创建了一个要点:https://gist.github.com/fedeisas/5331164#file-socketwrapper-php-L175。 Thanks1 – fedeisas 2013-04-07 16:21:29

回答

1

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

不要在每个循环创建queueService,因为您无限地关闭和打开pear套接字。

尝试移动线:

$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

+0

您提到的那一行仅用于测试用途。我试图“重新打开”套接字......问题在于,如果我在30秒内未提出请求,套接字就会死亡。这就是我试图重新生成套接字的原因。 – fedeisas 2013-04-11 21:25:53

+0

好的,所以它是'azure-sdk-for-php'的问题,如果需要,QueueService应该在'listMessages'上重新打开套接字。 – rogal111 2013-04-12 15:01:17