usar strip_tags remove para mundo listos lista hola etiquetas ejemplos ejemplo codigos codigo php timeout execution

strip_tags - ¿Cómo ejecutar un script PHP grande?



strip_tags php ejemplo (7)

Bueno, básicamente, es posible que desee ejecutar un script que puede tardar hasta 1 hora también.

Lo que realmente quiero hacer es enviar SMS a mis usuarios utilizando una API de terceros. Así que básicamente es como si le suministrara a mi script una serie de números de teléfono y disparara el método para enviar SMS.

Sin embargo, suponiendo que se tarda 5 segundos en enviar 1 SMS y quiero enviar 1000 SMS, que son aproximadamente 1 - 2 horas. No puedo usar set_time_limit() porque estoy en un host compartido.

Una forma de hacerlo es almacenar los números en una sesión y ejecutar cada SMS y usar javascript para actualizar esa página hasta el final. De esta manera, necesito mantener mi navegador abierto y la ejecución se detendrá si se desconecta mi conexión a Internet.

Entonces, ¿hay alguna manera mejor de hacer esto?

Espero que sea lo suficientemente claro como para explicar lo que quiero? Quiero ejecutar un script grande que puede tardar horas en ejecutarse sin tener que agotar el tiempo de espera.


¿ Puedes o no puedes usar set_time_limit() ?

Si puedes ... Úsalo:

<?php // Runs forever and ever... set_time_limit(-1); ?>


EN EL CASO PUEDES EJECUTAR CRON TRABAJOS

Por lo general tengo una cola, un gerente y trabajadores. A menos que pueda llamar al sms api una vez en el momento, este modelo puede ayudarlo, y no debe preocuparse por los tiempos de espera, ya que cada trabajador se gestionará por sí mismo.

Tengo algo como:

<?php // PSEUDO CODE // grab pending from queue // <for> { // update to running exec("/usr/bin/php /path/to/send.php {$id} > /dev/null &"); // }

y send.php enviará cada sms. Ahora mismo tengo esto funcionando a una velocidad de 300 / minuto, ya que es la frecuencia máxima que puede configurar en un trabajo cron


Los scripts PHP que se ejecutan desde la línea de comandos no se ven afectados por la opción max_execution_time .
Así que no tienes que preocuparte en absoluto.


No es la mejor opción usar set_time_limit(0) , porque eso significa que se ejecutará indefinidamente incluso si tienes un error y tu script entra en un bucle infinito.

En cambio, si estima que cada SMS tomará 5 segundos, use este enfoque:

while( $there_are_more_sms_to_be_sent ){ set_time_limit(30); // enough spare time, just in case. // Do your sending, blah blah }

De esa manera, el límite de tiempo se actualizará secuencialmente a 30 segundos. Por supuesto, es posible que tengas el problema del bucle infinito con ese solo while , pero si tienes otras llamadas dentro de ese límite, ese límite evitará que esas llamadas sean las culpables.


Si tu host te lo permite, los trabajos cron son la mejor solución. Un trabajo cron es básicamente un script php normal que se ejecuta automáticamente por el servidor web en un intervalo de tiempo específico. Para sus necesidades, crearía un script que se ejecute cada 5 minutos y procese sus números en lotes de 100 (obviamente, querrá ajustar el intervalo de tiempo y el tamaño del lote para adaptarlo). Esto mantendrá la carga de su servidor y evitará que tenga problemas con su proveedor de alojamiento para acaparar recursos.

Para realizar un seguimiento del lote que debe estar procesando su script, configuraría una tabla track_batch. Estas columnas deberían darle una buena indicación de cómo abordar el problema:

id, date_run, start_record, end_record, final_run

Esencialmente:

  • Compruebe para ver la fecha de la última ejecución de lote. Si no es la fecha actual (o cualquier otro identificador que elija usar) para el lote actual, entonces proceda.
  • Si la última ejecución del lote fue para la fecha actual, verifique la columna final_run para ver si ya ha terminado de procesar todos los números.
  • Si aún tiene números para procesar, use los registros de inicio y finalización junto con el LÍMITE de MySQL para crear la consulta de base de datos que usará su script para obtener el siguiente lote.
  • Procesa tus números.
  • Almacene toda la información de este lote en la tabla track_batch.
  • Si la cantidad de números que devuelve la consulta es menor que el tamaño máximo del lote, ha llegado al final y puede establecer la columna final_run en 1.

Una vez que tenga su script, necesitará configurar el trabajo cron en sí. Es probable que los hosts compartidos tengan sus propias interfaces personalizadas para hacer esto, por lo que probablemente sean las mejores personas para preguntar una vez que tenga su script funcionando.


Un script PHP ejecutado desde la línea de comandos o desde un script de shell, trabajo cron, etc. no tiene un tiempo de espera.

Para los scripts invocados por CLI, incluso si configura el tiempo de espera del script PHP dinámicamente con la función set_time_limit() , no tiene ningún efecto.


Una alternativa al uso de JavaScript es agregar la metaetiqueta de Refresh a su página:

<meta http-equiv="Refresh" content="2; url=http://yoururl/script.php&step=x" ?>

Los dos in content="2; url=.. le dicen al navegador que cargue la url 2 segundos después de que la página se haya cargado.