2016-07-19 2 views
0

У меня есть html, который запускает php несколько раз (около 20). Что-то вродеPhp несколько сценариев очереди?

for(i=0;i<20; i++){ 
$.get('script.php?id='+i,function(){...}); 
} 

Каждый раз, когда запускается скрипт, он получить контент через различные веб-сайты (каждый раз, когда другой один), так что каждый сценарий занимает от 1 до 10 секунд, чтобы закончить и дать ответ. Я хочу запустить все скрипты одновременно быстрее, но 2 вещи замедляют работу: первый на странице html, кажется, что ajax запрошен в очереди после первых пяти, по крайней мере, разработчик Chrome сказал мне, что ... (это можно легко исправить, я думаю, я еще не удосужился найти решение); во-вторых, на стороне php: даже если первые 5 скриптов запускаются вместе, они запускаются последовательно, даже не в порядке. Я В поставить некоторые

echo microtime(true); 

вокруг сценария, чтобы получить там, где сценарий медленно и то, что я узнал (немного удивлены), что время на начале сценария (тот, который должен быть запущен в почти в то же время на всем скрипте) отличается: разница очень последовательна, а также 10 секунд, как если бы второй скрипт дождался первого конца до начала. Как я могу запустить скрипт одновременно одновременно? Спасибо.

+1

Javascript запускается внутри однопоточно и делает вещи в сериализованном виде. Google для «веб-работников» –

+0

PHP будет запускать запросы в последовательном порядке, а не в потоке. Вы можете использовать curl для выполнения нескольких запросов. http://php.net/manual/en/function.curl-multi-init.php –

ответ

0

Я очень откровенно сообщить, что вы должны не пытаться что-либо «многопоточный» здесь «ни особенно« фантазию».

Дизайн вашего приложения, чтобы иметь какое-то очереди (это может быть простой массив) «вещей, которые нужно сделать». Затем введите «some n» количество начальных запросов AJAX: конечно, не более 3 до 5.

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

Таким образом, «п запросы, но не более чем п запросы,» будут активны в любое время, и да, каждый из них будет принимать разное количество времени, «но никто не заботится. "

«JavaScript не многопоточен», и нам это не нужно. Все делается событиями, которые обрабатываются по одному, и это происходит, чтобы работать красиво.

Ваша программа запускается до тех пор, пока очередь не будет пуста и все выдающиеся запросы AJAX завершены (или сбой).

Нет абсолютно никакого преимущества в том, чтобы «получать слишком фантазии», когда запросы, которые вы выполняете, могут занять несколько секунд. Также нет особого преимущества в попытке поставить в очередь слишком много сетевых запросов TCP/IP. Предсказуемая простота, в этом случае, будет (IMHO) правилом дня.

+0

Я хотел бы сделать это, клиент ждет завершения всех запросов перед просмотром результатов, и есть большая разница между ожидая 10 секунд (если все запросы выполняются вместе) и ожидания 1 минута (если запросы выполняются последовательно) на стороне клиента ... Любые предложения? –

+0

Предлагаемый подход позволит вам выполнять «n» запросы параллельно и устанавливать это в соответствии с пределами браузера. Но, возможно ли, чтобы сторона PHP получила всю работу сразу, чтобы * сделать * всю работу сразу и вернуть все ответы на вас за один раз? Просто мысль ... –

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