PHP POST и выполнить для загрузки больших файлов - PullRequest
3 голосов
/ 06 декабря 2011

У меня есть следующие файлы PHP:

  • fileUploadForm.php
  • handleUpload.php

fileUploadForm содержит следующий вывод:

  • output $ _SESSION ['errorMessage'] (если есть)
  • Вывести форму загрузки файла, которая публикует файл handleUpload.php

handleUpload.php выполняет следующие действия:

  • Проверяет сеанс (перенаправляет на вход в систему, если проверка не пройдена)
  • Проверяет файл (устанавливает $ _SESSION ['errorMessage'], если проверка не пройдена)
  • Сканировать файл на наличие вирусов
  • MoveFile
  • Обновление базы данных

У скрипта возникли проблемы при загрузке больших файлов. Я установил все настройки php.ini, касающиеся загрузки файлов, на смехотворные масштабы для целей тестирования. Поэтому я не верю, что проблема связана с конфигурацией.

Меня сбивает с толку следующее поведение:

  • Когда я наблюдаю рост файла в tmp, загрузка файла продолжается намного позже установленного max_input_time. Насколько я понимаю, как только max_input_time будет превышено, сценарий будет прерван, и, в свою очередь, произойдет загрузка файла. Есть мысли о том, почему этого не происходит?

  • если я остановлю загрузку файла в середине потока и обновлю fileUploadForm (не отправлять его повторно), скрипт выдаст сообщения об ошибках, связанных с проверкой файла, которые установлены в handleUpload. Кажется, это указывает на то, что, хотя загрузка файла не завершилась, выполняются строки кода в handleUpload. Php выполняет скрипт и получает данные формы асинхронно? Я бы подумал, что сценарий будет ждать, пока все данные формы будут получены, прежде чем выполнять какой-либо код. Но это предположение противоречит поведению, которое я наблюдаю. В каком порядке происходит выполнение POST / скрипта данных?

  • Когда max_input_time, наряду с остальными значениями конфигурации, установлено смехотворно большим для тестирования, очень большие загрузки будут завершены. Тем не менее, остальная часть сценария просто кажется умирает. то есть сканирование на вирусы и перемещение файлов никогда не происходят, равно как и обновления базы данных. У меня установлена ​​обработка ошибок для каждого действия в скрипте, но никаких ошибок не выдается. Страница, кажется, только что умерла. Любые мысли о том, почему это может произойти / как отловить такую ​​ошибку?

Заранее спасибо. Kate

1 Ответ

0 голосов
/ 06 декабря 2011

Эта цитата из вашего второго вопроса отвечает (хотя бы частично) на два других:

I would have thought that the script would wait until all form data was received before executing any code.

Для того, чтобы PHP мог обрабатывать все входные данные, Apache (или любой другой HTTP-сервер, который вы используете) сначала дождется завершения загрузки файла и только после этого обработает скрипт PHP.Таким образом, проверка PHP max_input_time вступит в действие после завершения процесса загрузки файла.

Теперь, в таком случае, вы, вероятно, спросите, почему сканирование вирусов, перемещение файлов и любые другие скриптовые процедуры не выполняются.Это не происходит, поскольку логично, что любой счетчик времени, связанный с PHP, должен начинаться с выполнения скрипта, и это должно происходить после получения всех входных данных.Что ж, это ДОЛЖНО иметь место и быть честным - мои мысли по этому поводу являются своего рода выстрелом в темноте, но хорошо ... либо какой-то другой предел превышен, либо сценарий запускается с запросом, но приостанавливаетсяhttpd до тех пор, пока он не будет готов и эффективно - некоторые из этих счетчиков могут истечь в это время.

Я не знаю, как ответить на ваш второй вопрос, так как обновление будет означать, что все данные возвращаются-Пост-ред и должен быть повторно обработан.Я сомневаюсь, что вы бы поступили иначе - просто загрузите handleUpload.php без повторной отправки формы, но я должен упомянуть о такой возможности.Вторым предположением может быть то, что если первый запрос был неожиданно завершен - во второй раз происходит сбор мусора и / или процесс восстановления.

Надеюсь, что это немного прояснится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...