Saltar al contenido

¿Enviar solicitud HTTP desde PHP sin esperar respuesta?

Hola usuario de nuestro sitio, hemos encontrado la solución a lo que buscabas, continúa leyendo y la verás más abajo.

Solución:

Desafortunadamente, PHP por definición es bloqueando. Mientras esto aguanta true para la mayoría de las funciones y operaciones que normalmente manejará, el escenario actual es diferente.

El proceso que me gusta llamar HTTP-Ping requiere que solo tocar un URI específico, lo que obliga al servidor específico a arrancar su lógica interna. Algunas funciones te permiten lograr algo muy similar a esto HTTP-ping, al no esperar una respuesta.

Tenga en cuenta que el proceso de haciendo ping una url, es un proceso de dos pasos:

  1. Resolver el DNS
  2. Haciendo la solicitud

Si bien realizar la solicitud debería ser bastante rápido una vez que se resuelve el DNS y se realiza la conexión, no hay muchas formas de hacer que el DNS se resuelva más rápido.

Algunas formas de hacer un http-ping son:

  1. cURL, estableciendo CONNECTION_TIMEOUT en un valor bajo
  2. fsockopen cerrando inmediatamente después de escribir
  3. stream_socket_client (igual que fsockopen) y también agregando STREAM_CLIENT_ASYNC_CONNECT

Mientras tanto cURL y fsockopen ambos están bloqueando mientras se resuelve el DNS. Me he dado cuenta que calcetín abierto es significativamente más rápido, incluso en el peor de los casos.

stream_socket_client por otro lado, debería solucionar el problema relacionado con la resolución de DNS y debería ser la solución óptima en este escenario, pero no he logrado que funcione.

Una solución final es iniciar otro hilo/proceso que haga esto por usted. Hacer una llamada al sistema para esto debería funcionar, pero también bifurcar el proceso actual también debería hacerlo. Desafortunadamente, ambos no son realmente seguros en aplicaciones en las que no puede controlar el entorno en el que se ejecuta PHP.

La mayoría de las veces, las llamadas al sistema se bloquean y pcntl no está habilitado de forma predeterminada.

Llamaría a tracker.example.com de esta manera:

get_headers('http://tracker.example.com?product_number=5230&price=123.52');

y en el script del rastreador:

ob_end_clean();
ignore_user_abort(true);
ob_start();
header("Connection: close");
header("Content-Length: " . ob_get_length());
ob_end_flush();
flush();

// from here the response has been sent. you can now wait as long as you want and do some tracking stuff 

sleep(5); //wait 5 seconds
do_some_stuff();
exit;

Implementé la función para la solicitud GET rápida a la URL sin esperar la respuesta:

function fast_request($url)

    $parts=parse_url($url);
    $fp = fsockopen($parts['host'],isset($parts['port'])?$parts['port']:80,$errno, $errstr, 30);
    $out = "GET ".$parts['path']." HTTP/1.1rn";
    $out.= "Host: ".$parts['host']."rn";
    $out.= "Content-Length: 0"."rn";
    $out.= "Connection: Closernrn";

    fwrite($fp, $out);
    fclose($fp);

Reseñas y valoraciones del artículo

Acuérdate de que tienes la opción de decir si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *