#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 на одном и том же сервере само по себе сомнительно, если только вы не хотите что-то протестировать.