php连接zookeeper的watch不工作

路飞 发布于 2015/12/03 10:06
阅读 1K+
收藏 0

最近要在一个php的项目里用到zookeeper,大家也知道zookeeper官方只提供了Java和C的sdk,搜索一下,php的话大家都在用https://github.com/andreiz/php-zookeeper这个。

按照它的例子开始写,get($path)/set($path, value)/getChildren($path)之类的方法都可以正常工作,唯独添加了watcher的节点变更时的callback不能正常工作。

我用的php版本是5.6.14,thread safety disabled。

下面是部分代码片段

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');
    }
}



get/set都能正常工作,从终端连接zookeeper查看值也正确,但是watch_callback始终不工作,没有日志打印,设置的缓存也没有更新。

网上关于php zookeeper的信息不多,关于php zookeeper watcher的更少,翻来覆去一直是那几篇

https://github.com/andreiz/php-zookeeper/issues/34 这个和我的问题挺像,可惜我的php就是thread safety disabled,没啥帮助。

























按照惯例,福利奉上



加载中
0
路飞
路飞
哎,国内国外的网站一圈问下来,连一个回复也没有,实在无力吐槽
0
路飞
路飞
哎,再顶一下,有人么
0
欧阳先生
欧阳先生
帮顶 我也不会
0
风水书生
风水书生
不知用zk做什么?考虑一下etcd?
路飞
路飞
因为服务端要用zookeeper注册服务,所以我也只能用zookeeper发现服务
0
noday
noday
php这么好,怎么就没zookeeper呐
0
陶邦仁
陶邦仁
看下在Zookeeper zcli的方式 命令行中能否watch住  如果可以 那就是php代码有问题
陶邦仁
陶邦仁
@路飞 对的 所以看下php的代码 网络连接
路飞
路飞
能watch住,我用Java做客户端也能成功watch,问题应该就在php自己里面
0
kkkdd
kkkdd
我也查了这个问题了 ,我的 php 重新编译安装了 thread safety disabled 就工作了,但是不能选举出leader来 ,能监听  watch 
路飞
路飞
你的php用的什么版本,我用的5.6.14,会不会因为版本太高了
0
朱__朱
朱__朱

https://github.com/andreiz/php-zookeeper/wiki

楼主可以分别试一下nts和ts版本的php

路飞
路飞
@不到你,再评论一下好了,你用zookeeper的话,是通过while(true)来保证线程一直不销毁的么
kkkdd
kkkdd
回复 @路飞 : 我的之前 是enable的 ,watch的时候 会报waring
kkkdd
kkkdd
回复 @路飞 : 5.6.16 最新的
路飞
路飞
恩这个issue有提,需要thread safety disabled的 https://github.com/andreiz/php-zookeeper/issues/34
0
路飞
路飞

问题基本定位了,受@朱__朱 的提醒,不再自己的应用里尝试,而是直接vi一个demo.php,内容很简单,见https://github.com/andreiz/php-zookeeper/wiki,然后php demo.php,然后居然watcher就能正常的工作了。。。

我想了一下,问题可能就出在这里

while( true ) {
  echo '.';
  sleep(2);
}



这个while保证了在znode发生变更时php这边的对象还是活着的,基于这种猜测,我在应用的代码里也相应的加上了while(true)来保证线程不会停止,果然watcher能正常的回调了

那么,除了while(true),有没有比较优雅的方式来做这件事呢?

我目前能想到的就是绕开php,用java来负责发现服务,然后把结果放入redis,php这边就只从redis拿现成的结果就好了

@kkkdd @朱__朱

0
张学有
张学有
Zookeeper+Spring跨机房容灾系统以及灰度发布
课程学习地址:http://www.xuetuwuyou.com/course/20


一、课程使用到的软件及版本: centos系统,zookeeper 3.4.6,Spring4


二、课程目标:
1、熟练开发各种分布式应用
2、掌控zookeeper java客户端开发
3、熟练运用curator的各种特性


三、课程目录


 第1节、zookeepeer集群简介,跨机房容灾系统架构设计
 第2节、zookeeper的java客户端与spring整合(上)
 第3节、zookeeper的java客户端与spring整合(下)
 第4节、zookeeper-3watcher使用(上)
 第5节、zookeeper-3watcher使用(下)
 第6节、Curator介绍与使用
 第7节、zookeeper跨机房容灾系统设计两种方案详细讲解
 第8节、zookeeper跨机房容灾具体实现
 第9节、zookeeper跨机房容灾系统的调试,以及分布式锁的简单介绍
 第10节、zookeeper分布式锁(上)
 第11节、zookeeper分布式锁(下)
 第12节、zookeeper实现灰度指定服务器发布
 第13节、课程总结以及未来展望

返回顶部
顶部