2012-04-16 29 views
7

Estoy construyendo una aplicación que en cierto punto cursa algunos contenidos desde una URL externa. Hasta ahora, esto siempre ha terminado bastante rápido/al instante. Sin embargo, no estoy seguro de qué pasaría si el servidor externo tardara mucho tiempo en responder. ¿Esperaría PHP con la ejecución del siguiente código hasta que cURL haya terminado?PHP: ¿terminará cURL en segundo plano, o bloqueará toda la ejecución del script adicional?

Realmente no puedo probarlo porque no sé cómo "simular" una respuesta más lenta. Espero que este pseudo-código hace que mi pregunta clara:

$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? 

La razón por la que estoy preguntando acerca de esto es que no me gustaría que mi usuario buscar en una página de "carga" durante 20 segundos en el caso de que el servidor remoto estaba respondiendo lentamente, por lo que probablemente tendría que mover todo el proceso a un trabajo cron. El usuario no necesita el resultado de la curvatura al instante, por lo que no le importa cuando finaliza el proceso.

+0

+1 buena pregunta ... definitivamente después de 20 seg – Baba

Respuesta

4

Curl bloqueará la ejecución. Si desea descargar el archivo en el fondo (asíncrona), o bien utilizar una tarea cron programado, o exec un comando como este:

system("wget URL &"); 
+0

Por lo que yo sé, el uso de system() o exec() no se comporta de forma diferente a las tareas sincrónicas como cURL normal, pero passthru() sí lo hace. Desafortunadamente, todas estas tres funciones están deshabilitadas en la mayoría de los servidores alojados, por razones de seguridad. – ddlab

0

No sé si eso detendría la ejecución de la secuencia de comandos, pero podría crear una secuencia de comandos que represente directamente la salida a la computadora remota y luego inicie a través de AJAX la otra secuencia de comandos para realizar la acción CURL que desee. Al final, devolvería una respuesta y tu script JS luego redirigirá, o lo que quieras.

Por supuesto, esto solo funcionaría para los usuarios que tienen habilitado JS, pero solo para decir: Todos los que no tienen JS habilitado en su navegador no pueden navegar normalmente en la web.

Cuestiones relacionadas