Estamos trabajando en un sistema de alerta en bucle que envía una alerta a nuestro agente, luego envía una solicitud a nuestro punto final de PHP externo para dormir durante un intervalo, luego el punto final vuelve a llamar a nuestro punto final de Twilio Function/Twilio Runtime Domain con una solicitud AJAX para emitir una alerta y bucles.
Función A --> Función de suspensión externa (/Sleep) --> Función A
Ese es el flujo que necesitamos, y no podemos hacerlo funcionar. Podemos recibir la solicitud de la Función A en /Sleep , pero luego no podemos devolverla a la Función A . También podemos enviar una solicitud desde el navegador a /Sleep , luego recibir la solicitud de regreso en la Función A , luego recibirla en /Sleep pero aún no podemos devolverla a la Función A .
Básicamente, no podemos completar el bucle. ¿Alguien tiene experiencia haciendo que un sistema como este funcione?
Contexto adicional: nuestro punto final de PHP ( /Sleep ) está inactivo durante 3 segundos (3000 ms) con fines de prueba. Enviar una solicitud de navegador o curl a /Sleep efectivamente una solicitud que recibimos en /Function-A , pero una vez que nuestra /Function-A intenta enviar otra solicitud a /Sleep , el ciclo se interrumpe. Aquí está nuestro código en /Sleep :
<script> function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function twilioSleep() { await sleep( 3000 ); // 900000 = 15 min const Http = new XMLHttpRequest(); const url='https://our-service.twil.io/alert'; Http.open( 'GET', url ); Http.send(); } twilioSleep(); </script>Muchas gracias.
Desarrollador evangelista de Twilio aquí.
Las funciones de Twilio tienen un tiempo de espera de 10 segundos y no se ejecutarán más allá. Además, una vez que se completa una función de Twilio (usted llama a la función de callback de llamada) o se termina, también se terminan todas las conexiones de red que tenga abiertas.
Por lo tanto, si está realizando la solicitud desde la función Twilio a su punto final /Sleep , pero el punto final /Sleep no devuelve una respuesta hasta que haya terminado de dormir, entonces sugeriría que la función Twilio esté agotando el tiempo de espera, finalizando la conexión. con su servidor y deteniendo el bucle.
Para que esto funcione con las funciones de Twilio, su servidor PHP tendrá que devolver una respuesta a la función de Twilio inmediatamente y realizar la suspensión de forma asíncrona de alguna manera. Puede lograr esto con un programador de trabajos o quizás con una biblioteca PHP asíncrona como spatie/async o coroutine . No soy un programador de PHP, por lo que no tengo una recomendación concreta, pero espero que estas ideas ayuden.
Editar
Ok, según el código en la pregunta, el problema es que su servidor PHP está devolviendo HTML y JavaScript para realizar la suspensión y realizar la siguiente solicitud. Cuando solicita esa página con el navegador, el navegador interpreta el JavaScript y realiza la solicitud. Cuando la función Twilio solicita su punto final /Sleep , recibe la respuesta HTML y no la interpreta ni ejecuta JavaScript porque no es un navegador. No sé cómo funciona eso con curl, pero sospecho que realmente no es así.
Si desea que su servidor PHP duerma, haga una nueva solicitud, luego deberá implementar eso en PHP. Para empezar, la función de sleep debería ayudar, y aquí hay un artículo sobreformas de hacer solicitudes HTTP en PHP .
Pero, mientras trabaja en esto, recuerde que Twilio Functions aún tendrá un tiempo de espera de 10 segundos y si duerme su función PHP por más tiempo, también se cancelará. A menos que encuentre una manera de devolver una respuesta a la función Twilio y realizar la suspensión en segundo plano, posiblemente usando una de las bibliotecas asíncronas que mencioné antes, o un programador de trabajos.