2015-11-15 5 views
5

В настоящее время я использую следующую команду php exec для загрузки URL-адреса на стороне сервера, поскольку мне нужно решение, которое не включает задание cron, а также асинхронное, то есть пользователь может перемещаться от формы страницы после того, как задача инициируется и задача будет по-прежнему выполнять:Curl альтернатива работе Cron PHP

exec("nohup curl ".$dbupdateurl." > /dev/null 2>&1 & echo $!"); 

Это отлично работает большую часть времени, однако, весьма непредсказуем. Есть ли лучший/более солидный способ достичь этого?

Спасибо,

Matt

+0

Что вы подразумеваете под * непредсказуемым *? –

+0

Я использую страницу для создания базы данных в среде wordpress. Иногда сценарий не заканчивается, т. Е. Составляет только 80% базы данных. – user1419810

+0

звучит как проблема со сценарием, не связанным с тем, как его вызов –

ответ

0

Если вы используете PHP-FPM, вы можете использовать fastcgi_finish_request:

Эта функция сбрасывает все данные ответа клиенту и завершает запрос. Это позволяет выполнять трудоемкие задачи, не оставляя открытое соединение с клиентом.

Таким образом, вы можете использовать собственные функции PHP для выполнения своего веб-запроса после того, как пользователь уже получил ответ. Пример того, как использовать эту функцию можно найти в example of how to use fastcgi_finish_request()

Если вы не используете PHP-FPM, вы можете использовать JobQueue как Gearman, чтобы сделать работу за пределами первоначального запроса. Это, наверное, самый надежный способ сделать это, поскольку это специальная система для работы с этими видами работ.

Также обратите внимание, что curl can do async http requests. Если проблема в том, что вы не хотите ждать ответа HTTP, это может быть проще, чем введение JobQueue.

Последнее, но не менее важное: вы можете использовать дополнительный PHP-процесс для выполнения работы. См. How can I do time consuming task after sending response to client и php execute a background process

Смежные вопросы