metodo - Entendiendo PHP declare() y ticks
return php (3)
Cuando PHP está ejecutando su script, la ejecución puede verse como una gran cantidad de sentencias en ejecución. La mayoría de las declaraciones causan un Tick, aunque no necesariamente todas las declaraciones lo hacen. (El manual dice: Typically, condition expressions and argument expressions are not tickable.
) Typically, condition expressions and argument expressions are not tickable.
Este bloque normalmente causaría 5 tics, ya que está ejecutando 5 sentencias:
$a = 1;
$B = 2;
$a = 3;
$B = 4;
$a = 5;
Y este bloque normalmente causaría 5 ticks, y un tick más como el final del ciclo while también se cuenta como una declaración / tick:
while ($i < 5)
$a++;
Con la ayuda de declare(ticks=N)
y register_tick_function()
, ahora puede ejecutar código entre las declaraciones / ticks. La función register_tick_function especifica a qué función se debe llamar cuando ocurre un evento de tick. Y la declaración establece cuántos ticks deben pasar, antes de que ocurra un evento de tick.
Con declare(ticks=1)
y register_tick_function(''someFunction'');
llamará a someFunction()
código de someFunction()
entre cada instrucción / marca.
Si usa declare(ticks=3)
, entonces someFunction()
se ejecutará en cada tercera instrucción / tick.
Ejemplo:
function handler(){
echo "x";
}
register_tick_function("handler");
$i = 0;
declare(ticks = 4) {
while ($i < 9)
echo ++$i;
}
Este script generará: 1234x5678x9
Es así de simple.
Ahora, lo que se entiende en la pregunta vinculada con "si la conexión aún está viva", no es realmente interesante en sí mismo y no está realmente relacionado con lo mencionado anteriormente. Es simplemente algo que PODRÍAS hacer en cada evento de tick. Pero también puedes hacer algo totalmente diferente. Lo que se menciona es simplemente que algunos scripts pueden tardar bastante tiempo en ejecutarse y que durante la ejecución, el cliente puede desconectarse. (Imagine cerrar el navegador mientras el script aún se está ejecutando). PHP continuará ejecutando el script de manera predeterminada, incluso si el cliente se ha desconectado. Puede usar la función connection_aborted()
para detectar si el cliente se ha desconectado. Esto es algo que PODRÍAS hacer también sin usar garrapatas.
Ahora digamos, por ejemplo, que desea que su secuencia de comandos deje de ejecutarse tan pronto como el cliente se desconecte. Simplemente use ...
function killme() {
if (connection_aborted()) {
die();
}
}
register_tick_function(''killme'');
declare(ticks=1);
... y su script llamará killme()
después de cada declaración de su código. killme()
comprobará si el cliente todavía está conectado y die()
cuando no lo esté.
Hoy estaba revisando el manual de php y encontré una estructura de control.
La construcción declarar se utiliza para establecer directivas de ejecución para un bloque de código
Esto es lo que se supone que debe hacer. Para ser sincero no lo entendí. Al volver a leer encontró algo nuevo.
Un tick es un evento que se produce para cada N enunciados marcables de bajo nivel ejecutados por el analizador dentro del bloque declarar. El valor para N se especifica utilizando ticks = N en la sección de directivas del bloque declarar.
Yo tampoco lo entendí. qué quiere decir con N low-level tickable statements
Si hubiera habido un buen código de ejemplo, entonces habría sido fácil de entender. Pero no se encontró ninguno en el manual. He encontrado algunos en SO Q1 , que en realidad aumentaron mi curiosidad y confusión. Entonces, ¿puede alguien para qué es esto y dónde podemos usar esto?
Mi confusión real es con esta declaración (de la publicación vinculada, así que) you can declare a tick-function which checks each n executions of your script whether the connection is still alive or not
. Entonces, cuando registro una función de tick con tick = 20 en un archivo php y lo ejecuto, el archivo estará activo hasta que se complete la ejecución 20 (se dio esta idea cuando se consideró erróneamente como multiproceso). Esta es la idea que tengo, no creo que sea correcta ..
¿O es un reemplazo simple para while($x = 20)
[EDIT 1]
También he visto la implementación de declare()
otra sección del manual de PHP Argumentos de función
[EDIT 2]
También en Control de Procesos.
Usted usa la declaración declare () para especificar las ubicaciones en su programa donde se permiten las devoluciones de llamada. Esto le permite minimizar la sobrecarga de manejar eventos asíncronos
El único uso no mencionado en esta o en la posible respuesta duplicada es la captura de señales.
Si tiene una secuencia de comandos CLI y desea capturar las señales del usuario (como SIGHUP o SIGTERM (CTRL + C)), necesita declare(ticks...
pcntl_signal
declare(ticks...
junto con pcntl_signal
https://secure.php.net/manual/en/function.pcntl-signal.php que te permite capturar esas señales (igual que la captura en scripts de shell)
En la práctica: ignorar la directiva declare()
. A menos que se encuentre con un código que lo haga uso, lo cual es muy raro, puede olvidar con seguridad que alguna vez existió.
Dicho esto, aquí están los detalles. La directiva declare()
se usa actualmente para dos cosas completamente no relacionadas:
Como
declare(encoding=…)
, para declarar la codificación de un archivo PHP. (En este sentido, es comparable a una versión del lado del servidor de<meta charset="…">
.)Pero no uses esto. En la mayoría de las circunstancias, la codificación del script no importa. Si por alguna razón lo hace, la codificación PHP debería establecerse globalmente (con suerte en "UTF-8") por el valor de configuración
zend.script_encoding
. Establecerlo en el nivel de archivo es confuso e innecesario.Como
declare(ticks=…)
, para definir la frecuencia a la que se llaman las funciones de tick. Las funciones de tick son llamadas periódicamente por el intérprete de PHP y se configuran medianteregister_tick_function
.Si bien algunos de los comentarios en php.net sugieren usarlo para implementar los tiempos de espera en los accesos a la red, en realidad no funciona como se esperaba, ya que las señales no se activan mientras el intérprete está bloqueado en una llamada de función nativa. Puede tener algunas aplicaciones en la evaluación comparativa, pero fuera de eso es básicamente inútil. Yo lo evitaría.