Обрабатывать HTTP POST с помощью PHP - PullRequest
1 голос
/ 07 октября 2010

Я боролся полдня и пришел к выводу, что это невозможно. Я выбросил свои php-скрипты и переписал его на perl, и он с самого начала работал так, как я хотел, чтобы он работал. Тем не менее, я хочу выяснить, может ли такая тривиальная задача быть правильно выполнена в PHP. Вопрос: у меня произвольно долгая (по размеру и времени) загрузка файла (через POST с необработанными данными), и мне просто нужно сохранить его в файл с PHP. В PHP он работает так, что сначала полностью обрабатывает опубликованные данные, сохраняет их в файл, а затем начинается выполнение моего сценария (загрузка файла длится 30 минут). Даже если я попытался открыть ("php: / stdin" или php: // input), это все равно работало с такой задержкой. Что мне действительно нужно, так это возможность последовательно обрабатывать входящие опубликованные данные. Я попробовал: 1) modphp, 2) php-cgi, 3) php-cli работать как исполняемый файл cgi. Несмотря на то, что php-cgi предназначен для использования cgi, он все же предварительно обрабатывает опубликованные данные (так что $ _POST становится доступным) и не работает так же, как обычный momphp. Версия CLI, запускаемая как скрипт cgi, не работает, так как она вообще не может читать из php: // stdin или php: // input! Что бы я ни пытался, у меня ничего не получалось, и я пришел к выводу, что это не может быть сделано с помощью PHP ... или может?

спасибо

Ответы [ 2 ]

0 голосов
/ 07 октября 2010

звучит так, как будто вы хотите передавать данные. для этого вам нужно настроить сокет, который готов к приему данных в виде потока, т.е. заменить веб-сервер apache.

Ваша проблема не в языке, а в веб-сервере. веб-сервер прослушивает порт 80, а затем делает то, что делает. Например, запишите данные в файл и запустите скрипт php.

вы можете создать пользовательскую программу порта, как вы это делали с Pearl. Вы также можете сделать то же самое с PHP и прослушивать порт 80, используя php-скрипт, управляемый из командной строки, а не тот, который находится внутри apache. Но PHP не лучший язык для этого ... Я бы предложил Python.

С HTTP-связью связаны накладные расходы, возможно, вам понадобится более простой протокол, который может сократить время загрузки.

если ваша загрузка занимает так много времени, вы можете сделать это AJAX-методом и позволить ему продолжаться, пока ваше клиентское приложение все еще активно. клиентское приложение AJAX также может разделить его на куски.

0 голосов
/ 07 октября 2010

Конечно, PHP может это сделать.Загруженные файлы хранятся во временном каталоге, пока скрипт PHP не сможет с ними взаимодействовать.Информация, необходимая для этого, находится в массиве $_FILES.

$field_name = 'file'; # from the HTML form control

$move_result = move_uploaded_file(
    $_FILES[$field_name]['tmp_name'],
    $real_destfile
);

if ($move_result) {
    print "successfully uploaded file (originally called '$_FILES[$field_name]['name']' to $real_destfile";
} else {
    print "failed to receive uploaded file.";
}
...