2010-09-07 13 views
15

Me gustaría saber por qué, cómo y cuándo usar las garrapatas en PHP:¿Para qué sirven las marcas en PHP?

declare(ticks=1); 

// A function called on each tick event 
function tick_handler() 
{ 
    echo "tick_handler() called\n"; 
} 

register_tick_function('tick_handler'); 

$a = 1; 

if ($a > 0) { 
    $a += 2; 
    print($a); 
} 
+0

posible duplicado de [En PHP, ¿qué es una marca?] (Http://stackoverflow.com/questions/1629005/in-php-what-is-a-tick) –

Respuesta

3

una garrapata es un evento que ocurre por cada N sentencias de bajo nivel ejecutadas dentro del bloque analizador declare. El valor para N se especifica usando ticks=N dentro de la sección de directiva de los bloques declarar.

Los eventos que ocurren en cada tilde se especifican utilizando register_tick_function().

+1

Creo que @James Tang está pidiendo para qué se usa esta característica Creo que entiende lo que son las garrapatas y lo que hacen. – strager

+1

@stranger, de acuerdo, pero la parte "cómo" de la pregunta me activó para publicar esta respuesta. – shamittomar

+2

tal como está (ctrl + c) (ctrl + v) desde [php.net] (http://www.php.net/manual/en/control-structures.declare.php#control-structures.declare.ticks) –

12

Un uso fue esbozada por [email protected]:

Como ya se ha señalado Chris, garrapatas no hace que la secuencia de comandos multi-hilo, pero todavía son grandes. Las uso principalmente para el perfilado - por ejemplo, colocando lo siguiente en el mismo comienzo de la secuencia de comandos le permite controlar su uso de memoria:

<?php 

function profiler($return=false) { 
    static $m=0; 
    if ($return) return "$m bytes"; 
    if (($mem=memory_get_usage())>$m) $m = $mem; 
} 

register_tick_function('profiler'); 
declare(ticks=1); 

/* 
Your code here 
*/ 

echo profiler(true); 

?>

Este método es más preciso que llamar memory_get_usage sólo en el final de la secuencia de comandos . Tiene un poco de sobrecarga de rendimiento aunque :)

Otro uso fue descrito por [email protected]:

como leí sobre garrapatas primera vez que pensé "wtf, basura inútil" - pero luego descubrí algunos muy útil aplicación ...

se puede declarar una función que comprueba cada garrapata n ejecuciones de la secuencia de comandos si la conexión está todavía vivo o no, muy útil para algún tipo de secuencias de comandos para disminuir serverload

<?php 

function check_connection() 
{ if (connection_aborted()) 
    { // do something here, e.g. close database connections 
     // (or use a shutdown function for this 
     exit; } 
} 

register_tick_function("connection"); 

declare (ticks=20) 
{ 
    // put your PHP-Script here 
    // you may increase/decrease the number of ticks 
} 

?>
7

Las garrapatas pueden ser utilizados para cosas básicas como:

  1. de perfiles para las secuencias de comandos
  2. uso de memoria del monitor
  3. tiempo de ejecución Conde
  4. Comprobación de los recursos, por ejemplo, que una conexión de base de datos es en vivo

En PHP 4 podría utilizar ticks para implementar el manejo de errores de tipo excepción.

Las garrapatas se pueden utilizar también para otras cosas, como la implementación de una aplicación impulsada por eventos (por ejemplo, un juego).

+0

¿Se pregunta si ReactPHP alguna vez utilizó esto declara ticks para su bucle de evento? – CMCDragonkai

0

Encontré un caso de uso particularmente interesante para los ticks que aún no se describen aquí.

Estaba enfrentando un escenario en mi daemon en el que quería usar pcntl_fork y asegurarme de que ocurriera precisamente cuando yo también lo esperaba, pero los síntomas me mostraban lo contrario. El problema se reduce a 2 partes, (1) Cómo zend-ng (el nuevo motor de PHP7) recopila ejecuciones C basadas en sus directivas compiladas de PHP, es decir, entre cada grupo de ejecuciones tenemos un 'tic' y (2) ¿Cómo? están expuestos a usted en PHP, es decir, los descriptores de archivos se crean en el O/S mediante el código C, que puede estar o no en el bloque de ejecución esperado cuando se compila desde su código en C.

En términos simples, abrí un socket en el proceso principal y en un proceso secundario lo usé, ¿verdad? bueno, no, el recurso en el proceso hijo no siempre estaba allí como se esperaba y en todos los casos el proceso padre no finalizó (lo que normalmente explica por qué pierde acceso a recursos abiertos)

Forzando PHP a anunciar cuando un tic se hace después de que un bloque de ejecución realmente obligue a zend-ng a ser un poco menos eficiente y asegurar que mis bloques de ejecución no se ejecuten como se esperaba.

Cuestiones relacionadas