Задать вопрос
@bitrixweb
Вечно молодой, вечно пьяный

PHP Почему выполнение cURL-запроса блокирует все другие запросы cURL?

Всем привет!
Дано: некая страница на php с формой, куда пользователи могут авторизоваться. Форма частично использует cURL для получения данных, которые может выбрать пользователь. При отправке этой формы инициируются запрос к стороннему API (так же через cURL) и ожидается ответ API. Запросы обрабатываются около минуты.

Проблема: когда Пользователь #1 создает задачу инициируется запрос cURL к стороннему API, и пока этот запрос не получит ответ, задачи всех остальных пользователей висят и ждут. С учетом того, что форма для подгрузки возможных значений также использует курл, то активный запрос вешает даже формирование формы у других пользователей.

Я попробовал использовать curl_multi_*, но это не дало ожидаемого результата. Как это решить? Можно ли заставить cURL отрабатывать изолированно, т.е. не блокировать работу другим пользователям сервиса?
  • Вопрос задан
  • 255 просмотров
Подписаться 1 Средний 5 комментариев
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Stepik
    Язык программирования PHP
    1 неделя
    Далее
Пригласить эксперта
Ответы на вопрос 2
NikFaraday
@NikFaraday
Student full-stack Developer
Где ты вы с асинхронностью проиграли) Скорее всего, вы выполняете запрос синхронно что приводит к блокировке основного потока выполнения программы
Ответ написан
Комментировать
SystemX
@SystemX
Программирование и администрирование сайт/сервер
Curl запрос сам по себе не блокирует запросы curl в других скриптах сервера!
А вот session_start() в начале скрипта блокирует сессию php если она хранится на диске. И если запустить такой скрипт и в нем будет долгий curl запрос или просто скрипт будет долго выполняться, то файл сессии будет заблокирован в это время и другой скрипт с session_start() будет ждать пока тот освободится, если ему нужен тот же файл сессии.
Решение:
<?php
session_start();
$mail = $_SESSION['mail']; // пишем или читаем данные сессии
session_write_close();
?>

можете вызвать этот блок вначале, а затем делать длительные запросы или вычисления (здесь конечно уже возникает вопрос почему это делается в общем потоке, но не суть) и скрипты не будут друг друга блокировать на уровне сессии.
Можете данный блок вызвать в конце скрипта если нужно записать результаты запроса или вычислений в сессию юзера, но учтите, что session_start(); нужно вызывать до любого вывода в браузер!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы