За последние 24 часа нас посетили 18697 программистов и 1602 робота. Сейчас ищет 951 программист ...

Асинхронный php

Тема в разделе "PHP для новичков", создана пользователем Dron-Boy, 28 янв 2018.

  1. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Такой вопрос. Есть у меня плеер на html,js,php. Когда юзер ищет треки ему все выдает и после этого у меня в фоновом режиме отправляется запрос на сервер который ищет информацию о треках и заносит в базу как всё выполняется он возвращает треки уже со всей инфой и вставляется в блок. Но пока выполняется функция поиска информации юзер не может открыть другую страницу так как сервер занят. А поиск инфы выполняется порядка 1-2 минут. Что бы вы посоветовали? Как можно решить проблему?
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Нет, он не может это сделать, так как файл сессии открыт с блокировкой на запись. Делай session_write_close или не открывай ее вовсе там, где не надо, и будет у тебя все ок работать.
     
    [vs] нравится это.
  3. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    ну и поиск в 1-2 минуты в наше время как то не очень нормально... может попытаться оптимизировать поиск и ускорить его?
     
  4. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Так долго из за того что он качает обложки и сохраняет их на сервере. Есть идея у меня как можно оптимизировать завтра буду пробовать. В одном запросе порядка 30 песен выдает если искать по исполнителю
    А что если вызвать эту функцию то скрипт продолжит свое выполнение в фоне и юзер сможет спокойно ходить по страницам.
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Тут суть в чем. Юзер открыл страницу, скрипт открыл сессию, заблокировав ее файл. После отрабатывания скрипта, блокировка с файла сессии снимается. Если скрипт работает слишком долго и держит все это время открытую сессию, то другие скрипты не могут стартануть, так как тоже пытаются ее открыть, а она заблокирована. В итоге они становятся в очередь и ждут.

    Если не открывать сессию, либо закрыть ее после открытия и чтения нужных данных, никому не нужно будет никого ждать. Твой скрипт поиска будет 2 минуты работать, но, так как сессия не заблокирована, юзер сможет свободно открывать другие страницы.
     
  6. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    А как не открыть сессию?
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Ээээ...не вызывать session_start... И убедиться, что в конфигах не проставлен автостарт для нее.
     
  8. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Ясно. А если у меня сессия вызывается она нужна для авторизации. То как быть? Можно прописать session_write_close и все будет работать норм?
     
  9. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    по поводу поиска в две минуты, ты запрашиваешь с другого сервера курлом?
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну да. В начале скрипта считать всё нужное, и сразу session_write_close()
     
  11. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Нет через file_get_content
     
  12. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Могу посоветовать составить списки альбомов и песен и закачать информацию до того, как её кто-то захочет найти. Чай, дискографии это открытая информация.
     
    Dron-Boy нравится это.
  13. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    могу посоветовать асинхронный курл
    запросы обрабатываются пачками
    на много быстрее получается, чем в цикле дрочить
     
    Dron-Boy нравится это.
  14. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    могу посоветовать использовать альтернативные реализации сессии. (насколько я знаю, Laravel не блокирует сессионный файл.) это было бы самое простое решение с минимумом переделок.

    другой вариант: не использовать сессию для идентификации пользователя. куки достаточно.

    третий вариант: использовать очереди заданий. при первом запросе задание на поиск добавляется в очередь и сразу происходит возврат, без ожидания.
    разбором очереди занимается серверный скрипт.
    потом со странички по таймеру (или руками) происходит запрос результатов, если ответ не готов, заводим новый таймер и т.д. пока не будет готов или пока пользователь не забъет на это и не перейдёт куда-то ещё. если ты абонент МТС и заказывал расшифровку звонков за месяц, ты понимаешь как это выглядит.
     
    #14 artoodetoo, 29 янв 2018
    Последнее редактирование: 29 янв 2018
    Dron-Boy нравится это.
  15. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Спасибо всем, для начала попробую курлом укорить процесс, а потом если не устроит дальше пробовать варианты.
     
  16. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    именно асинхронным курлом.
    многопоточным
    --- Добавлено ---
    Вот тут готовый код.
    в функцию засовываешь.
    передаешь массив url - получаешь массив ответов.
     
    Dron-Boy нравится это.
  17. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Спасибо, опробовал разница значительная есть curl 10 запросов 0.40, file_get_contents в цикле 2.25
     
    #17 Dron-Boy, 29 янв 2018
    Последнее редактирование: 29 янв 2018
  18. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Вобщем удалось ускорить работу в 1.5 раза. Пока устраивает.
     
  19. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    прикол в том, что ты можешь сразу пачку большую собрать и сразу всё запросить.
    но тут уже от сервера зависит.
    он так то может и не ответить на часть запросов, если их слишком много.
     
  20. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Ну я так и сделал, у меня зараз поиск выдает ~ 45 треков и я сразу на все запрашиваю данные, и потом уже разбираю как мне нужно.
     
  21. Максим1233331

    Максим1233331 Новичок

    С нами с:
    28 янв 2018
    Сообщения:
    19
    Симпатии:
    0
    Ajax попробуй)
     
  22. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    [​IMG]
     
    Dron-Boy нравится это.
  23. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    ОК, спасибо. А ты можешь кинуть ссылку что бы почитать об этом?*
     
  24. Dron-Boy

    Dron-Boy Старожил

    С нами с:
    20 ноя 2014
    Сообщения:
    1.041
    Симпатии:
    126
    Вобщем с 2 минут я с помощью мультикурл ускроил до 40 сек. Посидел над методом и поломав голову удалось выжать 18 -19 сек. Как бы я думаю это минимум который можно выжать с кода. Когда оптимизировал код использовал статью из хабра менял функции с долгих на быстрые, помимо курла у меня так же есть два file_get_contents но они срабатывают по условию и я их обрезал тоьько до того елемента который мне нужен
    PHP:
    1. file_get_contents($link,NULL,NULL,0,10000);
    Как показывает практика это значительно сокращает время работы. У меня таких два запроса и на каждом я сократил ~ по 2 сек.
     
  25. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    @Dron-Boy а еще можно сохранять себе то, что часто запрашивают и удалять то, что давно не запрашивали, если места мало)
    --- Добавлено ---
    20сек - это всё равно очень много.
    Пользователи не любят ждать столько. Ты сам попробуй подождать загрузки хотя бы 10 сек)