php的zookeeper扩展安装及使用

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

要在php中使用zookeeper,先要安装php zookeeper扩展,要安装php zookeeper扩展,得先安装zookeeper

1、安装zookeeper

在这里面下载最新版的稳定版

http://mirror.bit.edu.cn/apache/zookeeper/stable/

cd /download

wget http://mirror.bit.edu.cn/apache/zookeeper/stable/zookeeper-3.4.12.tar.gz //这个是已经安装好的工具,下面我们还需要自己编译安装一下,因为后面安装php的扩展时用得到

tar -zxvf zookeeper-3.4.12.tar.gz

cd zookeeper-3.4.12/src/c/

./configure --prefix=/usr/local/zookeeper  //指定一下安装目录

make && make install

就这样安装完了

2、安装php zookeeper的扩展  在 http://pecl.php.net/package/zookeeper中找

cd /download

wget http://pecl.php.net/get/zookeeper-0.6.2.tgz

tar -zxvf zookeeper-0.6.2.tgz

 cd zookeeper-0.6.2

./configure --with-libzookeeper-dir=/usr/local/zookeeper //要指定依赖

make && make install

配置php.ini

extension="/usr/local/Cellar/php/7.2.6/pecl/20170718/zookeeper.so"

重启php-fpm即可

3、启动zookeeper前要安装jdk  已经安装的可以忽略

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html里面下载

然后傻瓜式安装,这里不说了

4、启动zookeeper

cd /download/zookeeper-3.4.12/bin

 ./zkServer.sh start

./zkCli.sh -server 127.0.0.1:2181

cli方式开启

注意:

如果报错:

cd ../conf

cp zoo_sample.cfg zoo.cfg

复制一下文件

5、php代码测试

测试代码1、

<?php
/**
 * 
 */
class zookeeperDemo
{
	private $zookeeper;
	function __construct($address)
	{
		$this->zookeeper = new Zookeeper($address);
	}
	/*
	* get 	
	*/
	public function get($path)
	{
		if (!$this->zookeeper->exists($path)) {
			return null;
		}
		return $this->zookeeper->get($path);
	}

	public function getChildren($path) {
		if (strlen($path) > 1 && preg_match('@/$@', $path)) {
			// remove trailing /
			$path = substr($path, 0, -1);
		}
		return $this->zookeeper->getChildren($path);
	}
	/*
	* set 值
	*
	*
	*/
	public function set($path, $value)
	{
		if (!$this->zookeeper->exists($path)) {
			//创建节点
			$this->makePath($path);
		} else {
			$this->zookeeper->set($path,$value);
		}

	}
	/*
	* 创建路径
	*/
	private function makePath($path, $value='')
	{
		$parts = explode('/', $path);
		$parts = array_filter($parts);//过滤空值
		$subPath = '';
		while (count($parts) > 1) {
			$subPath .= '/' . array_shift($parts);//数组第一个元素弹出数组
			if (!$this->zookeeper->exists($subpath)) {
				$this->makeNode($subPath, $value);
			}
		}
	}
	/*
	* 创建节点
	*
	*/
	private function makeNode($path, $value, array $params = array())
	{
		if (empty($params)) {
			$params = [
				[
					'perms' => Zookeeper::PERM_ALL,
					'scheme' => 'world',
					'id' => 'anyone'
				]
			];
		}
		return $this->zookeeper->create($path, $value, $params);
	}
	/*
	* 删除
	**/
	public function deleteNode($path)
	{
		if (!$this->zookeeper->exists($path)) {
			return null;
		} else {
			return $this->zookeeper->delete($path);
		}
	}

}
$zk = new zookeeperDemo('localhost:2181');
//var_dump($zk->get('/zookeeper'));
var_dump($zk->getChildren('/foo'));
//var_dump($zk->deleteNode("/foo"));

?>

测试代码2、

<?php
/**
 * PHP Zookeeper
 *
 * PHP Version 5.3
 *
 * The PHP License, version 3.01
 *
 * @category  Libraries
 * @package   PHP-Zookeeper
 * @author    Lorenzo Alberton <l.alberton@quipo.it>
 * @copyright 2012 PHP Group
 * @license   http://www.php.net/license The PHP License, version 3.01
 * @link      https://github.com/andreiz/php-zookeeper
 */
/**
 * Example interaction with the PHP Zookeeper extension
 *
 * @category  Libraries
 * @package   PHP-Zookeeper
 * @author    Lorenzo Alberton <l.alberton@quipo.it>
 * @copyright 2012 PHP Group
 * @license   http://www.php.net/license The PHP License, version 3.01
 * @link      https://github.com/andreiz/php-zookeeper
 */
