Red de conocimiento del abogados - Respuesta jurídica de la empresa - Varios métodos comunes de manejo del tiempo de espera de PHP

Varios métodos comunes de manejo del tiempo de espera de PHP

Procesamiento del tiempo de espera del servidor web

[ Apache ]

Generalmente, cuando el rendimiento es muy alto, todas las configuraciones de tiempo de espera predeterminadas son de 30 segundos, pero al cargar archivos, o cuando la velocidad de la red es muy lenta, se puede activar una operación de tiempo de espera.

Actualmente hay tres configuraciones de tiempo de espera en el modo apachefastcgiphp-fpm:

Configuración de tiempo de espera de fastcgi:

La configuración de conexión fastcgi modificada es similar a la siguiente:

Copia el código de la siguiente manera:

FastCgiExternalServer/home/forum/apache/apache_php/cgi-bin/php-cgi-socket/ home/forum/ php5/etc/php-fpm.sock

ScriptAlias/fcgi-bin/"/home/forum/apache/apache_php/cgi-bin/"

AddHandlerphp- fastcgi.php

Acciónphp-fastcgi/fcgi-bin/php-cgi

AddTypeapplication/x-

La configuración predeterminada es 30 segundos. Si necesita personalizar su propia configuración, debe modificar la configuración, por ejemplo, cambiarla a 100 segundos: (Reinicie Apache después de la modificación):

Copie el código de la siguiente manera. :

FastCgiExternalServer/home/forum/apache/apache_php/cgi-bin/php-cgi-socket/home/forum/php5/etc/php- fpm.sock-idle-timeout100

ScriptAlias/fcgi-bin/"/home/forum/apache/apache_php/cgi-bin/"

AddHandlerphp-fastcgi.php

Actionphp-fastcgi/fcgi-bin/php -cgi

AddTypeapplication/x-

Si se agota el tiempo de espera, devolverá un error 500, se desconectará del servicio php back-end y lo registrará al mismo tiempo. Un registro de errores de Apache:

[ThuJan2718:30:152011][error][client10.81.41.110 ]FastCGI:commwithserver"/home/forum/apache/apache_php/cgi-bin/php-cgi" abortado:idletimeout(30sec)

[ThuJan2718:30:152011][error][client10.81.41. 110]FastCGI:incompleteheaders(0bytes)receivedfromserver"/home/forum/apache/apache_php/cgi-bin /php-cgi"

Otras descripciones de parámetros de configuración de fastcgi:

Copiar el código de la siguiente manera:

IdleTimeout límite de tiempo de inactividad

ProcessLifeTime un proceso El ciclo de vida más largo, se elimina incondicionalmente después de la expiración

MaxProcessCount Número máximo de procesos

DefaultMinClassProcessCount Número mínimo de procesos iniciados por cada programa

DefaultMaxClassProcessCount Cada programa Número máximo de procesos iniciados

I

Tiempo de espera de respuesta del programa PCConnectTimeout

El tiempo máximo para que IPCommTimeout se comunique con el programa. El error anterior puede deberse a que este valor se establece demasiado pequeño

MaxRequestsPerProcess El número máximo de procesos completados para cada uno. proceso, se suicida después de alcanzar

[ Lighttpd ]

Configuración: lig

En la configuración de Lighttpd, los parámetros relacionados con el tiempo de espera son los siguientes (por consideraciones de espacio, solo escribe y lee el tiempo de espera, lo mismo se aplica a la escritura de parámetros de tiempo de espera):

Principalmente involucra opciones:

server.max-keep-alive-idle=5

server.max-read -idle=60

server.read-timeout=0

server.max-connection-idle=360

Copiar el código de la siguiente manera:

#El número máximo de solicitudes de mantenimiento de actividad por vez, el valor predeterminado es 16

server.max-keep-alive-requests=100

#El número más largo de keep-alive Tiempo de espera, la unidad es segundos, el valor predeterminado es 5

server.max-keep-alive-idle=1200

#El número de subprocesos de trabajo de lighttpd, el valor predeterminado es 0, proceso único en ejecución

server.max-worker=2

#Limitar el tiempo máximo de pausa intermedia (en segundos) cuando los usuarios envían solicitudes,

