非常に基本的なとこからのおさらい
// っていってもdeclareを基本的に使わないと思うけど
tickとはdeclareブロックの実行中にパーサが N個の低レベル命令を実行するごとに 発生するイベントのことです。Nの値は declareブロックの命令の箇所で ticks=Nのように 指定します。
ticksはデバッグ、単純なマルチタスク処理、バックグラウンドI/Oや その他多くの処理を実装するのに便利です。
http://jp2.php.net/manual/ja/control-structures.declare.php
ちょっと書いてたらなんかずれるのでどういうタイミングで動くかサンプルコードを動かしてまとめてみた。
↓サンプルコードほぼコピペ
<?php // 呼び出されるとその時間を記録する関数 function profile ($dump = FALSE) { static $profile; static $i = 0; echo ++$i . "\n"; // 格納されたプロファイルを返し、その値を削除する if ($dump) { $temp = $profile; unset($profile); return $temp; } $profile[] = microtime(); } // tickハンドラの設定 register_tick_function("profile"); // declareブロックの前で初期化しておく profile (); // 1命令ごとにtickを投げるように設定しブロックを実行する declare (ticks=1) { // 試す命令 } // プロファイラに格納されたデータを表示する print_r (profile(true)); ?>
profileの呼ばれた回数は実際に試す命令回数+2(初期化とダンプの分)
命令 | *profileの呼ばれた回数 | *考察 |
---|---|---|
; | 4 | declare自体の実行 ;(式)の実行 |
;; | 5 | declare自体の実行 ;の実行*2 |
if (true); | 5 | declare自体の実行 trueの条件判断 ;の実行 |
for ($x = 0; $x < 1; ++$x); | 7 | $x=0の代入文 ++$xの加算分 比較分*2 forの命令(;)の実行 |
感じは掴めた。そりゃそうだみたいな結果だ。
ちょっとググったらこんなのがでてきた。
http://ido.nu/kuma/2006/11/27/what-is-tick-of-php/
https://www.codeblog.org/blog/moriyoshi/20070207.html
レベル違い過ぎる。
さらに核心的なお言葉
イベントという言葉に惑わされて非同期に呼ばれたレリするのかと思いましたが、ticksの正体は単純に N opcodes ごとに実行されるopcodeなのでした。
http://ido.nu/kuma/2006/11/27/what-is-tick-of-php/
冷めたのでお開き。