Эхо-скрипт прогресса и загрузки CSV
У меня проблемы с отправкой массива на другую страницу PHP. Мы отправляем массив с одной страницы на другую для создания файла CSV, преобразованного из XML. Итак, мы берем XML-файл объемом 800 МБ и преобразуем его в CSV-файл размером 20 МБ. В нем содержится много информации, которую мы удаляем, и она работает в течение 30 минут.
Во всяком случае, мы периодически используем функцию для вывода прогресса преобразования в браузере с сообщениями:
function outputResults($message) {
ob_start();
echo $message . "<br>";
ob_end_flush();
ob_flush();
}
$ masterArray содержит всю информацию в ассоциативном массиве, который мы проанализировали из XML.
Массив ($ masterArray) в конце мы отправляем из index.php в другой php-файл с именем create_CSV_file.php
Первоначально мы использовали include('create_CSV_file.php') в index.php, но из-за заголовков, используемых в файле CSV, он давал нам сообщения, которые
Предупреждение: невозможно изменить информацию заголовка - заголовки уже отправлены
, Таким образом, мы начали искать решение по перемещению массива, как показано ниже.
echo "<a href='create_CSV_file.php?data=$masterArray'>**** Download CSV file ***</a>";
Я продолжаю получать сообщение об ошибке с указанным выше эхо:
Примечание: преобразование массива в строку
Каков наилучший метод, позволяющий показывать эхо-операторы с сервера во время его работы, а затем загружать результаты CSV в конце?
1 ответ
Итак, прежде всего, использование данных в URL (GET) имеет некоторые серьезные ограничения. Старая версия IE поддерживает только 4096 байтов. Кроме того, некоторые прокси и другие программы накладывают свои ограничения.
Я уверен, что вы слышали это раньше, но если нет.... Вы не должны запускать процесс, который занимает больше пары секунд (максимум!) С веб-сервера. Они не оптимизированы для этого. Вы определенно не хотите передавать мегабайты данных клиенту только для того, чтобы они могли отправить их обратно на сервер!
Как насчет чего-то вроде этого...
- Пользователь делает веб-запрос (и загружает исходные данные?) На сервер
- Сервер выделяет идентификатор для запроса (случайный "база данных") и создает файл на диске, используя идентификатор в качестве имени (каталог tmp или, по крайней мере, вне веб-корня)
- Сервер запускает новый процесс (PHP?) Для преобразования данных. При запуске он может обновлять базу данных с информацией о прогрессе
- В течение этого времени пользователь может проверить ход выполнения, выполнив последовательность запросов AJAX (или просто обновив страницу, на которой отображается последний статус). Теперь больше контроля над внешним видом
- Когда обработка завершена, процесс на стороне сервера записывает результаты в файл, обновляет базу данных, чтобы показать завершение.
- В следующий раз, когда пользователь проверит состояние, перенаправьте его в файл PHP, который принимает идентификатор и будет считывать файл с диска / передавать его пользователю.
Выгоды:
- Нет длительных HTTP-запросов
- Нет данных, передаваемых назад / вперед клиенту на промежуточном этапе
- Гораздо больше контроля над тем, как пользователи видят прогресс
- В зависимости от применяемого преобразования / сведений, хранящихся в базе данных, вы можете восстановить прерванные задания (сбой сервера)
У него есть один недостаток, который заключается в том, что вам нужно убирать за собой - файлы, которые вы создали на диске, должны быть удалены, однако у вас есть полный аудит всех файлов в базе данных, и удаление всего, что старше x дней, приведет к быть тривиальным