#php #mysql #imap #status
#php #mysql #imap #Статус
Вопрос:
Мне нужно прочитать статус сообщения, например: количество непрочитанных, прочитанных в каждой учетной записи. Каждая учетная запись является циклом для получения данных для входа из mysql. При успешном входе в систему отправляется количество прочитанных и непрочитанных сообщений. Проблема в том, что для обработки всей учетной записи (17) из mysql требуется около 2 минут. Как сделать это быстрее. Идеальный период составляет от 10 до 30 секунд. Возможно ли это?
Вот мой код:
$sql_sImap=mysqli_query($con,"select * from LOGIN_DB order by imap_user asc");
while($rec_sImap=mysqli_fetch_array($sql_sImap)){
$inbox=imap_open("{mail.xxx:143/novalidate-cert}INBOX", "$rec_sImap[imap_user]" , "$rec_sImap[imap_pw]");
$num=imap_status($inbox,"{mail.xxx:143/novalidate-cert}INBOX", SA_ALL);
$total=$num->messages;
$unread=$num->unseen;
$read=$total-$unread;
echo "
<tr>
<td><a href="main.php?do=mailamp;action=viewamp;sid=$rec_sImap[imap_sid]">$rec_sImap[imap_user]</a></td>
<td>".number_format($unread)."</td>
<td>".number_format($read)."</td>
<td>".number_format($total)."</td>
<td><a href="main.php?do=mailamp;action=del_useramp;sid=$rec_sImap[imap_sid]">del</a></td>
</tr>
";
$unread="";
$read="";
$total="";
}
Как я упоминал выше. Обработка этих строк кода заняла у меня почти 2 минуты. Как я мог бы сделать это быстрее?
С уважением,
Комментарии:
1. Выделите время, чтобы устранить узкое место. Я не думаю, что это MySQL. Я уверен, что большая часть времени будет потрачена на ожидание ответов IMAP.
2. Спасибо, VMai, есть какие-нибудь решения?
3. Я бы рекомендовал переписать ваш код в трех разделах: 1) прочитать полные данные из вашей базы данных в массив (строк), 2) получить данные IMAP из этого массива во второй массив, 3) записать свой вывод HTML. Таким образом, вы можете легко измерить время, проведенное в этих частях.
4. Позвольте мне прояснить. $login_array=array(«Пользователь A»=>»pw_A»,»Пользователь B»=>»pw_B»); $imap_array=array(«msg_1″=> array(«subj»=>»xxx»,»detail»=>»xxx»)); Что тогда?
Ответ №1:
Ваш код выполняет синхронное подключение к каждому серверу IMAP последовательно; это означает, что вам нужно дождаться установления каждого соединения, включая подтверждение сеанса TLS. Это дорогостоящая вещь. Ваша лучшая надежда — переключиться на какую-нибудь библиотеку IMAP, которая поддерживает асинхронное соединение, чтобы вы могли одновременно открывать несколько сокетов TCP, параллельно выполнять сеансовое рукопожатие SSL / TLS, а также запускать необходимый чат IMAP через несколько сокетов одновременно. Я не думаю, что стандартное расширение IMAP PHP может это сделать.