php - get tag name wordpress
Llamada a función asincrónica en PHP (6)
Estoy trabajando en una aplicación web PHP y necesito realizar algunas operaciones de red en la solicitud, como buscar a alguien desde el servidor remoto en función de la solicitud del usuario.
¿Es posible simular un comportamiento asíncrono en PHP dado que tengo que pasar algunos datos a una función y también necesito salida de ella?
Mi código es como:
<?php
$data1 = processGETandPOST();
$data2 = processGETandPOST();
$data3 = processGETandPOST();
$response1 = makeNetworkCall($data1);
$response2 = makeNetworkCall($data2);
$response3 = makeNetworkCall($data3);
processNetworkResponse($response1);
processNetworkResponse($response2);
processNetworkResponse($response3);
/*HTML and OTHER UI STUFF HERE*/
exit;
?>
Cada operación de red tarda alrededor de 5 segundos en completarse y agrega un total de 15 segundos al tiempo de respuesta de mi aplicación, dado que realizo 3 solicitudes.
La función makeNetworkCall () solo hace una solicitud HTTP POST.
El servidor remoto es una API de terceros, por lo que no tengo ningún control allí.
PD: No respondas dando sugerencias sobre AJAX u otras cosas. Actualmente estoy buscando si puedo hacer esto a través de PHP puede ser con una extensión de C ++ o algo así.
Creo que la respuesta está aquí:
PHP threading llamada a una función php de forma asíncrona
Nota rápida: use enhebrar
Creo que si el HTML y otras cosas de la interfaz de usuario necesitan que se devuelvan los datos, no habrá forma de sincronizarlos.
Creo que la única forma de hacer esto en PHP sería registrar una solicitud en una base de datos y tener un control cron cada minuto, o usar algo como el procesamiento de cola de Gearman, o tal vez ejecutar un proceso de línea de comando
Mientras tanto, tu página php debería generar algunos html o js que hagan que vuelva a cargarse cada pocos segundos para verificar el progreso, no es lo ideal.
Para soslayar el problema, ¿cuántas solicitudes diferentes espera? ¿Podrían descargarlos todos automáticamente cada hora y guardarlos en una base de datos?
Hoy en día, es mejor usar queues que hilos (para aquellos que no usan Laravel hay muchas otras implementaciones como esta ).
La idea básica es que tu script PHP original pone tareas o trabajos en una cola. Luego tiene trabajadores de cola de trabajos en otro lugar, eliminando trabajos de la cola y comenzando a procesarlos independientemente del PHP original.
Las ventajas son:
- Escalabilidad: solo puede agregar nodos de trabajadores para mantenerse al día con la demanda. De esta forma, las tareas se ejecutan en paralelo.
- Fiabilidad: los gestores de colas modernos, como RabbitMQ, ZeroMQ, Redis, etc., están hechos para ser extremadamente confiables.
No tengo una respuesta directa, pero es posible que desee investigar estas cosas:
- Proyecto Recoil - https://github.com/recoilphp/recoil
- la extensión LibEvent de php? http://www.php.net/manual/en/book.libevent.php
- proceso de bifurcación http://www.php.net/manual/en/function.pcntl-fork.php
- intermediarios de mensajes, es decir, puede iniciar a los trabajadores para que realicen las llamadas HTTP y, una vez que
job
esejob
, inserte un nuevo trabajo que describa el trabajo que se debe realizar para procesar el cuerpo de respuesta HTTP en caché.
También hay http v2 que es un contenedor para curl. Se puede instalar a través de pecl.
cURL será su única opción real aquí (o bien, o utilizando sockets no bloqueantes y alguna lógica personalizada).
Este enlace debería enviarte en la dirección correcta. No hay procesamiento asíncrono en PHP, pero si está tratando de realizar múltiples solicitudes web simultáneas, cURL multi se encargará de eso por usted.