#Si el usuario hace una pausa demasiado larga durante el proceso de envío de una solicitud (sin completar la solicitud), lighttpd se desconectará activamente

#El valor predeterminado es 60 (segundos)

server.max-read-idle=1200

#Limitar el tiempo máximo de pausa intermedia (en segundos) cuando el usuario recibe una respuesta,

#Si el usuario está durante el proceso de recepción de la respuesta (no completado), el tiempo de pausa es demasiado largo, lighttpd se desconectará activamente

#El valor predeterminado es 360 (segundos)

server.max-write-idle=12000

#El límite de tiempo de espera para las solicitudes de lectura del cliente, la unidad es segundos, establecido en 0 para indicar que no hay límite

#Cuando el la configuración es inferior a max-read-idle, el tiempo de espera de lectura entra en vigor

server.read-timeout=0

#El límite de tiempo de espera para escribir la página de respuesta al cliente, en segundos, configúrelo en 0 para indicar que no hay límite

#Cuando la configuración es inferior a max-write-idle, el tiempo de espera de escritura entra en vigor

server.write-timeout=0

#El límite superior del tiempo de procesamiento de solicitudes, si se usa mod_proxy_core, es lo mismo que el límite de tiempo de interacción del backend, la unidad es segundos

server.max-connection-idle =1200

Descripción:

Para conexiones continuas en una solicitud de conexión de mantenimiento de conexión, el intervalo máximo para enviar el contenido de la primera solicitud está determinado por el parámetro max-read-idle From. a partir de la segunda solicitud, el intervalo máximo para enviar el contenido de la solicitud está determinado por el parámetro max-keep-alive-idle. El tiempo de espera entre solicitudes también lo determina max-keep-alive-idle. El tiempo de espera total para enviar el contenido de la solicitud está determinado por el parámetro read-timeout. El tiempo de espera para que Lighttpd interactúe con el backend está determinado por max-connection-idle.

Lectura ampliada:

[ Nginx ]

Configuración: nf

Copia el código de la siguiente manera:

http {

#Fastcgi: (efectivo para fastcgi back-end, fastcgi no pertenece al modo proxy)

fastcgi_connect_timeout5;#Tiempo de espera de conexión

fastcgi_send_timeout10 #; Tiempo de espera de escritura

fastcgi_read_timeout10;#Tiempo de espera de lectura

#Proxy: (válido para proxy/upstreams)

proxy_connect_timeout15s;#Tiempo de espera de conexión

proxy_read_timeout24s; #Read timeout

proxy_send_timeout10s; #Write timeout

}

Nota:

La configuración del tiempo de espera de Nginx es muy clara y fácil de Entiendo, como se muestra arriba, el tiempo de espera apunta a diferentes modos de trabajo, pero hay muchos problemas causados ​​por el tiempo de espera.

Lectura ampliada:

ml

ml

ml

Manejo del tiempo de espera propio de PHP

[ PHP-fpm ]

Configuración: nf

Copia el código de la siguiente manera:

//...

Establece el límite del número de solicitudes simultáneas que se atenderán

Equivalente a la directiva Apache Max Clients

Equivalente al entorno PHP_FCGI_CHILDREN en php.fcgi original.

Se utiliza con cualquier pm_style.

#php-cgi número de procesos

128

El tiempo de espera (en segundos) para atender una solicitud angular después del cual finalizará el proceso de trabajo.

Debe usarse cuando la opción ini'max_execution_time' no detiene la ejecución del script por alguna razón

'0s' significa 'apagado'

Tiempo de espera de ejecución de solicitud #php-fpm, 0 s significa que nunca se agota el tiempo de espera; de lo contrario, establezca un Ns es el número de segundos para el tiempo de espera

0s

El tiempo de espera (en segundos) para atender una sola solicitud después del cual aphpbacktrace se volcará al archivo low.log

'0s' significa 'apagado'

0s

Descripción:

En php.ini, hay un parámetro max_execution_time que puede establecer el tiempo máximo de ejecución de un script PHP. Sin embargo, en php-cgi (php-fpm), este parámetro no tendrá efecto. Cuándo realmente puedes controlar la ejecución máxima de los scripts PHP:

