gpt4 book ai didi

php - 理解 PHP declare() 和 ticks

转载 作者:IT王子 更新时间:2023-10-28 23:58:03 26 4
gpt4 key购买 nike

今天我翻阅了php手册,偶然发现了一个控制结构declare .

The declare construct is used to set execution directives for a block of code

这是 declare 应该做的。老实说我没看懂。再次阅读它发现了一个新事物 Ticks

A tick is an event that occurs for every N low-level tickable statements executed by the parser within the declare block. The value for N is specified using ticks=N within the declare block's directive section.

我也不明白。 N 个低级可滴答语句 是什么意思 如果有好的示例代码,那应该很容易理解。但是在手册中没有找到。我在 SO Q1 上找到了一些,这实际上增加了我的好奇心和困惑。那么任何人都可以知道这是做什么用的,我们可以在哪里使用它。

我真正的困惑是这个语句(来自链接的so post)你可以声明一个tick函数来检查你的脚本的每n次执行是否连接仍然存在。因此,当我在 php 文件上注册一个带有 tick = 20 的刻度函数并执行它时,该文件将一直存在,直到 20 执行完成(当它被错误地认为是多线程时得到了这个想法)。这是我的想法,我认为它不正确..

还是while($x = 20)

的简单替换

[编辑 1]
我还看到了 declare() 的另一部分 php 手册 Function arguments 的实现

[编辑 2]
也在 Process Control

You use the declare() statement to specify the locations in your program where callbacks are allowed to occur. This allows you to minimize the overhead of handling asynchronous events

最佳答案

当PHP在执行你的脚本时,执行可以看作是执行了很多语句。大多数语句都会导致 Tick,但不一定所有语句都会这样做。 (手册说:通常情况下,条件表达式和参数表达式是不可勾选的。)

这个 block 通常会导致 5 个滴答声,因为您正在执行 5 个语句:

$a = 1;
$B = 2;
$a = 3;
$B = 4;
$a = 5;

这个 block 通常会导致 5 个滴答声,而当 while 循环结束时再多一个滴答声也算作一个语句/滴答声:

while ($i < 5)
$a++;

借助 declare(ticks=N)register_tick_function(),您现在可以在语句/tick 之间执行代码。 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;
}

此脚本将输出:1234x5678x9就这么简单。

现在,“连接是否仍然存在”的链接问题本身并不有趣,实际上与上述内容无关。这只是您可以在每个滴答事件中做的事情。但你也可以做一些完全不同的事情。提到的只是一些脚本可能需要相当长的时间才能执行,并且在执行期间,客户端可能会断开连接。 (想象关闭浏览器,而脚本仍在运行。)默认情况下,PHP 将继续运行脚本,即使客户端已断开连接。您可以使用函数 connection_aborted() 来检测客户端是否已断开连接。这是您也可以在根本不使用刻度的情况下完成的事情。

现在假设您希望您的脚本在客户端断开连接时立即停止运行。只需使用 ...

function killme() {
if (connection_aborted()) {
die();
}
}
register_tick_function('killme');
declare(ticks=1);

... 并且您的脚本将在您的代码的每个语句之后调用 killme()killme() 将检查客户端是否仍处于连接状态,并在未连接时检查 die()

关于php - 理解 PHP declare() 和 ticks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31284051/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com