Такой вопрос. Есть у меня плеер на html,js,php. Когда юзер ищет треки ему все выдает и после этого у меня в фоновом режиме отправляется запрос на сервер который ищет информацию о треках и заносит в базу как всё выполняется он возвращает треки уже со всей инфой и вставляется в блок. Но пока выполняется функция поиска информации юзер не может открыть другую страницу так как сервер занят. А поиск инфы выполняется порядка 1-2 минут. Что бы вы посоветовали? Как можно решить проблему?
Нет, он не может это сделать, так как файл сессии открыт с блокировкой на запись. Делай session_write_close или не открывай ее вовсе там, где не надо, и будет у тебя все ок работать.
ну и поиск в 1-2 минуты в наше время как то не очень нормально... может попытаться оптимизировать поиск и ускорить его?
Так долго из за того что он качает обложки и сохраняет их на сервере. Есть идея у меня как можно оптимизировать завтра буду пробовать. В одном запросе порядка 30 песен выдает если искать по исполнителю А что если вызвать эту функцию то скрипт продолжит свое выполнение в фоне и юзер сможет спокойно ходить по страницам.
Тут суть в чем. Юзер открыл страницу, скрипт открыл сессию, заблокировав ее файл. После отрабатывания скрипта, блокировка с файла сессии снимается. Если скрипт работает слишком долго и держит все это время открытую сессию, то другие скрипты не могут стартануть, так как тоже пытаются ее открыть, а она заблокирована. В итоге они становятся в очередь и ждут. Если не открывать сессию, либо закрыть ее после открытия и чтения нужных данных, никому не нужно будет никого ждать. Твой скрипт поиска будет 2 минуты работать, но, так как сессия не заблокирована, юзер сможет свободно открывать другие страницы.
Ясно. А если у меня сессия вызывается она нужна для авторизации. То как быть? Можно прописать session_write_close и все будет работать норм?
Могу посоветовать составить списки альбомов и песен и закачать информацию до того, как её кто-то захочет найти. Чай, дискографии это открытая информация.
могу посоветовать асинхронный курл запросы обрабатываются пачками на много быстрее получается, чем в цикле дрочить
могу посоветовать использовать альтернативные реализации сессии. (насколько я знаю, Laravel не блокирует сессионный файл.) это было бы самое простое решение с минимумом переделок. другой вариант: не использовать сессию для идентификации пользователя. куки достаточно. третий вариант: использовать очереди заданий. при первом запросе задание на поиск добавляется в очередь и сразу происходит возврат, без ожидания. разбором очереди занимается серверный скрипт. потом со странички по таймеру (или руками) происходит запрос результатов, если ответ не готов, заводим новый таймер и т.д. пока не будет готов или пока пользователь не забъет на это и не перейдёт куда-то ещё. если ты абонент МТС и заказывал расшифровку звонков за месяц, ты понимаешь как это выглядит.
Спасибо всем, для начала попробую курлом укорить процесс, а потом если не устроит дальше пробовать варианты.
именно асинхронным курлом. многопоточным --- Добавлено --- Вот тут готовый код. в функцию засовываешь. передаешь массив url - получаешь массив ответов.
прикол в том, что ты можешь сразу пачку большую собрать и сразу всё запросить. но тут уже от сервера зависит. он так то может и не ответить на часть запросов, если их слишком много.
Ну я так и сделал, у меня зараз поиск выдает ~ 45 треков и я сразу на все запрашиваю данные, и потом уже разбираю как мне нужно.
Вобщем с 2 минут я с помощью мультикурл ускроил до 40 сек. Посидел над методом и поломав голову удалось выжать 18 -19 сек. Как бы я думаю это минимум который можно выжать с кода. Когда оптимизировал код использовал статью из хабра менял функции с долгих на быстрые, помимо курла у меня так же есть два file_get_contents но они срабатывают по условию и я их обрезал тоьько до того елемента который мне нужен PHP: file_get_contents($link,NULL,NULL,0,10000); Как показывает практика это значительно сокращает время работы. У меня таких два запроса и на каждом я сократил ~ по 2 сек.
@Dron-Boy а еще можно сохранять себе то, что часто запрашивают и удалять то, что давно не запрашивали, если места мало) --- Добавлено --- 20сек - это всё равно очень много. Пользователи не любят ждать столько. Ты сам попробуй подождать загрузки хотя бы 10 сек)