2010-06-02 6 views
4

У меня есть PHP-скрипт, который запускается через ajax. Этот скрипт PHP использует exec() для запуска отдельного PHP-скрипта через оболочку.Ajax/PHP - должен ли я использовать один длинный сценарий или опрос?

Сценарий, который вызывается через exec(), может занять около 30 секунд. Мне нужно обновить интерфейс после его завершения.

Какой из этих вариантов является предпочтительным?

a) Оставьте HTTP-соединение открытым в течение 30 секунд и дождитесь его завершения.
b) Попросите exec() запустить PHP-скрипт в фоновом режиме, а затем использовать ajax-опрос для проверки завершения (каждые 5 секунд или около того).
c) Что-то еще, о чем я не думал.

Спасибо, Брайан

ответ

2

Опрос сервер обновлений каждые несколько секунд. Когда вы оставляете соединения открытыми в течение этого длительного периода времени, всегда существует вероятность того, что они могут быть удалены сервером или браузером (время ожидания браузеров, если HTTP-запрос занимает слишком много времени).

+0

Можно ли обойти это, используя функцию set_time_limit() PHP и параметр KeepAliveTimeout от Apache? – Brian

+2

Вы можете, но это не хорошие варианты проблемы, которую вы опубликовали. Решение, которое я вам дал, - ваш лучший вариант. Был там, сделал это. –

1

Вариант b) чувствует себя слишком сдержанным для меня. Требуется ли серверу , чтобы получить запрос после завершения 30 секунд, иначе он попадет в плохое состояние? (например, он не отказывается от ресурсов или чего-то подобного). Если это так, обязательно пойдите с a) methinks.

Что касается c), возможно, вы найдете что-то на AJAX Pattern's Web Site под номером Browser-Server Diaglog.

+0

Ответ необходим только для обновления пользовательского интерфейса, без ресурсов сервера. Одна из моих серьезных проблем также заключается в том, какой вариант будет лучше, поскольку число одновременных пользователей увеличивается? Благодарю. – Brian

1

Вариант AJAX кажется мне хорошим. Одним из вариантов является стиль Comet (Ajax Push) для минимизации требуемого трафика: сервер отправляет сигнал клиенту (браузеру), когда ему нужно что-то сказать (обновить интерфейс).

1

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

b) Если это 30 секунд, я бы опрос не так часто, как каждую секунду. я увеличил бы время опроса. время выполнения всегда 30 секунд? Пример стиль опроса (полезная нагрузка JSON):

 

# trigger job/execution 
POST /job 
=> response gives 301 redirect to /jobs/{job-id} 

# polling 
GET /jobs/{job-id} 
=> {status:busy} 
or 
=> {status:completed,result:...} 
 

, но в конце концов, это зависит от проблемы, я хотел б) больше, но это добавляет больше усилий для реализации. возможно, у вас есть более подробная информация? это сценарий с высоким трафиком?

+0

Спасибо. Время выполнения не всегда 30 секунд - на самом деле, как правило, это будет намного меньше - но это также может быть больше. На данный момент трафик низкий, менее 10 одновременных пользователей - но я ищу решение, которое будет масштабироваться лучше всего по мере его увеличения. – Brian

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

  • Нет связанных вопросов^_^