php 连接zookeeper实例

7 篇文章 0 订阅
3 篇文章 0 订阅

1、安装成功zookeeper后,在zookeeper 的bin目录下有启动相应的启动脚本

启动Server

                      ./zkServer.sh start

启动client:(*注:cli需要安装java)

                     zkCli.sh

2、PHP实例:

<?php
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);
}

leader与worker任务的分配:
class  Worker  extends  Zookeeper {
 
   const  CONTAINER =  '/cluster'  ;
 
   protected  $acl   array (
                     array  (
                       'perms'  => Zookeeper::  PERM_ALL ,
                       'scheme'  =>  'world'   ,
                       'id'  =>  'anyone'  ) );
 
   private  $isLeader   false ;
 
   private  $znode   ;
 
   public function  __construct( $host =  '' , $watcher_cb =  null  , $recv_timeout = 10000 ) {
     parent :: __construct( $host, $watcher_cb, $recv_timeout );
  }
 
   public function  register() {
     if ( ! $this->exists(  self  :: CONTAINER   ) ) {
      $this->create(  self  :: CONTAINER   null , $this->  acl  );
    }
 
    $this->znode = $this->create(  self  ::CONTAINER .  '/w-'   ,
                                   null  ,
                                  $this->acl,
                                  Zookeeper:: EPHEMERAL | Zookeeper::SEQUENCE );
 
    $this->  znode  = str_replace(  self  :: CONTAINER   . '/'   ''   , $this->  znode  );
 
    printf(  "I'm registred as: %s\n" , $this->   znode  );
 
    $watching = $this->watchPrevious();
 
     if ( $watching == $this->   znode  ) {
      printf(  "Nobody here, I'm the leader\n"  );
      $this->setLeader(  true  );
    }
     else  {
      printf(  "I'm watching %s\n"  , $watching );
    }
  }
 
   public function  watchPrevious() {
    $workers = $this->getChildren(  self  :: CONTAINER   );
    sort( $workers );
    $size = sizeof( $workers );
     for ( $i = 0 ; $i < $size ; $i++ ) {
       if ( $this->   znode  == $workers[ $i ] ) {
         if  ( $i > 0 ) {
          $this->get(  self  :: CONTAINER   '/'  . $workers[ $i - 1 ],  array  ( $this,  'watchNode'  ) );
           return  $workers[ $i - 1 ];
        }
 
         return  $workers[ $i ];
      }
    }
 
     throw new  Exception(  sprintf(  "Something went very wrong! I can't find myself: %s/%s" ,
                           self  :: CONTAINER   ,
                          $this->   znode  ) );
  }
 
   public function  watchNode( $i, $type, $name ) {
    $watching = $this->watchPrevious();
     if ( $watching == $this->   znode  ) {
      printf(  "I'm the new leader!\n"  );
      $this->setLeader(  true  );
    }
     else  {
      printf(  "Now I'm watching %s\n"  , $watching );
    }
  }
 
   public function  isLeader() {
     return  $this->   isLeader  ;
  }
 
   public function  setLeader($flag) {
    $this->  isLeader  = $flag;
  }
 
   public function  run() {
    $this->register();
 
     while true  ) {
       if ( $this->isLeader() ) {
        $this->doLeaderJob();
    }
     else  {
      $this->doWorkerJob();
    }
 
      sleep( 2 );
    }
  }
 
   public function  doLeaderJob() {
     echo  "Leading\n"   ;
  }
 
   public function  doWorkerJob() {
     echo  "Working\n"   ;
  }
}
$worker =  new  Worker(  '127.0.0.1:2181'  );
$worker->run();
可以启动3个php进程,查看脚本的运行。
进程1:
[root@localhost zookeeper]# php -f worker.php
I'm registred as: w-0000000010
Nobody here, I'm the leader
Leading
进程2:
[daniel.luo@localhost zookeeper]$ php -f worker.php
I'm registred as: w-0000000011
I'm watching w-0000000010
Working
进程3:
[daniel.luo@localhost zookeeper]$ php -f worker.php
I'm registred as: w-0000000012
I'm watching w-0000000011
Working

ctrl + c 关闭leader进程后,会发现进程2与3会选举出新的leader





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值