English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
[Acceso a HTTP]
Generalmente, hay muchos métodos para acceder a HTTP, principalmente: curl, socket, file_get_contents() y otros métodos.
Si el servidor del otro lado no responde durante mucho tiempo, nos encontraremos en una situación desafortunada, es fácil matar todo el servidor, por lo tanto, también es necesario considerar el problema de tiempo de espera al acceder a http.
[Acceso a HTTP con CURL]
CURL es una librería de acceso a protocolos HTTP muy confiable que utilizamos a menudo, con alto rendimiento y algunas funciones de soporte concurrente.
CURL:
curl_setopt($ch, opt) puede configurar algunos ajustes de tiempo de espera, incluyendo principalmente:
*(Importante) CURLOPT_TIMEOUT configura el tiempo máximo en segundos permitido para la ejecución de cURL.
*(Importante) CURLOPT_TIMEOUT_MS configura el tiempo máximo en milisegundos permitido para la ejecución de cURL. (En cURL 7.16.2se añadió. 5.2.3Disponible desde el principio. )
CURLOPT_CONNECTTIMEOUT es el tiempo de espera antes de establecer la conexión. Si se establece en 0, se espera de manera ilimitada.
CURLOPT_CONNECTTIMEOUT_MS es el tiempo de espera para intentar la conexión en milisegundos. Si se establece en 0, se espera de manera ilimitada. En cURL 7.16.2se añadió. 5.2.3Disponible desde el principio.
CURLOPT_DNS_CACHE_TIMEOUT configura el tiempo de almacenamiento de información DNS en memoria, el valor predeterminado es120 segundos.
Tiempo de espera en segundos para curl:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 60); //Basta con establecer una cantidad de segundos
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_USERAGENT, $defined_vars['HTTP_USER_AGENT']);
Usa curl_setopt($ch, CURLOPT_TIMEOUT) para configurar el tiempo de espera en segundos
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
Si curl necesita un tiempo de espera en milisegundos, debe agregar:
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
O bien:
curl_setopt ($ch, CURLOPT_NOSIGNAL, true); admite la configuración de tiempo de espera en milisegundos
Ejemplo de tiempo de espera en milisegundos para curl:
<?php if (!isset($_GET['foo'])) { // Client $ch = curl_init('http://example.com/'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_NOSIGNAL, 1); //Atención, es necesario configurar este valor para el tiempo de espera en milisegundos curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200); //milisegundos de timeout, cURL 7.16.2se añadió. 5.2.3desde PHP $data = curl_exec($ch); $curl_errno = curl_errno($ch); $curl_error = curl_error($ch); curl_close($ch); if ($curl_errno > 0) { echo "Error de cURL ($curl_errno): $curl_error\n"; } else { echo "Datos recibidos: $data\n"; } } else { // Servidor sleep(10); echo "Hecho."; } ?>
Otras técnicas:
1. Según la experiencia, se puede resumir en: cURL versión >= libcurl/7.21.0 versión, el timeout de milisegundos siempre es efectivo, recuerde.
2. El timeout de milisegundos de curl_multi también tiene problemas... Aunque se admite el timeout de milisegundos en llamadas individuales, curl_multi no es preciso al llamar paralelamente múltiples veces
[Acceso al HTTP mediante manejo de flujo]
Además de curl, a menudo utilizamos nosotros mismos fsockopen o funciones de operaciones de archivo para manejar protocolos HTTP, por lo que, el manejo de timeout en este aspecto también es necesario.
Generalmente, el timeout de conexión se puede configurar directamente, pero el timeout de lectura de flujo requiere tratamiento separado.
Escriba su propio código para manejar:
$intUSGone = ($tmCurrent['sec'] - $tmStart['sec']) * 10 + ($tmCurrent['usec'] - $tmStart['usec']); if ($intUSGone > $this->_intReadTimeoutUS) { devolver falso; }
o utilice las funciones de manejo de flujos integradas stream_set_timeout() y stream_get_meta_data() para manejar:
<?php // Timeout en segundos $timeout = 5; $fp = fsockopen("example.com", 80, $errno, $errstr, $timeout); if ($fp) { fwrite($fp, "GET"); / HTTP/1.0\r\n"); fwrite($fp, "Host: example.com\r\n"); fwrite($fp, "Conexión: Cerrar\r\n\r\n"); stream_set_blocking($fp, true); //Importante, establecer en modo no bloqueante stream_set_timeout($fp,$timeout); //Establecer tiempo de expiración $info = stream_get_meta_data($fp); while ((!feof($fp)) && (!$info['timed_out'])) { $data .= fgets($fp, 4096); $info = stream_get_meta_data($fp); ob_flush; flush(); } if ($info['timed_out']) { echo "Connection Timed Out!"; } else { echo $data; } }
file_get_contents tiempo de expiración:
<?php $timeout = array( 'http' => array( 'timeout' => 5 //Establecer un tiempo de expiración, la unidad es segundos ) ); $ctx = stream_context_create($timeout); $text = file_get_contents("http://example.com/", 0, $ctx); ?>
fopen tiempo de expiración:
<?php $timeout = array( 'http' => array( 'timeout' => 5 //Establecer un tiempo de expiración, la unidad es segundos ) ); $ctx = stream_context_create($timeout); if ($fp = fopen("http://example.com/", "r", false, $ctx)) { while( $c = fread($fp, 8192)) { echo $c; } fclose($fp); } ?>
Esto es todo lo que el editor ha compartido con usted sobre la breve explicación de la solución al tiempo de expiración de acceso al backend y a las interfaces de PHP, esperamos que todos lo apoyen y griten tutorial ~