0s

Es decir, si usas el modo mod_php5.so para ejecutar max_execution_time, tendrá efecto Sí, pero no tendrá efecto cuando se ejecute en modo php-fpm.

Lectura adicional:

[ PHP ]

Configuración: php.ini

Opciones:

max_execution_time= 30

O configúrelo en el código:

ini_set("max_execution_time",30);

set_time_limit(30); Descripción:

Tiene efecto para la sesión actual. Por ejemplo, la configuración 0 nunca expirará, pero si el modo seguro de PHP está activado, esta configuración no tendrá efecto.

El efecto es el mismo, pero el contenido específico debe hacer referencia a la parte php-fpm. Si request_terminate_timeout está configurado en php-fpm, entonces max_execution_time no tendrá efecto.

Tiempo de espera de acceso al backend y a la interfaz

Acceso HTTP

Generalmente, accedemos a HTTP de muchas maneras, principalmente: curl, socket, file_get_contents() y otros métodos.

Si el servidor de la otra parte nunca responde, estaremos en una tragedia. Es fácil matar todo el servidor, por lo que también debemos considerar el problema del tiempo de espera al acceder a http.

[CURL accede a HTTP]

CURL es una biblioteca lib confiable y de uso común para acceder a la interfaz del protocolo HTTP. Tiene un alto rendimiento y algunas funciones de soporte concurrentes.

CURL:

curl_setopt($ch,opt) puede establecer algunas configuraciones de tiempo de espera, que incluyen principalmente:

*(Importante) CURLOPT_TIMEOUT establece lo que cURL puede hacer ejecutar Número máximo de segundos.

*(Importante) CURLOPT_TIMEOUT_MS establece el número máximo de milisegundos que cURL puede ejecutar. (Agregado en cURL7.16.2. Disponible en PHP5.2.3.)

El tiempo que CURLOPT_CONNECTTIMEOUT espera antes de iniciar una conexión. Si se establece en 0, esperará indefinidamente.

CURLOPT_CONNECTTIMEOUT_MS El tiempo de espera para intentar conectarse, en milisegundos. Si se establece en 0, espere infinitamente. Agregado en cURL7.16.2. Disponible a partir de PHP5.2.3.

CURLOPT_DNS_CACHE_TIMEOUT establece el tiempo para guardar la información DNS en la memoria, el valor predeterminado es 120 segundos.

tiempo de espera ordinario de segundo nivel de curl:

$ch=curl_init();

curl_setopt($ch,CURLOPT_URL,$url

);

curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);

curl_setopt($ch,CURLOPT_TIMEOUT,60);//Solo necesitas establecer el número de segundos

curl_setopt( $ ch,CURLOPT_HTTPHEADER,$headers);

curl_setopt($ch,CURLOPT_USERAGENT,$defined_vars['HTTP_USER_AGENT']);

Uso del tiempo de espera ordinario de segundo nivel de curl:

p>

curl_setopt($ch,CURLOPT_TIMEOUT,60);

Si curl requiere un tiempo de espera de milisegundos, debe aumentar:

curl_easy_setopt(curl,CURLOPT_NOSIGNAL,1L); /p>

O:

curl_setopt($ch,CURLOPT_NOSIGNAL,true); puede admitir configuraciones de tiempo de espera de nivel de milisegundos

Ejemplo de tiempo de espera de nivel de milisegundos para curl:

Copia el código de la siguiente manera:

if(!isset($_GET['foo'])){

//Cliente

$ch=curl_init('');

curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);

curl_setopt($ch,CURLOPT_NOSIGNAL); ,1);/ /Tenga en cuenta que el tiempo de espera en milisegundos debe establecerse en este

curl_setopt($ch,CURLOPT_TIMEOUT_MS,200); //Tiempo de espera en milisegundos, agregado en cURL7.16.2. Disponible desde PHP5.2.3 en adelante

$data=curl_exec($ch);

$curl_errno=curl_errno($ch); $ch);

curl_close($ch);

