PHP: будет ли cURL заканчиваться в фоновом режиме или блокировать все дальнейшее выполнение скрипта?

Я создаю приложение, которое в какой-то момент сворачивает некоторое содержимое из внешнего URL. До сих пор это всегда заканчивалось довольно быстро/мгновенно. Однако я не уверен, что произойдет, если внешний сервер займет много времени, чтобы ответить. Будет ли PHP ждать с выполнением следующего кода, пока cURL не будет завершен?

Я не могу проверить это, потому что я не знаю, как "имитировать" более медленный ответ. Я надеюсь, что этот псевдокод сделает мой вопрос ясно:

$ch = curl_init( $some_remote_url );
$fp = fopen( $some_local_file, 'wb' );
curl_setopt( $ch, CURLOPT_FILE, $fp );
curl_setopt( $ch, CURLOPT_HEADER, 0 );
curl_exec( $ch ); // Let's say this takes 20 seconds until the other server responds
curl_close( $ch );
fclose( $fp );
redirect( $some_other_url ); // Will this be executed instantly or only after 20 seconds?

причина, по которой мне это интересно, заключается в том, что я не хотел бы, чтобы мой пользователь смотрел на страницу "Загрузка" в течение 20 секунд, если удаленный сервер отвечал медленно, поэтому мне, вероятно, придется переместить весь процесс на задание cron. Пользователю не нужен результат керлинга мгновенно, поэтому для него не имеет значения, когда процесс завершен.

2 ответов


Curl заблокирует выполнение. Если вы хотите загрузить файл в фоновом режиме (асинхронно), используйте запланированную задачу cron или выполните следующую команду:

system("wget URL &");

Я не знаю, остановит ли это выполнение скрипта, но вы можете создать скрипт, который непосредственно отображает вывод на удаленный компьютер, а затем запускает через AJAX другой скрипт для выполнения действия cURL, которое вы хотите. В конце он вернет ответ, и ваш сценарий JS затем выполнит перенаправление или то, что вы хотите.

конечно, это будет работать только пользователями, у которых JS включен, но просто сказать: каждый, у кого нет JS включен в своем браузере, не может просматривать обычно в сети.