медленная загрузка электронной почты php imap (& gt; 10 секунд)

Я создаю свой собственный клиент веб-почты. Например, Roundcube или Squirrelmail. Проблема в том, что моя версия очень медленная, в то время как Roundcube быстр, и я не могу понять, почему это так (источник Roundcube очень большой, и я не могу погрузиться в него …)

Цель — получить последние 50 сообщений из почтового ящика. Моя стратегия:

  1. Получить количество сообщений в почтовом ящике с помощью imap_num_msg ()

  2. Сделать массив порядковых номеров от макс до (макс-50)

  3. Для каждого порядкового номера я запускал функции imap_header () и imap_fetchstructure ()

Это займет 10-15 секунд. Это позволяет мне получить заголовок каждого сообщения, дату, есть ли вложения или нет, от, до и другую информацию.

Тем не менее, Roundcube отображает ту же информацию, но время загрузки составляет всего 3 секунды или около того. Моя стратегия кажется очень неправильной. Как я могу сделать это быстрее? Я уверен, что запускать imap_header и imap_fetchstructure для каждого порядкового номера должен быть медленным, но я думаю, что нет другого способа получить эту информацию … Я делаю что-то вроде этого:

function getMessageBySequenceNumber($imapStream, $sequence_number){

$header = imap_header($imapStream, $sequence_number);
$structure = imap_fetchstructure($imapStream, $sequence_number);

/*
... some code parsing $structure to find out whether this emails has any attachments or not
*/

return [
'uid' => imap_uid($imapStream, $i),
'subject' => $header->subject,
'timestamp' => $header->udate,
'unseen' => $header->Unseen,
'star' => $header->Flagged,
'draft' => $header->Draft,
'size' => $header->size,
'has_attachments_bool' => $has_attachments_bool,
];
}

$imapStream = imap_open();
$first_sequence_number = imap_num_msg(); // lets imagine it returns 100
$last_sequence_number = $first_sequence_number-50;
$sequence_numbers = [100,99,88 ..., 51, 50];

$messages = [];
foreach($sequence_numbers as $sequence_number){
$messages[] = getMessageBySequenceNumber($imapStream, $sequence_number);
}

return $messages;

0

Решение

Вы получаете сообщения один за другим. Это означает, что ваш PHP-код должен ждать, пока удаленный IMAP-сервер ответит вам, затем ваш PHP-код будет обрабатывать (частичный) ответ, отправлять данные обратно на сервер и т. Д.

Используйте библиотеку IMAP, которая позволяет выполнять пакетные операции, и прочитайте RFC 3501, чтобы понять, как ее использовать.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]