PHP PEAR Ошибка контейнера - PullRequest
       30

PHP PEAR Ошибка контейнера

0 голосов
/ 18 февраля 2011

Хорошо, я впервые задаю вопрос здесь. Моя проблема настолько неловкая, насколько трудно добраться до сути. История такова: у меня есть эта маленькая система, которая отправляет много приглашений по электронной почте (не спам). Так что, будучи разумным, я не использую функцию PHP mail (), Я использую классы PEAR, такие как Mail, Mail_Queue, Net_SMTP и т. Д. Единственная проблема в том, что мои журналы ошибок заполняются множеством ошибок, таких как:

PHP Notice:  Error in sending mail: 
Mail Queue Error: Cannot initialize container in /usr/lib/php/PEAR.php on line 873

А потом, конечно:

[18-Feb-2011 17:38:44] PHP Fatal error:  
Allowed memory size of 33554432 bytes exhausted 
(tried to allocate 3 bytes) in /usr/lib/php/PEAR.php on line 844

Вот код, который помещает в почтовую очередь (внутри класса Newsletter)

//I know passing the DSN as the string is kind of deprecated, 
//but it;'s the only way it works on my system
$dsn ="mysql://$db_user:$db_pass@$db_host/$db_name";
$db_options = array();
$db_options['type']       = 'db';
$db_options['dsn']        = $dsn;
$db_options['mail_table'] = TABLE_QUEUE;

$this->host = '-- valid host here --';//data in these strings has been obscured
$this->username = '-- valid username here --';
$this->password = '-- valid password here --';

//optionally, a 'dns' string can be provided instead of db parameters.
//look at DB::connect() method or at DB or MDB docs for details.
//you could also use mdb container instead db
//$server = isset($_SERVER['SERVER_NAME'])?$_SERVER['SERVER_NAME']:'localhost';
$mail_options = array(
    'driver'   => 'smtp',
    'host'     => $this->host,
    'port'     => 25,
    'auth'     => true,
    'username' => $this->username,
    'password' => $this->password,
);
$this->mail_queue = new Mail_Queue($db_options, $mail_options);

Еще немного кода,

public function sendChunk($start, $count)
{
    global $db;
    $ids = $db->get_results("SELECT DISTINCT id_user as id FROM ".TABLE_QUEUE);
    $ret = array();
    foreach ($ids as $id)
        $ret[] = $id->id;
    unset($ids);        
    $this->mail_queue->sendMailsInQueue($count, $start, 1);
    return true;
}

Проблема в том, что я дважды проверил каждую строку кода, которую написал, и он выполняет свою работу. Единственная проблема в том, что иногда он отказывается отправлять письма. Заранее спасибо за ответы.

Ответы [ 2 ]

1 голос
/ 16 апреля 2011

Я переключился на MDB2 вместо DB

$db_options['type']       = 'db';

до

$db_options['type']       = 'mdb2';

это помогло справиться с проблемой исчерпания памяти, я все еще пытаюсь позаботиться об инициализации контейнера в /usr/lib/php/PEAR.php проблеме

Ok нашел решение для ошибок контейнера: Примените этот патч http://svn.php.net/viewvc/pear/packages/Mail_Queue/trunk/Mail/Queue.php?r1=303876&r2=309126

0 голосов
/ 18 февраля 2011
  1. Попробуйте ограничить результат. используя предел в вашем утверждении выбора.

  2. Попробуйте очистить старую главную очередь.

...