php 串連zookeeper執行個體

來源:互聯網
上載者:User
1、安裝成功zookeeper後,在zookeeper 的bin目錄下有啟動相應的啟動指令碼

啟動Server

./zkServer.sh start

啟動client:(*註:cli需要安裝java)

zkCli.sh

2、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
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.