Nan*_*r V 23 php control-structure
今天我正在浏览php手册并偶然发现一个控制结构声明.
declare构造用于为代码块设置执行指令
这是declare
应该做的.说实话,我不明白.在再次阅读时,它发现了一件新事物Ticks
tick是由声明块内的解析器执行的每N个低级别可勾选语句发生的事件.在声明块的指令部分中使用ticks = N指定N的值.
我也不明白.这是什么意思N low-level tickable statements
如果有一个很好的示例代码,那么它将很容易理解.但手册中没有找到任何内容.我在SO Q1上找到了一些,这实际上增加了我的好奇心和困惑.任何人都可以使用这个,我们可以在哪里使用它.
我的实际困惑在于这个陈述(来自链接的帖子)you can declare a tick-function which checks each n executions of your script whether the connection is still alive or not
.因此,当我在php文件上注册tick = 20的tick函数并执行它时,该文件将处于活动状态,直到20执行完成(当它被错误地视为多线程时得到这个想法).这是我的想法,我不认为它是正确的..
或者它是一个简单的替代品 while($x = 20)
[编辑1]
我也看到了declare()
php手册函数参数的另一部分的实现
[编辑2]
也在过程控制中
您可以使用declare()语句指定程序中允许回调的位置.这允许您最小化处理异步事件的开销
nl-*_*l-x 15
当PHP执行您的脚本时,执行可被视为正在执行的许多语句.大多数语句会导致Tick,但不一定所有语句都会这样做.(手动说:Typically, condition expressions and argument expressions are not tickable.
)
当您执行5个语句时,此块通常会导致5个滴答:
$a = 1;
$B = 2;
$a = 3;
$B = 4;
$a = 5;
Run Code Online (Sandbox Code Playgroud)
这个块通常会导致5个滴答,并且一个滴答滴答,因为while循环的结束也被计为一个语句/滴答:
while ($i < 5)
$a++;
Run Code Online (Sandbox Code Playgroud)
借助declare(ticks=N)
和register_tick_function()
,您现在可以在语句/标记之间执行代码.register_tick_function指定当发生tick事件时应该调用哪个函数.并且声明设置在发生tick事件之前应该传递多少tick.
使用declare(ticks=1)
和register_tick_function('someFunction');
您将someFunction()
在每个语句/刻度之间调用代码.
如果您使用declare(ticks=3)
,则将someFunction()
在每个第三个语句/ tick上执行.
例:
function handler(){
echo "x";
}
register_tick_function("handler");
$i = 0;
declare(ticks = 4) {
while ($i < 9)
echo ++$i;
}
Run Code Online (Sandbox Code Playgroud)
这个脚本将输出:就1234x5678x9
这么简单.
现在链接问题中"连接是否仍然存在"的意思并不是真正有趣,并且实际上与上述内容无关.这只是你可以在每个蜱事件上做的事情.但你也可以做一些完全不同的事情.提到的只是某些脚本可能需要相当长的时间才能执行,而在执行期间,客户端可能会断开连接.(想象一下,关闭浏览器,同时脚本仍在运行.)默认情况下,PHP将继续运行脚本,即使客户端已断开连接.您可以使用该功能connection_aborted()
来检测客户端是否已断开连接.这也是你可以在不使用刻度线的情况下做的事情.
现在让我们假设您希望脚本在客户端断开连接后立即停止运行.只需使用......
function killme() {
if (connection_aborted()) {
die();
}
}
register_tick_function('killme');
declare(ticks=1);
Run Code Online (Sandbox Code Playgroud)
...并且您的脚本将killme()
在代码的每个语句之后调用.killme()
将检查客户端是否仍然连接,die()
何时不连接.
在实践中:忽略该declare()
指令.除非你遇到使用它的代码 - 这是非常罕见的 - 你可以安全地忘记它曾经存在过.
话虽这么说,这是细节.该declare()
指令目前用于两个完全不相关的事情:
因为declare(encoding=…)
,用于声明PHP文件的编码.(从这个意义上说,它可以与服务器端版本相媲美<meta charset="…">
.)
但是不要使用它.在大多数情况下,脚本编码无关紧要.如果它有可能,那么PHP编码应该通过zend.script_encoding
配置值全局设置(希望为"UTF-8").在文件级别设置它是令人困惑和不必要的.
因为declare(ticks=…)
,用于定义调用tick函数的频率.tick解释器定期调用Tick函数,并使用它们进行设置register_tick_function
.
虽然php.net上的一些评论建议使用它来实现网络访问的超时,但实际上并没有按预期工作,因为在本机函数调用中阻止解释器时不会触发tick.它可能在基准测试中有一些应用,但除此之外它基本上没用.我会避免它.