Я создаю свой собственный клиент веб-почты. Например, Roundcube или Squirrelmail. Проблема в том, что моя версия очень медленная, в то время как Roundcube быстр, и я не могу понять, почему это так (источник Roundcube очень большой, и я не могу погрузиться в него …)
Цель — получить последние 50 сообщений из почтового ящика. Моя стратегия:
Получить количество сообщений в почтовом ящике с помощью imap_num_msg ()
Сделать массив порядковых номеров от макс до (макс-50)
Для каждого порядкового номера я запускал функции 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;
Вы получаете сообщения один за другим. Это означает, что ваш PHP-код должен ждать, пока удаленный IMAP-сервер ответит вам, затем ваш PHP-код будет обрабатывать (частичный) ответ, отправлять данные обратно на сервер и т. Д.
Используйте библиотеку IMAP, которая позволяет выполнять пакетные операции, и прочитайте RFC 3501, чтобы понять, как ее использовать.
Других решений пока нет …