Тайм-аут соединения Zend Imap - PullRequest
       7

Тайм-аут соединения Zend Imap

0 голосов
/ 15 октября 2010

Я использую предоставляемые Zend Framework классы IMAP для доступа к сообщениям Gmail через imap.Я получаю доступ к заголовкам сообщений всех сообщений в папке входящих сообщений по одному и индексирую их локально.Сценарий отлично работает для входящих сообщений с сообщениями менее 10000. Для больших входящих сообщений сценарий теряет соединение, возможно, из-за превышения времени ожидания.

Вот трассировка стека:

Сообщение об исключении: не можетчтение - соединение закрыто?

trace:

# 0 /home/dev/trunk/Zend/Mail/Protocol/Imap.php(168): Zend_Mail_Protocol_Imap -> _ nextLine ()
# 1 /home/dev/trunk/Zend/Mail/Protocol/Imap.php(285): Zend_Mail_Protocol_Imap -> _ nextTaggedLine (NULL)
# 2 /home/dev/trunk/Zend/Mail/Protocol/Imap.php(587): Zend_Mail_Protocol_Imap-> readLine (NULL, 'TAG103')
# 3 /home/dev/trunk/Zend/Mail/Storage/Imap.php(353): Zend_Mail_Protocol_Imap-> fetch (UID, 12267)
# 4 /home/dev/trunk/model/gmail_imap_oauth.class.php(121): Zend_Mail_Storage_Imap-> getUniqueId (12267)

Существует ли возможный способ сохранить соединение живымна более длительный срок?Я запускаю этот скрипт через командную строку и пытался увеличить максимальное время выполнения скрипта в php.ini, это не помогло.

1 Ответ

1 голос
/ 16 октября 2010

Здесь функция

открытая функция indexAllMails ($ startIndex = 1) {

$this->_imap = new Zend_Mail_Protocol_Imap('imap.gmail.com', '993', true);
$authenticateParams = array('XOAUTH', $initClientRequestEncoded);
$this->_imap->requestAndResponse('AUTHENTICATE', $authenticateParams);

//Create the mail storage Object
$this->_storage = new Zend_Mail_Storage_Imap_Wrapper($this->_imap);

//Select Folder
$this->_storage->selectFolder("[Gmail]/All Mail");


$numMessagesTotal = $this->_storage->countMessages();
if($numMessagesTotal == 0 ) return true;

for($i=$startIndex;$i<=$numMessagesTotal;$i++)
{
  try {
    $uniqueId = $this->_storage->getUniqueId($i);
    $message = $this->_storage->getMessage($i);
  }
  catch(Exception $ex)
  {
      log("Error getting Unique id",'index');
      log($ex->getMessage(),'index');
      log($ex->getTraceAsString(),'index');

      if($ex->getMessage() == 'cannot read - connection closed?')
      {
          //Timeout :(
          return true;
      }
      else
        continue;
  }

  $from = $message->from;
  echo $from;
}

}

...