当前位置 博文首页 > 文章内容

    php的zookeeper扩展怎么安装

    作者:shunshunshun18 栏目:未分类 时间:2021-03-08 10:44:45

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    php安装 zookeeper扩展的方法:首先下载zookeeper;然后指定一下安装目录;最后通过“make && make install”安装zookeeper即可。

    本文操作环境:Windows7系统、PHP7.1、Dell G3电脑。

    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