zookeeper扩展安装和使用
2017-04-18 阅读数:265

        ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。相信使用过分布式系统的同学应该都不陌生,本人在使用队列和solr时都用到了Zookeeper,使用起来很方便,一下介绍一下Zookeeper的php扩展安装和使用。

        

先安装zookeeper

wget http://www.apache.org/dist/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz && tar zxf zookeeper-3.4.8.tar.gz && cd zookeeper-3.4.8/src/c
                ./configure --prefix=/usr/local/zookeeper-3.4.8/ && make && make install

再安装扩展

wget http://pecl.php.net/get/zookeeper-0.2.2.tgz && tar zxf zookeeper-0.2.2.tgz && cd zookeeper-0.2.2 && phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-libzookeeper-dir=/usr/local/zookeeper-3.4.8/ && make && make install

配置php.ini

vim /usr/local/php/etc/php.ini

在扩展处添加

extension=zookeeper.so

重启php(启动方式根据自己平时习惯来,配置不一样会有不同的启动方式)

service php-fpm restart

验证扩展是否已安装成功

php -m | grep zookeeper

如果有结果,则表示已经安装成功了。

以下是Zookeeper扩展提供的api

<?php

/**
 * Zookeeper class.
 */

class Zookeeper {

	/* class constants */
	const PERM_READ   = 1;
	const PERM_WRITE  = 2;
	const PERM_CREATE = 4;
	const PERM_DELETE = 8;
	const PERM_ADMIN  = 16;
	const PERM_ALL    = 31;

	const EPHEMERAL = 1;
	const SEQUENCE  = 2;

	const EXPIRED_SESSION_STATE = -112;
	const AUTH_FAILED_STATE     = -113;
	const CONNECTING_STATE      = 1;
	const ASSOCIATING_STATE     = 2;
	const CONNECTED_STATE       = 3;
	const NOTCONNECTED_STATE    = 999;

	const CREATED_EVENT         = 1;
	const DELETED_EVENT         = 2;
	const CHANGED_EVENT         = 3;
	const CHILD_EVENT           = 4;
	const SESSION_EVENT         = -1;
	const NOTWATCHING_EVENT     = -2;

	const LOG_LEVEL_ERROR = 1;
	const LOG_LEVEL_WARN  = 2;
	const LOG_LEVEL_INFO  = 3;
	const LOG_LEVEL_DEBUG = 4;

	const SYSTEMERROR          = -1;
	const RUNTIMEINCONSISTENCY = -2;
	const DATAINCONSISTENCY    = -3;
	const CONNECTIONLOSS       = -4;
	const MARSHALLINGERROR     = -5;
	const UNIMPLEMENTED        = -6;
	const OPERATIONTIMEOUT     = -7;
	const BADARGUMENTS         = -8;
	const INVALIDSTATE         = -9;

	const OK         = 0;
	const APIERROR   = -100;
	const NONODE     = -101;
	const NOAUTH     = -102;
	const BADVERSION = -103;
	const NOCHILDRENFOREPHEMERALS = -108;
	const NODEEXISTS = -110;
	const NOTEMPTY   = -111;
	const SESSIONEXPIRED  = -112;
	const INVALIDCALLBACK = -113;
	const INVALIDACL      = -114;
	const AUTHFAILED      = -115;
	const CLOSING         = -116;
	const NOTHING         = -117;
	const SESSIONMOVED    = -118;


	/* if the host is provided, attempt to connect. */
	public function __construct( $host = '', $watcher_cb = null, $recv_timeout = 10000) {}

	public function connect( $host, $watcher_cb = null, $recv_timeout = 10000) {}

	public function create( $path, $value, $acl, $flags = null ) {}

	public function delete( $path, $version = -1 ) {}

	public function set( $path, $data, $version = -1, &$stat = null ) {}

	public function get( $path, $watcher_cb = null, &$stat = null, $max_size = 0) {}

	public function getChildren( $path, $watcher_cb = null ) {}

	public function exists( $path, $watcher_cb = null ) {}

	public function getAcl( $path ) {}

	public function setAcl( $path, $version, $acls ) {}

	public function getClientId( ) {}

	public function setWatcher( $watcher_cb ) {}

	public function getState( ) {}

	public function getRecvTimeout( ) {}

	public function addAuth( $scheme, $cert, $completion_cb = null ) {}

	public function isRecoverable( ) {}

	public function setLogFile( $file ) {} // TODO: might be able to set a stream like php://stderr or something

	public function getResultMessage( ) {}


	// static methods

	static public function setDebugLevel( $level ) {}

	static public function setDeterministicConnOrder( $trueOrFalse ) {}

}

使用示例

<?php
/**
 * PHP Zookeeper
 */
class Zookeeper_Example
{
	/**
	 * @var Zookeeper
	 */
	private $zookeeper;

	/**
	 * 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);
	}
}


$zk = new Zookeeper_Example('localhost:2181');
var_dump($zk->get('/'));
var_dump($zk->getChildren('/'));
var_dump($zk->set('/test123', 'abc'));
var_dump($zk->get('/test123'));
var_dump($zk->getChildren('/'));

var_dump($zk->set('/foo/001', 'bar1'));
var_dump($zk->set('/foo/002', 'bar2'));
var_dump($zk->getChildren('/foo'));


好了,Zookeeper扩展的安装和使用基本就这样,希望对刚开始使用Zookeeper的同学有所帮助。



前方10米有沙发可抢!
大人,请先右上角登个录 ↑
Copyright@2017-2020 www.dongguagua.com All Right Reserived 京ICP备17025269号