if($curl_errno>0){

echo"cURLError($curl_errno):$curl_errorn " ;

}else{

echo "Datos recibidos:$datan"

}

}else{

< p; >//Server

sleep(10);

echo "Done.";

} >

Algunos otros trucos:

1. Según el resumen de la experiencia: versión cURL> = versión libcurl/7.21.0, el tiempo de espera de milisegundos definitivamente tendrá efecto, recuerde.

2. También hay un problema con el tiempo de espera de milisegundos de curl_multi. . Un acceso único admite el tiempo de espera a nivel de ms, pero curl_multi será inexacto si se realizan varias llamadas en paralelo

[Acceso HTTP mediante procesamiento de flujo]

Además de curl, a menudo usamos fsockopen, o Es la función de operación de archivos que procesa el protocolo HTTP, por lo que nuestro procesamiento de tiempo de espera para esta parte también es necesario.

Generalmente, el tiempo de espera de la conexión se puede configurar directamente, pero el tiempo de espera de lectura de la transmisión debe manejarse por separado.

Escribe tu propio código para procesar:

Copia el código de la siguiente manera:

$tmCurrent=gettimeofday()

$intUSGone; =($ tmCurrent['sec']-$tmStart['sec'])*1000000

+($tmCurrent['usec']-$tmStart['usec']

);

if($intUSGone>$this->_intReadTimeoutUS){

returnfalse;

}

O utilice las funciones integradas de procesamiento de flujo stream_set_timeout( ) y stream_get_meta_data() para procesar:

Copie el código de la siguiente manera:

//Timeoutinsegundos

$timeout =5;

$fp=fsockopen("",80,$errno,$errstr,$timeout

if($fp){

fwrite($fp,"GET/ HTTP/1.0rn");

fwrite($fp,"Host:rn");

fwrite($fp,"Conexión:Closernrn"); ");

stream_set_blocking($fp,true);//Importante, configurar en modo sin bloqueo

stream_set_timeout($fp,$timeout);//Establecer tiempo de espera

$info=stream_get_meta_data ($fp);

mientras((!feof($fp))&&(!$info['timed_out'])){

$data.=fgets($fp,4096);

$info=stream_get_meta_data($fp);

ob_flush

flush(); /p>

}

p>

if($info['timed_out']){

echo "ConnectionTimedOut!"; }else{

echo$data

}

}

file_get_contents timeout:

Copiar el código de la siguiente manera:

p>

$timeout=array(

'http' =>array(

'timeout'=>5//Establecer un tiempo de espera en segundos

)

); =stream_context_create($timeout);

$text=file_get_contents("",0,$ctx) ; > >

tiempo de espera de apertura:

Copia el código como sigue:

$timeout=array(

'http'=>array(

'timeout'=> 5//Establecer un tiempo de espera en segundos

)

);

$ctx=stream_context_create($timeout); $fp=fopen("","r",falso,

$ctx)){

mientras($c=fread($fp,8192)){

echo$c

}

fclose($fp);

} >

MySQL

El cliente mysql en php no tiene la opción de establecer un tiempo de espera, ni mysqli ni mysql, pero libmysql proporciona opciones de tiempo de espera, pero las ocultamos en php.

Entonces, cómo usar esta operación en PHP requiere que definamos algunas constantes de operación de MySQL. Las principales constantes involucradas son:

MYSQL_OPT_READ_TIMEOUT=11

MYSQL_OPT_WRITE_TIMEOUT; =12;

Después de definir estos dos, puede usar opciones para establecer los valores correspondientes.

Pero hay un punto a tener en cuenta: la implementación interna de mysql:

1. La unidad de configuración del tiempo de espera es segundos y la configuración mínima es 1 segundo.

2. Pero la lectura subyacente de mysql lo intentará dos veces, por lo que el tiempo real será de 3 segundos

Reintentar dos veces + él mismo una vez = 3 veces el tiempo de espera, lo que significa que el tiempo de espera mínimo es de 3 segundos. y no será inferior a este valor. Es aceptable para la mayoría de las aplicaciones, pero necesita optimización para una pequeña cantidad de aplicaciones.

Ver una instancia de PHP que establece el tiempo de espera para acceder a mysql:

Copia el código de la siguiente manera:

