curlopt_referer - Establecer el tiempo de espera de Curl en PHP
curlopt_timeout php (7)
Estoy ejecutando una solicitud curl en una base de datos eXist a través de php. El conjunto de datos es muy grande y, como resultado, la base de datos tarda consistentemente una gran cantidad de tiempo para devolver una respuesta XML. Para solucionarlo, configuramos una solicitud curl, con lo que se supone que es un tiempo de espera largo.
$ch = curl_init();
$headers["Content-Length"] = strlen($postString);
$headers["User-Agent"] = "Curl/1.0";
curl_setopt($ch, CURLOPT_URL, $requestUrl);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, ''admin:'');
curl_setopt($ch,CURLOPT_TIMEOUT,1000);
$response = curl_exec($ch);
curl_close($ch);
Sin embargo, la solicitud de curl consistentemente finaliza antes de que se complete la solicitud (<1000 cuando se solicita a través de un navegador). ¿Alguien sabe si esta es la forma correcta de establecer tiempos de espera en curl?
Deberá asegurarse de los tiempos de espera entre usted y el archivo. En este caso PHP y Curl.
Para decirle a Curl que nunca se agote el tiempo de espera cuando una transferencia todavía está activa, debe establecer CURLOPT_TIMEOUT
en 0
, en lugar de 1000
.
curl_setopt($ch, CURLOPT_TIMEOUT, 0);
En PHP, nuevamente, debe eliminar los límites de tiempo o PHP mismo (después de 30 segundos por defecto) matará el script a lo largo de la solicitud de Curl. Esto solo debería solucionar su problema .
Además, si necesita integridad de datos, puede agregar una capa de seguridad utilizando ignore_user_abort
:
# The maximum execution time, in seconds. If set to zero, no time limit is imposed.
set_time_limit(0);
# Make sure to keep alive the script when a client disconnect.
ignore_user_abort(true);
Una desconexión del cliente interrumpirá la ejecución del script y posiblemente dañará los datos,
p.ej. consulta de base de datos no transitoria, creando un archivo de configuración, ecc., mientras que en su caso descargaría un archivo parcial ... y es posible que, o no, se preocupe por esto.
Respondiendo a esta vieja pregunta porque este hilo está en la parte superior en las búsquedas del motor para CURL_TIMEOUT
.
Hay una peculiaridad con esto que podría ser relevante para algunas personas ... De los comentarios de los documentos de PHP.
Si desea que cURL expire en menos de un segundo, puede usar
CURLOPT_TIMEOUT_MS
, aunque hay un error / "función" en "sistemas tipo Unix" que hace que libcurl expire el tiempo de inmediato si el valor es <1000 ms con el error " Error cURL (28): se alcanzó el tiempo de espera ". La explicación de este comportamiento es:"Si libcurl está diseñado para usar el sistema de resolución de nombres de sistema estándar, esa parte de la transferencia seguirá utilizando una resolución de segundo en el tiempo de espera con un tiempo de espera mínimo permitido de un segundo".
Lo que esto significa para los desarrolladores de PHP es "No se puede usar esta función sin probarla primero, porque no se puede decir si libcurl está usando el sistema estándar de resolución de nombres (pero puede estar bastante seguro de que es)"
El problema es que en (Li | U) nix, cuando libcurl usa el resolutor de nombre estándar, se genera un SIGALRM durante la resolución de nombre que libcurl cree que es la alarma de tiempo de espera.
La solución es desactivar señales usando CURLOPT_NOSIGNAL. Aquí hay un script de ejemplo que se solicita a sí mismo y provoca un retraso de 10 segundos para que pueda probar los tiempos de espera:
<?php
if (!isset($_GET[''foo''])) {
// Client
$ch = curl_init(''http://localhost/test/test_timeout.php?foo=bar'');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200);
$data = curl_exec($ch);
$curl_errno = curl_errno($ch);
$curl_error = curl_error($ch);
curl_close($ch);
if ($curl_errno > 0) {
echo "cURL Error ($curl_errno): $curl_error/n";
} else {
echo "Data received: $data/n";
}
} else {
// Server
sleep(10);
echo "Done.";
}
?>
Desde http://www.php.net/manual/en/function.curl-setopt.php#104597
Hmm, me parece que CURLOPT_TIMEOUT
define la cantidad de tiempo que cualquier función de cURL puede ejecutar. Creo que en realidad debería mirar CURLOPT_CONNECTTIMEOUT
lugar, ya que le dice a cURL la cantidad máxima de tiempo que se debe esperar para completar la conexión.
No puede ejecutar la solicitud desde un navegador, esperará a que el servidor que ejecuta la solicitud CURL responda. Es probable que el navegador agote el tiempo de espera en 1-2 minutos, el tiempo de espera predeterminado de la red.
Necesita ejecutarlo desde la línea de comando / terminal.
Si está utilizando PHP como una aplicación fastCGI, asegúrese de verificar la configuración de tiempo de espera de FastCGI. Ver: PHP curl put 500 error
Su código establece el tiempo de espera en 1000 segundos . Durante milisegundos, use CURLOPT_TIMEOUT_MS
.
Ver documentación: http://www.php.net/manual/en/function.curl-setopt.php
CURLOPT_CONNECTTIMEOUT
: el número de segundos para esperar al intentar conectarse. Use 0 para esperar indefinidamente.
CURLOPT_TIMEOUT
: el número máximo de segundos para permitir que se ejecuten las funciones de CURL.
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 400); //timeout in seconds
Además, no se olvide de ampliar la ejecución del tiempo de la secuencia de comandos php:
set_time_limit(0);// to infinity for example