class Zookeeper_Example
{
	/**
	 * @var Zookeeper
	 */
	private $zookeeper;
    /**
      * @var Callback container
      */
    private $callback = array();
	/**
	 * Constructor
	 *
	 * @param string $address CSV list of host:port values (e.g. "host1:2181,host2:2181")
	 */
	public function __construct($address) {
		$this->zookeeper = new Zookeeper($address);
	}
	/**
	 * Set a node to a value. If the node doesn't exist yet, it is created.
	 * Existing values of the node are overwritten
	 *
	 * @param string $path  The path to the node
	 * @param mixed  $value The new value for the node
	 *
	 * @return mixed previous value if set, or null
	 */
	public function set($path, $value) {
		if (!$this->zookeeper->exists($path)) {
			$this->makePath($path);
			$this->makeNode($path, $value);
		} else {
			$this->zookeeper->set($path, $value);
		}
	}
	/**
	 * Equivalent of "mkdir -p" on ZooKeeper
	 *
	 * @param string $path  The path to the node
	 * @param string $value The value to assign to each new node along the path
	 *
	 * @return bool
	 */
	public function makePath($path, $value = '') {
		$parts = explode('/', $path);
		$parts = array_filter($parts);
		$subpath = '';
		while (count($parts) > 1) {
			$subpath .= '/' . array_shift($parts);
			if (!$this->zookeeper->exists($subpath)) {
				$this->makeNode($subpath, $value);
			}
		}
	}
	/**
	 * Create a node on ZooKeeper at the given path
	 *
	 * @param string $path   The path to the node
	 * @param string $value  The value to assign to the new node
	 * @param array  $params Optional parameters for the Zookeeper node.
	 *                       By default, a public node is created
	 *
	 * @return string the path to the newly created node or null on failure
	 */
	public function makeNode($path, $value, array $params = array()) {
		if (empty($params)) {
			$params = array(
				array(
					'perms'  => Zookeeper::PERM_ALL,
					'scheme' => 'world',
					'id'     => 'anyone',
				)
			);
		}
		return $this->zookeeper->create($path, $value, $params);
	}
	/**
	 * Get the value for the node
	 *
	 * @param string $path the path to the node
	 *
	 * @return string|null
	 */
	public function get($path) {
		if (!$this->zookeeper->exists($path)) {
			return null;
		}
		return $this->zookeeper->get($path);
	}
	/**
	 * List the children of the given path, i.e. the name of the directories
	 * within the current node, if any
	 *
	 * @param string $path the path to the node
	 *
	 * @return array the subpaths within the given node
	 */
	public function getChildren($path) {
		if (strlen($path) > 1 && preg_match('@/$@', $path)) {
			// remove trailing /
			$path = substr($path, 0, -1);
		}
		return $this->zookeeper->getChildren($path);
	}
	
	/**
	 * Delete the node if it does not have any children
	 * 
	 * @param string $path the path to the node
	 * 
	 * @return true if node is deleted else null
	 */
	 
	 public function deleteNode($path)
	 {
	 	if(!$this->zookeeper->exists($path))
	 	{
	 		return null;
	 	}
	 	else
	 	{
	 		return $this->zookeeper->delete($path);
	 	}
	 }
     
    /**
	 * Wath a given path
	 * @param string $path the path to node
	 * @param callable $callback callback function
	 * @return string|null
	 */
	public function watch($path, $callback)
	{
		if (!is_callable($callback)) {
			return null;
		}
		
		if ($this->zookeeper->exists($path)) {
			if (!isset($this->callback[$path])) {
				$this->callback[$path] = array();
			}
			if (!in_array($callback, $this->callback[$path])) {
				$this->callback[$path][] = $callback;
				return $this->zookeeper->get($path, array($this, 'watchCallback'));
			}
		}
	}
	
	/**
	 * Wath event callback warper
	 * @param int $event_type
	 * @param int $stat
	 * @param string $path
	 * @return the return of the callback or null
	 */
	public function watchCallback($event_type, $stat, $path)
	{
		if (!isset($this->callback[$path])) {
			return null;
		}
		
		foreach ($this->callback[$path] as $callback) {
			$this->zookeeper->get($path, array($this, 'watchCallback'));
			return call_user_func($callback);
		}
	}
	
	/**
	 * Delete watch callback on a node, delete all callback when $callback is null
	 * @param string $path
	 * @param callable $callback
	 * @return boolean|NULL
	 */
	public function cancelWatch($path, $callback = null)
	{
		if (isset($this->callback[$path])) {
			if (empty($callback)) {
				unset($this->callback[$path]);
				$this->zookeeper->get($path); //reset the callback
				return true;
			} else {
				$key = array_search($callback, $this->callback[$path]);
				if ($key !== false) {
					unset($this->callback[$path][$key]);
					return true;
				} else {
					return null;
				}
			}
		} else {
			return null;
		}
	}
}
$zk = new Zookeeper_Example('localhost:2181');
// var_dump($zk->get('/'));
// var_dump($zk->getChildren('/'));
// var_dump($zk->set('/test', 'abc'));
// var_dump($zk->get('/test'));
// var_dump($zk->getChildren('/'));
// var_dump($zk->set('/foo/001', 'bar1'));
// var_dump($zk->set('/foo/002', 'bar2'));
// var_dump($zk->get('/'));
// var_dump($zk->getChildren('/'));
// var_dump($zk->getChildren('/foo'));

//watch example   一旦/test节点的值被改变,就会调用一次callback
function callback() {
    echo "in watch callback\n";
}
//$zk->set('/test', 1);
$ret = $zk->watch('/test', 'callback'); 
//$zk->set('/test', 2);//在终端执行
while (true) {
    sleep(1);
}

/*
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
    
//ZooKeeper提供了可以绑定在znode的监视器。如果监视器发现znode发生变化,该service会立即通知所有相关的客户端。这就是PH//P脚本如何知道变化的。Zookeeper::get方法的第二个参数是回调函数。当触发事件时,监视器会被消费掉,所以我们需要在回调函
//数中再次设置监视器。
    
    $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);
}
*/
/*

// $zc = new Zookeeper();

// $zc->connect('127.0.0.1:2181');

// var_dump($zc->get('/zookeeper'));

// exit;
*/

?>

代码参考链接:

https://github.com/php-zookeeper/php-zookeeper/blob/master/examples/Zookeeper_Example.php

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值