颠覆常识 -- 死循环结构代码,也有机会执行循环外的逻辑

php中文网
发布: 2016-06-23 14:13:10
原创
1094人浏览过

 
class ZookeeperDemo extends Zookeeper {
 
  public function watcher( $i, $type, $key ) {
    echo "Insider Watcher\n";
 
    // Watcher gets consumed so we need to set a new one
    $this->get( '/test', array($this, 'watcher' ) );
  }
 
}
 
$zoo = new ZookeeperDemo('127.0.0.1:2181');
$zoo->get( '/test', array($zoo, 'watcher' ) );
 
while( true ) {
  echo '.';
  sleep(2);
}


现在运行该脚本。

$ php zookeeperdemo1.php
此处应该会每隔2秒产生一个点。现在切换到ZooKeeper客户端,并更新“/test”值。

[zk: 127.0.0.1:2181(CONNECTED) 20] set /test foo
这样就会静默触发PHP脚本中的“Insider Watcher”消息。


怎么会这样的?进入while结构后,为什么还能执行watcher方法。请各位看官发表讨论。



回复讨论(解决方案)

分布式应用?
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,包含一个简单的原语集,是Hadoop和Hbase的重要组件。目前提供Java和C的接口。

你说是颠覆常识,也是可以理解的

不是谈分布式,分布式只是我业务需要而已。

颠覆的地方是 -- 

在PHP中,死循环的结构有机会执行循环外明显与循环无关的逻辑 -- 这是多线程的表现哦 -- 于是我们猜测这个zookeeper扩展是以多线程的方式在php环境中运行的。

Watcher gets consumed so we need to set a new one
你做这个,应该比我还要清楚

php Zookeeper 时时都在侦听 php 的行为

我不做这个,是刚打算做这个。

我的意思是,如果有人写调试一段php代码,发现在死循环的过程中,有机会执行与循环完全没关系的代码,不会感到奇怪吗?

主线程死循环中,子线程继续执行任务,这不是很正常么?

php中有个pcntl 能 fork出多进程执行

肯定不是fork

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号