Может ли PHP (с Apache или Nginx) проверить HTTP-заголовок до завершения запроса POST?

Вот простая форма загрузки файла HTML.

<form enctype="multipart/form-data" action="upload.php" method="POST"> Send this file: <input name="userfile" type="file" /> <input type="submit" value="Send File" /> </form> 

И php-файл довольно прост.

 <?php die(); 

Как видите, скрипт PHP ничего не делает на стороне сервера. Но когда мы загружаем большой файл, процесс по-прежнему стоит много времени.

Я знаю, мой PHP-код будет выполнен после завершения процесса POST. PHP ДОЛЖЕН подготовить массив с именем $ _POST и $ _FILES перед анализом первой строки.

Поэтому мой вопрос: может ли PHP (с Apache или Nginx) проверить HTTP-заголовок до завершения запроса POST?

Например, некоторые расширения PHP или модули Apache.

Мне сказали, что Python или node.js могут решить эту проблему, просто хочу знать, может ли PHP или нет.

Благодарю.

================ ОБНОВЛЕНИЕ 1 ================

Моя цель – заблокировать какой-то неожиданный запрос на отправку файлов. Например, мы создали уникальный токен в качестве URL-адреса POST (например, http://some.com/upload.php?token=268dfd235ca2d64abd4cee42d61bde48&t=1366552126 ). На стороне сервера мой код:

 <?php define(MY_SALT, 'mysalt'); if (!isset($_GET['t']) || !isset($_GET['token']) || abs(time()-$_GET['t'])>3600 || md5(MY_SALT.$_GET['t'])!=$_GET['token']) {//token check die('token incorrect or timeout'); } //process the file uploaded /* ... */ 

Код выглядит понятным: -P, но я не могу сохранить пропускную способность, как я ожидал. Причина в том, что PHP-код работает слишком поздно, мы не можем проверить токен до завершения загрузки файла. Если кто-то загружает файл без правильного токена в URL-адресе, сеть и процессор моего сервера все еще теряются.

Любое предложение приветствуется. Большое спасибо.

Ответ всегда да, потому что это Open Source. Но, во-первых, некоторый фон: (я буду говорить только о nginx, но Apache почти то же самое.)

Запрос на загрузку сразу не отправляется на ваш PHP-сервер – nginx буферизирует тело загрузки, поэтому ваше приложение PHP не связывает 100 МБ ОЗУ, ожидая, что какой-нибудь парень загрузит через 300 бод-модемов. Недостатком является то, что ваше приложение даже не узнает о загрузке до тех пор, пока оно не будет выполнено или в основном не будет загружено (в зависимости от client_body_buffer_size ).

Но вы можете написать модуль для привязки к различным «фазам» внутри nginx. Один из крючков вызывается, когда заголовки сделаны. Вы можете писать модули в LUA, но это порог довольно сложный. Может быть модуль, который отправит «pre-upload» hook к вашему скрипту через HTTP. Но это не здорово для производительности.

Скорее всего, вам даже не понадобится модуль. Файлы nginx.conf могут делать то, что вам нужно. (т. е. направлять запрос на разные сценарии на основе заголовков или возвращать разные коды ошибок на основе заголовков.) См. эту страницу для примеров проверки заголовков (особенно «WordPress w / W3 Total Cache с использованием диска (Enhanced)»): http: / /kbeezie.com/nginx-configuration-examples/

Прочитайте документы, потому что некоторые общие требования к проверке заголовков уже имеют свои собственные директивы (т.е. client_max_body_size отклонит запрос, если заголовок Content-Length слишком велик).

На уровне HTTP нет решения, но это возможно на уровне TCP . См. Ответ, который я выбрал в другом вопросе:

Перерыв загрузки HTTP-файла с сервера с помощью PHP или Apache