Запрос PHP Curl запускает скрипты до конца, но получает ошибку тайм-аута

#php #curl

#php #curl

Вопрос:

У меня есть PHP-скрипт (script 1), который вызывается с веб-сайта с использованием AJAX. Скрипт будет использовать Curl для вызова другого PHP-скрипта (script 2) на сервере. Затем этот скрипт также будет использовать Curl для запуска другого PHP-скрипта (script 3).

Будет выполнен первый вызов curl (выполнить скрипт 2). Однако скрипт 3 всегда возвращает ошибку тайм-аута (но скрипт 3 на самом деле выполняется и делает то, что он должен делать). Просто скрипту 2 не возвращается ответ, если скрипт 2 был выполнен с использованием curl из скрипта 1.

Если я запущу скрипт 2 в веб-браузере, то скрипт 3 будет выполнен, и ответ будет возвращен скрипту 2, и тайм-аута не произойдет.

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

Приведенный ниже код показывает, как скрипт 1 запускает несколько экземпляров скрипта 2. Эта часть работает нормально, я проверил, распечатав информацию в текстовый файл из скрипта 2, и я могу убедиться, что все экземпляры скрипта 2 выполняются / завершаются, а также что все они пытаются выполнить скрипт 3 и что все они получают одинаковую ошибку тайм-аута.

             foreach ($urls as $url) {
               $requests[] = curl_init($url);
               curl_setopt($requests[count($requests) - 1], CURLOPT_RETURNTRANSFER, true);
            }

            $mh = curl_multi_init();
            foreach ($requests as $request) {
               curl_multi_add_handle($mh, $request);
            }


            $running = null;

            do {

                curl_multi_exec($mh, $running);
            } while ($running);

            $responses = array();
            foreach ($requests as $request) {
               $responses[] = curl_multi_getcontent($request);
            }

            foreach ($requests as $request) {
               curl_multi_remove_handle($mh, $request);
            }


           curl_multi_close($mh);
  

Приведенный ниже фрагмент кода показывает, как скрипт 2 выполняет скрипт 3, это будет работать нормально, если я запущу скрипт 2 в браузере, займет около 5 секунд, и выходные данные будут напечатаны в окне браузера без каких-либо ошибок.

   $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_PORT, 80);
  curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
  curl_setopt($ch, CURLOPT_TIMEOUT, 60);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  $output = curl_exec($ch);
  echo $output;
  curl_close($ch);   
  

Если скрипт 2 запущен из скрипта 1, у меня будет эта ошибка, когда скрипт 2 попытается запустить скрипт 3 (количество миллисекунд всегда будет соответствовать моему значению для CURLOPT_TIMEOUT)

 Operation timed out after 60000 milliseconds with 0 bytes received 03/22/2019 06:13:04 pm
  

Комментарии:

1. черт, я так запутался со скриптами 1, 2 и 3

2. Здесь отсутствует много информации, очень трудно помочь, когда мы остаемся в догадках. Вы описали 3 PHP-скрипта и немного Javascript, но показали только 1 фрагмент PHP-кода — и вы не упомянули, что это за скрипт. Вы упомянули time out error , но не показали нам ошибку. Пожалуйста, отредактируйте свой вопрос и покажите нам более подробно.

3. CURLOPT_RETURNTRANSFER очевидно, что это не относится к третьему запросу. либо настройте это по-другому, либо просто верните ответ … как подсказывает здравый смысл. использование curl на одном и том же сервере само по себе сомнительно, если только вы не хотите что-то протестировать.