1
laoyuan 2016-07-08 17:39:47 +08:00
PHP7 跑通了,确实非阻塞。
5.5.34 这一行 function setTimeout(callable $callback, int $time) : Generator{ 报错 PHP Parse error: parse error, expecting `'{'' |
3
shyling 2016-07-08 19:22:42 +08:00
咦,我不认识的 php 。马克
|
4
Balthild 2016-07-09 01:49:58 +08:00 via Android
Tick 函数啊,有意思。
这个东西文档很少,也几乎没见到过人用,据说性能不好… |
5
dawniii 2016-07-09 07:54:38 +08:00
declare 据说不应该是过时的吗?每走一行代码就去检测任务。效率很低。
这段代码的原理就是每走一行代码就去检测是否有定时任务。。。 最后再加上 register_shutdown_function 这个函数。等脚本结束了,执行这个函数继续检测任务。 可以去看看 workerman 的定时器实现。 |
6
jhdxr 2016-07-09 14:38:20 +08:00
|
8
dawniii 2016-07-09 19:03:00 +08:00
@jhdxr 感谢 明白了。但是我看 workerman 的定时器好像是有两个流程 一个是在没有注册 event 的时候走信号,另一个是走 event (我记得 workerman 启动过程会注册 event, select 或者 libevent )。如果是这样效率应该是可以的。还有就是 LZ 代码我试着改了改,不用 yield 就能实现。。。
|
9
szopen OP @dawniii 的确可以不用 yield 。另外 tick 效率的确十分低下,据分析,当启用 tick 后, PHP 会在 所有 opcode 后插入 TICK 的 opcode,
PHP 7.1 的 Asynchronous Signal Handling 或许会解决 pcntl 信号的效率问题 https://wiki.php.net/rfc/async_signals |
10
szopen OP @dawniii 如果不用 yield ,可能会加重 tick hander 函数的复杂度, setTimeout 函数实现也会变得复杂起来
|
11
dawniii 2016-07-11 21:34:11 +08:00
@szopen 貌似没有复杂啊
<?php //enable ticks declare (ticks = 1); //setTimeout event list $timeoutQueue = new SplObjectStorage; register_tick_function(function() { global $timeoutQueue; foreach ($timeoutQueue as $v) { $callBack = $v(); if (is_callable($callBack)) { $callBack(); $timeoutQueue->detach($v); } } }); register_shutdown_function(function() { global $timeoutQueue; while($timeoutQueue->count()) { foreach ($timeoutQueue as $v) { $callBack = $v(); if (is_callable($callBack)) { $callBack(); $timeoutQueue->detach($v); } } usleep(1000); } }); function setTimeOut($callback, $time) { global $timeoutQueue; $end = microtime(true) * 1000 + $time; $f = function() use ($callback,$end) { if (microtime(true)*1000 >= $end) { return $callback; } else { return false; } }; $timeoutQueue->attach($f); return $f; } function clearTimeout(Closure $f) { global $timeoutQueue; $timeoutQueue->detach($f); } setTimeOut(function() { echo 'aaaa'; },3000); setTimeOut(function() { echo 'bbbb'; },6000); |