/ /Defínelo usted mismo Leer y escribir constante de tiempo de espera

if(!definido('MYSQL_OPT_READ_TIMEOUT')){

define('MYSQL_OPT_READ_TIMEOUT',11); }

if(!definido('MYSQL_OPT_WRITE_TIMEOUT')){

define('MYSQL_OPT_WRITE_TIMEOUT',12

}

); //Establecer tiempo de espera

$mysqli=mysqli_init();

$mysqli->options(MYSQL_OPT_READ_TIMEOUT,3

$mysqli->options(MYSQL_OPT_WRITE_TIMEOUT); ,1);

//Conectarse a la base de datos

$mysqli->real_connect("localhost","root","root","test"); >

if(mysqli_connect_errno ()){

printf("Connectfailed:%s/n",mysqli_connect_error()

salir(); p>}

//Ejecutar suspensión de consulta durante 1 segundo sin tiempo de espera

printf("Hostinformation:%s/n",$mysqli->host_info

<); p>if(!($res= $mysqli->query('selectsleep(1)'))){

echo"query1error:".$mysqli->error."/n"; /p>

}else{

echo "Query1:querysuccess/n";

}

//La ejecución de la consulta dormirá durante 9 segundos. tiempo de espera

if(!( $res=$mysqli->query('selectsleep(9)'))){

echo"query2error:".$mysqli->error ."/n";

}else{

echo "Query2:querysuccess/n"

}

$mysqli- >close();

echo "closemysqlconnection/n"; >

Lectura ampliada:

Memcached

[extensión PHP]

Cliente php_memcache:

Tiempo de espera de conexión: boolMemcache::connect(string$host[,int$port[,int$timeout]])

No hay borre el parámetro de configuración del tiempo de espera durante la obtención y configuración.

Cliente libmemcached: no hay ningún parámetro de tiempo de espera obvio en la interfaz php.

Nota: Por lo tanto, existen muchos problemas al acceder a Memcached en PHP. Es necesario modificar algunas operaciones usted mismo o consultar parches en línea.

[C&C++ acceso a Memcached]

Cliente: cliente libmemcached

Nota: la configuración del tiempo de espera de Memcache se puede configurar en un tamaño más pequeño, por ejemplo, 5 o 10 milisegundos son suficientes. Después de usar es mejor consultar desde la base de datos si excede este tiempo.

El siguiente es un ejemplo de C++ de tiempo de espera para conectarse y leer datos establecidos:

Copie el código de la siguiente manera:

//Crear tiempo de espera de conexión (conectarse a Memcached )

memcached_st*MemCacheProxy::_create_handle()

{

memcached_st*mmc=NULL

memcached_return_tprc

if(_mpool!=NULL){//getfrompool

mmc=memcached_pool_pop(_mpool,false,&prc);

if(mmc==NULL){

__LOG_WARNING__("MemCacheProxy","gethandlefrompoolerror[%d]",(int)prc

}

returnmmc;

memcached_st*handle=memcached_create(NULL);

if(handle==NULL){

__LOG_WARNING__("MemCacheProxy","create_handleerror"); /p>

p>

returnNULL;

}

//Establecer conexión/tiempo de espera de lectura

memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_HASH,MEMCACHED_HASH_DEFAULT) ;

memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_NO_BLOCK,_noblock);// El parámetro MEMCACHED_BEHAVIOR_NO_BLOCK es 1 para que la configuración del tiempo de espera surta efecto. Si el tiempo de espera no está configurado, no tendrá efecto. tiempos críticos y puede causar fácilmente una avalancha

memcached_behavior_set(handle, MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT,_connect_timeout);//Tiempo de espera de conexión

memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_RCV_TIMEOUT,_read_timeout);//Tiempo de espera de lectura

memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_SND_TIMEOUT,_send_timeout) );//Tiempo de espera de escritura

memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_POLL_TIMEOUT,_poll_timeout);

//Establecer hash consistente

//memcached_behavior_set_distribution(handle,MEMCACHED_DISTRIBUTION_CONSISTENT);

memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_DISTRIBUTION,MEMCACHED_DISTRIBUTION_CONSISTENT);

