2015-12-02 51 views
0

我想在PHP應用程序使用的飼養員,我已經完成了大部分的get($path)/set($path, $value)/getChildren($path)功能如下https://github.com/andreiz/php-zookeeper,除了watch_callback功能是行不通的。PHP飼養員守望不起作用

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

我可以成功地獲取或設置一個節點的值,但我既不能抓手錶回調日誌也沒有Redis的緩存進行更新。

回答

0

我寫了一個更簡單的演示,與此https://github.com/andreiz/php-zookeeper/wiki非常相似,觀察者在本演示中工作正常。

最顯著的區別是

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

而Java具有託管觀察家JVM容器,PHP不具有容器做到這一點,所以我們必須使用while(true)保持觀察家活着。

因此,我在我的代碼中添加了一個while(true),現在觀察者可以正常工作。

但我不想在網絡應用程序中添加一個可怕的while(true),所以最終的解決方案是添加一個java應用程序來與zookeeper進行通信並將結果保存在redis中,並且php應用程序只讀取來自redis的信息。