内容目录
上一篇讲了一些安装流程,这篇来看下常用函数
http://php.net/manual/zh/book.zookeeper.php
我们用的比较多的应该是
public function connect( $host, $watcher_cb = null, $recv_timeout = 10000) {}
public function create( $path, $value, $acl, $flags = null ) {}
<?php
$zookeeper = new Zookeeper('locahost:2181');
$aclArray = array(
array(
'perms' => Zookeeper::PERM_ALL,
'scheme' => 'world',
'id' => 'anyone',
)
);
$path = '/path/to/newnode';
$realPath = $zookeeper->create($path, null, $aclArray);
if ($realPath)
echo $realPath;
else
echo 'ERR';
?>
public function delete( $path, $version = -1 ) {}
<?php
$zookeeper = new Zookeeper('locahost:2181');
$path = '/path/to/node';
$r = $zookeeper->delete($path);
if ($r)
echo 'SUCCESS';
else
echo 'ERR';
?>
public function set( $path, $data, $version = -1, &$stat = null ) {}
<?php
$zookeeper = new Zookeeper('locahost:2181');
$path = '/path/to/node';
$value = 'nodevalue';
$r = $zookeeper->set($path, $value);
if ($r)
echo 'SUCCESS';
else
echo 'ERR';
?>
public function get( $path, $watcher_cb = null, &$stat = null, $max_size = 0) {}
<?php
$zookeeper = new Zookeeper('locahost:2181');
$path = '/path/to/node';
$value = 'nodevalue';
$zookeeper->set($path, $value);
$r = $zookeeper->get($path);
if ($r)
echo $r;
else
echo 'ERR';
?>
public function getChildren( $path, $watcher_cb = null ) {}
<?php
$zookeeper = new Zookeeper('locahost:2181');
$path = '/zookeeper';
$r = $zookeeper->getchildren($path);
if ($r)
var_dump($r);
else
echo 'ERR';
?>
public function exists( $path, $watcher_cb = null ) {}
<?php
$zookeeper = new Zookeeper('locahost:2181');
$path = '/path/to/node';
$r = $zookeeper->exists($path);
if ($r)
echo 'EXISTS';
else
echo 'N/A or ERR';
?>
注意:以上代码均来自php官网,大家可以执行一遍就会发现不少warning报错,主要集中在节点不存在时候的创建、查询、删除,不能直接创建删除子节点等问题,稍后会有针对说明和解决方案。
其中需要注意:
1 其中exists和get都可以设置$watcher_cb,该参数将会传入一个对象方法或者一个可调用函数,exists 会对zk下node的create,change,delete事件监听,而get不会监听create事件
2 create 只能创建一次,第二次创建将会报错(有部分开发者利用该特性来实现分布式锁,下一篇将会提到分布式锁的多实现方案)
3 set 和delete只能删除子节点,zk扩展本身不支持循环删除,也是上面出现的问题之一,这个需要我们自己实现,这里提供一个set的实现也是来自扩展官方的例子
<?php
class Zookeeper_Example
{
public function __construct($address) {
$this->zookeeper = new Zookeeper($address);
}
public function set($path, $value) {
if (!$this->zookeeper->exists($path)) {
$this->makePath($path);
$this->makeNode($path, $value);
} else {
$this->zookeeper->set($path, $value);
}
}
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);
}
}
}
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);
}
public function get($path) {
if (!$this->zookeeper->exists($path)) {
return null;
}
return $this->zookeeper->get($path);
}
}
$zk = new Zookeeper_Example('localhost:2181');
var_dump($zk->set('/chenjie/info', 'bar1'));
var_dump($zk->get('/chenjie/info'));
这里采用的是对象的方式对zk默认方法封装更方便使用,点击查看扩展官方完整实例
https://github.com/andreiz/php-zookeeper/blob/master/examples/Zookeeper_Example.php
4 对于之前php官网中出现对不存在节点的创建、查询、删除报错的问题,建议先对节点进行exists判断,根据判断结果进行操作,避免warning报错影响业务流程
大佬这个主要有什么用呢,是处理分布式服务器调度吗?看的不太明白
用于分布式协调,配置管理、选主、分布式锁都可以,看场景