memcached_returnrc

for(uinti=0; ;i<_server_count;i++){

rc=memcache

d_server_add(handle,_ips[i],_ports[i]);

if(MEMCACHED_SUCCESS!=rc){

__LOG_WARNING__("MemCacheProxy","addserver[%s:% d]falló.",_ips[i],_ports[i]);

}

}

_mpool=memcached_pool_create(handle,_min_connect,_max_connect)

if(_mpool==NULL){

__LOG_WARNING__("MemCacheProxy","create_poolerror"

returnNULL; }

mmc=memcached_pool_pop(_mpool,false,&prc);

if(mmc==NULL){

__LOG_WARNING__("MyMemCacheProxy","gethandlefrompoolerror[ %d]",(int)prc);

}

//__LOG_DEBUG__("MemCacheProxy","gethandle[%p]",handle);

returnmmc;

}

//Establecer un tiempo de espera clave (establecer un dato en memcached)

boolMemCacheProxy::_add(memcached_st*handle,unsignedint* clave,constchar*valor,intlen,unsignedinttimeout)

{

memcached_returnrc

chartmp[1024]

snprintf(tmp, sizeof(tmp),"%u#%u",key[0],key[1]);

//Hay un valor de tiempo de espera

rc=memcached_set(handle). , tmp,strlen(tmp),(char*)value,len,timeout,0

if(MEMCACHED_SUCCESS!=rc){

returnfalse; p >}

returntrue;

}

//Memcache lee el tiempo de espera de datos (no establecido)

Definición de interfaz en código fuente libmemcahed :

LIBMEMCACHED_APIchar*memcached_get(memcached_st*ptr,constchar*key,size_tkey_length,size_t*value_length,uint32_t*flags,memcached_return_t*error);

LIBMEMCACHED_APImemcached_return_tmemcached_mget(memcached_st*ptr,constchar) * const *keys,constsize_t*key_length,size_tnumber_of_keys);

Se puede ver en la interfaz que no hay una configuración de tiempo de espera al leer datos.

Lectura ampliada:

Cómo implementar el tiempo de espera

El programa debe tener una función de tiempo de espera, por ejemplo, si accede solo a un módulo de socket back-end. , el módulo Socket no pertenece a Cuando se utiliza cualquiera de los métodos que describimos anteriormente, su protocolo también es privado, por lo que es posible que deba implementar algunas estrategias de procesamiento de tiempo de espera usted mismo en este momento, y necesitará algún código de procesamiento en este momento.

[Implementación de tiempo de espera en PHP]

1. Nivel elemental: la implementación de tiempo de espera más simple (tiempo de espera de segundo nivel)

La idea es muy simple: vincular un backend, luego configúrelo en modo sin bloqueo. Si no hay conexión, seguirá en bucle y juzgará la diferencia entre la hora actual y el tiempo de espera.

El tiempo de espera original se implementa en phpsocket: (el tiempo actual disminuye en cada bucle, el rendimiento será deficiente y el uso de la CPU será alto)

Copia el código como sigue:

$host="127.0.0.1"

$port="80"; =15;// tiempo de espera en segundos

$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)

ordie("Unabletocreatesocketn");

socket_set_nonblock($socket) //Debe configurarse en modo de bloqueo

ordie("Unabletosetnonblockonsocketn");

$time=time()

//Restar el valor correspondiente a cada uno. tiempo durante el bucle

while(!@socket_connect($socket,$host,$port))//Si no hay conexión, continuará en un bucle sin fin

