Вставка предупреждения "идет загрузка" при передаче почтового сообщения

KAnt23

Новичок
Данные передаются из формы в скрипт отправки почты. Необходимо, чтобы во время отправки почты (около 5 минут) на экране висела надпись типа "подождите идет загрузка". Функции echo и flush не проходят из-за буферизации на сервере: сообщение о загрузке выводится на экран только после передачи всех данных адресату. Что делать?
 

С.

Продвинутый новичок
Нужно запустить рассылку отдельным процессом. Страницу регулярно обновлять и отображать состояние того процесса.
 

Sna@IK

Новичок
Просто очищайте буфер неявно, и вам вообще не понадобится flush
 

С.

Продвинутый новичок
Нет, не приведу. Задача в общем не самая тривиальная, чтобы ее можно было набросать на коленке. Требуется тщательность и привязка к условиям эксплуатации.
 

KAnt23

Новичок
Нет, не приведу. Задача в общем не самая тривиальная, чтобы ее можно было набросать на коленке. Требуется тщательность и привязка к условиям эксплуатации.
Вот мой кусок кода (нерабочий):
...
include "../res/x5engine.php";
...
echo "<H2>Подождите, идет загрузка...</H2>";
$email = new imSendEmail();
$email->sendFormEmail($settings['imEmailForm_3_2'], $form_data, $files_data);
...
Как его изменить? Функции new imSendEmail и sendFormEmail содержатся в скрипте x5engine.php
 

Sna@IK

Новичок
У вас не особо сложная задача, более "костыльный вариант", не требующий универсального решения.
Используйте echo для вызова нужного JS-скрипта, отправьте соответствующие заголовки запрещающие кэширование, ну и напишите функцию которая будет положение вашего "индикатора" определять.
Для неявной очистки включите ее посредствам ob_implicit_flush();
Вот и все решение вашей задачи.
Погуглите. Ответ найдете быстро, я уверен.
 

С.

Продвинутый новичок
KAnt23, такого рода задачи не предназначены для обычной схемы веб-приложения. Надо запускать либо консольно, либо хорошонько изголиться для веба. Если у вас недостаточно опыта в таких делах, то советов с форума будет недостаточно.

Sna@IK,что опять ты "недочитал" из вопроса? Хорош уже несусветную херню нести в очередной раз.
 

Sna@IK

Новичок
Я все прекрасно дочитал, зачем человеку при рассылке, которому просто нужен фоновый индикатор (посмотрите на кусок кода, не смешите меня) нужно реализовывать многопоточность.
Извиняюсь конечно, но в данный момент "несусветную херню" несете вы.
 

KAnt23

Новичок
У вас не особо сложная задача, более "костыльный вариант", не требующий универсального решения.
Используйте echo для вызова нужного JS-скрипта, отправьте соответствующие заголовки запрещающие кэширование, ну и напишите функцию которая будет положение вашего "индикатора" определять.
Для неявной очистки включите ее посредствам ob_implicit_flush();
Вот и все решение вашей задачи.
Погуглите. Ответ найдете быстро, я уверен.
Спасибо, но я не совсем понял, если я вставлю заголовки и использую ob_implicit_flush(); то я могу через echo могу отражать обычный текст без задержки и мне не надо писать даже JS-скрипт. Это так?
 

Sna@IK

Новичок
Почему=) Вам JS скрипт (на том же jQuery), нужен будет просто для изменения позиции прогресс бара. (это функция, в которую будете передавать нужное положение progress bar'a).
Далее, вам нужна функция (уже на PHP), которая будет определять положение бара в зависимости от процесса (задачи). Запущена она будет циклически.
В ней вы можете делать что хотите, если у вас не циклический процесс (например, передача данных), то процесс можно разбить на состовные (в зависимости от готовности частей и будет определение progress bar'a).
А через echo вы вызываете JS скрипт, который и будет отражать текущее состояние прогресс бара динамически, именно за счет неявной очистки буфера.
Если вы до сих пор еще не смогли найти решение, вы явно не гуглили. Решений куча. Для вашего - многопоточность точно не нужна (можно было бы реализовать, но это сложновато и не целесообразно для вашего примера).
 

KAnt23

Новичок
Почему=) Вам JS скрипт (на том же jQuery), нужен будет просто для изменения позиции прогресс бара. (это функция, в которую будете передавать нужное положение progress bar'a).
Далее, вам нужна функция (уже на PHP), которая будет определять положение бара в зависимости от процесса (задачи). Запущена она будет циклически.
В ней вы можете делать что хотите, если у вас не циклический процесс (например, передача данных), то процесс можно разбить на состовные (в зависимости от готовности частей и будет определение progress bar'a).
А через echo вы вызываете JS скрипт, который и будет отражать текущее состояние прогресс бара динамически, именно за счет неявной очистки буфера.
Если вы до сих пор еще не смогли найти решение, вы явно не гуглили. Решений куча. Для вашего - многопоточность точно не нужна (можно было бы реализовать, но это сложновато и не целесообразно для вашего примера).
Вы меня действительно не поняли. Я не так силен в программировании на php. Для начала я хотел бы разобраться, как мне избежать буферизации на сервере. Даже функция flush не помогает, если ее вставить вместо echo с простейшим сообщением. На этом этапе мне прогресс бар не нужен. Я просто запрашивал простейший метод обойти эту особенность при выводе данных через php.
 
Сверху