#php #httpresponse
#php #httpresponse
Вопрос:
jQuery.ajax() — это «функция, которая вызывается по завершении запроса». Предположим, я делаю ajax-запрос к ajax.php:
<?php
echo 'complete';
some_functions_that_echo_nothing();
?>
Придется ли завершению ждать some_functions_that_echo_nothing()? Если да, есть ли способ выполнить полное {} сразу после echo и при этом сохранить ajax.php выполнить до конца?
Комментарии:
1. Да, запрос продолжается до конца выполнения вашего PHP-скрипта.
Ответ №1:
Попробуйте вызвать HttpResponse::send();
Комментарии:
1. Я не знаю, как работает этот HttpResponse. Он просто возвращает ответ и поддерживает работу скрипта? Мне это кажется странным. Разве это не остановило бы ваш поток apache. Чтобы это ухудшало производительность сервера?
2. @eduardocereto. Сервер принимает HTTP-запрос со всеми данными. Затем вы начинаете записывать ответ.
echo
в принципеHTTPResponse::write()
. Когда вы отправляете HTTP-ответ, вы отправляете свой HTML непосредственно обратно клиенту. Затем вы можете продолжить выполнение некоторой обработки. Как только вы дойдете до конца файла, ваша обработка должна прекратиться. Все, что это делает, это отправляет страницу обратно раньше обычного.3. @eduardocereto Я предполагаю, что Apache не дерьмо, и он сам себя очищает. Он должен закрыться, если этого не произойдет, то это ошибка в Apache.
Ответ №2:
Я предполагаю, что вы хотите вывести «Complete» и позволить этой функции работать в фоновом режиме, поскольку она очень медленная.
В таком случае поместите эту функцию в отдельный файл. Пусть это будет proc.php
и используйте это вместо:
<?php
echo "Complete';
exec ("/usr/bin/php proc.php >/dev/null amp;");
?>
Это сразу же вернет и запустит proc.php
файл для запуска в фоновом режиме. Конечно, он не сможет вывести результат возврата пользователю, поэтому он должен отправить пользователю электронное письмо, когда он закончит, или выполнить его собственное сохранение.
РЕДАКТИРОВАТЬ: ВСЕГДА очень внимательно относитесь к тому, что вы помещаете внутрь exec
инструкций. Никогда не вводите в него пользовательские данные, если вы не уверены на 100%, что очень тщательно очищаете его. Даже в этом случае у вас действительно нет веской причины использовать пользовательский ввод в exec
вызове.
Комментарии:
1. есть ли какая-либо причина использовать это вместо метода Райноса. Я думал, что системных вызовов следует избегать, где это возможно
2. Мне просто кажется более естественным завершить обработку страницы и начать новое задание только для этой задачи. Это всего лишь простой ответ, вероятно, не лучшее решение проблемы.
3. Лучшим подходом было бы избежать системного вызова и просто добавить задачу в очередь, а задание запускать в cron и извлекать задания из очереди.
4. 1. Вставка задачи в очередь — лучший вариант, хотя это приводит к сложности установки / администрирования.