php zookeeper watcher没有';行不通

php zookeeper watcher没有';行不通,php,apache-zookeeper,Php,Apache Zookeeper,我试图在php应用程序中使用zookeeper,我已经完成了下面的大部分get($path)/set($path,$value)/getChildren($path)函数,但watch\u callback函数不起作用 我的php版本是5.6.14,线程安全被禁用,我使用的是apache2.4 下面是一些代码片段 class Zookeeper_Module { private $zookeeper; public function __construct(){

我试图在php应用程序中使用zookeeper,我已经完成了下面的大部分
get($path)
/
set($path,$value)
/
getChildren($path)
函数,但
watch\u callback
函数不起作用

我的php版本是5.6.14,线程安全被禁用,我使用的是apache2.4

下面是一些代码片段

class Zookeeper_Module {

    private $zookeeper;

    public function __construct(){
        $this->ci = & get_instance();
        $zookeeper_server = $this->ci->config->item('zookeeper_server');

        $this->zookeeper = new Zookeeper($zookeeper_server);
    }

    public function set($path, $value){
        $this->zookeeper->set($path, $value);
    }

    public function get($path, $watch_cb = null){
        return $this->zookeeper->get($path, $watch_cb);
    }

    public function get_watch_cb($event_type = '', $stat = '', $path = ''){
        error_log('hello from get_watcher_cb');
        $value = $this->get($path, array($this, 'get_watch_cb'));
        // update redis cache
        $this->ci->cache->redis->save('some cache key', $value);
    }
}

class MyTest{
    public function get(){
        $zookeeper = new Zookeeper_Module ();

        $value = $zookeeper->get( '/foo/bar', array (
            $zookeeper,
            'get_watch_cb'
        ) );
    }

    public function set(){
        $zookeeper = new Zookeeper_Module ();
        $zookeeper->set( '/foo/bar', 'some value');
    }
}

我可以成功地获取或设置节点值,但我既不能捕获watch回调日志,也不能更新redis缓存。

我编写了一个更简单的演示,与此非常类似,而watcher在这个演示中工作正常

最显著的区别是

while( true ) {
    echo '.';
    sleep(2);
}
虽然java有一个jvm容器来承载观察者,但php没有容器来完成,所以我们必须使用
While(true)
来保持观察者的活力

因此,我在代码中添加了
while(true)
,现在观察器工作正常

但我不想在web应用程序中添加糟糕的
while(true)
,因此最终的解决方案是添加一个java应用程序与zookeeper通信并将结果保存在redis中,而php应用程序只是从redis读取信息