Эхо-скрипт прогресса и загрузки 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 дней, приведет к быть тривиальным

Другие вопросы по тегам