{

$err= socket_last_error($socket);

if($err==115||$err==114)

{

if((time()- $time)>=$timeout)//Debes comprobar si se ha agotado el tiempo de espera cada vez

{

socket_close($socket

morir( "Connectiontimedout.n");

}

dormir(1

continuar; >

}

die(socket_strerror($err)."n");

}

socket_set_block($this->socket)// Restaurar el modo de bloqueo

ordie ("Unabletosetblockonsocketn"); >

2. Actualización: use la IO asincrónica propia de PHP para implementar (tiempo de espera de milisegundos)

Descripción:

IO asíncrono: el concepto de IO asíncrono es relativo al IO síncrono. Cuando se emite una llamada a un procedimiento asincrónico, la persona que llama no obtiene el resultado inmediatamente. El componente que realmente maneja la llamada notifica a la persona que llama a través del estado, notificaciones y devoluciones de llamada cuando se completa. La E/S asíncrona transfiere bits en pequeños grupos, que pueden ser de 8 bits, 1 carácter o más. El remitente puede enviar estos grupos de bits en cualquier momento y el receptor nunca sabe cuándo llegarán.

Multiplexación: el modelo de multiplexación detecta múltiples operaciones IO y devuelve una colección operable para que se puedan operar. Esto evita la determinación de que el bloqueo de IO no puede procesar cada IO en cualquier momento y la ocupación sin bloqueo de los recursos del sistema.

Utilice socket_select() para implementar el tiempo de espera

socket_select(...,floor($timeout),ceil($timeout*1000000)); Características: ¡Posibilidad de establecer el tiempo de espera a un nivel de microsegundos!

Utilice el código de tiempo de espera de socket_select() (necesita tener algunos conocimientos de programación IO asíncrona para comprenderlo)

Copie el código de la siguiente manera:

Programación llamar a la clase de programación#

$server=newServer

$client=newClient

for(;;) {

foreach($select->can_read(0)as$socket){

if($socket==$cliente->socket){

//NewClientSocket

$select->add(socket_accept($client->socket));

}

else{

//hay algo que leer en$socket

}

}

} >

Programación de multiplexación asíncrona IO y programación de procesamiento de conexión de tiempo de espera

classselect{

var$sockets

functionselect($sockets){

$this ->sockets=array();

foreach($socketsas$socket){

$this->add($socket

}

p>

p>

}

functionadd($add_socket){

array_push($this->sockets,$add_socket

); }

functionremove($remove_socket){

$sockets=array();

foreach($this->socketsas$socket){

if( $remove_socket!=$socket)

$sockets[]=$socket

}

$this->sockets=$sockets;

}

functioncan_read($timeout){

$read=$this->sockets

socket_select($read, $write=NULL, $except=NULL,$timeout);

return$read

}

funcióncan_write($timeout){

$write =$this->sockets;

socket_select($read=NULL,$write,$except=NULL,$timeout); /p>

}

} >

[Implementación de tiempo de espera en C&C++]

Generalmente en Linu

En xC/C++, puede usar alarm() para configurar un temporizador para lograr un tiempo de espera de segundo nivel, o IO multiplexada asíncrona como select(), poll() y epoll() para lograr un tiempo de espera de nivel de milisegundos. También puede utilizar bibliotecas io asincrónicas encapsuladas secundarias (libevent, libev) para lograr esto.

1. Utilice señales en alarma para implementar el tiempo de espera (tiempo de espera de segundo nivel)

Nota: El tiempo de espera de conexión del kernel de Linux suele ser de 75 segundos. Podemos establecer un tiempo menor, como 10. segundos. Regrese temprano desde la conexión. Aquí usamos el mecanismo de procesamiento de señales, llamamos a la alarma y generamos la señal SIGALRM después del tiempo de espera (también se puede implementar usando select)

Use alarmam para implementar la conexión en segundos para configurar el código de tiempo de espera:

Copiar código de la siguiente manera:

//Función de procesamiento de señal

staticvoidconnect_alarm(intsigno)

{

debug_printf(" SignalHandler");

return;

}

//implementación de conexión de tiempo de espera de alarma

staticvoidconn_alarm()

{

Sigfunc*sigfunc;//Función de procesamiento de señal existente

sigfunc=signal(SIGALRM,connect_alarm);//Crear la función de procesamiento de señal connect_alarm, (si existe) guardar la función de procesamiento de señal existente

inttimeout=5

//Establecer despertador

if(alarm(timeout)!=0){

//... El despertador ha sido configurado y procesado

}

//Realizar la operación de conexión

if(connect(m_Socket,(structsockaddr *)&addr,sizeof(addr))<0 ){

if(errno==EINTR){//Si el número de error se establece en EINTR, significa una interrupción de tiempo de espera

debug_printf("Tiempo de espera");