首頁  >  文章  >  後端開發  >  php的zookeeper擴充功能怎麼安裝

php的zookeeper擴充功能怎麼安裝

藏色散人
藏色散人原創
2021-03-08 10:31:042387瀏覽

php安裝 zookeeper擴充功能的方法:先下載zookeeper;然後指定安裝目錄;最後透過「make && make install」安裝zookeeper即可。

php的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即可。

【推薦:《PHP影片教學》】

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程式碼測試

##測試程式碼

    <?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(&#39;@/$@&#39;, $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=&#39;&#39;)
     
    {
     
    $parts = explode(&#39;/&#39;, $path);
     
    $parts = array_filter($parts);//过滤空值
     
    $subPath = &#39;&#39;;
     
    while (count($parts) > 1) {
     
    $subPath .= &#39;/&#39; . array_shift($parts);//数组第一个元素弹出数组
     
    if (!$this->zookeeper->exists($subpath)) {
     
    $this->makeNode($subPath, $value);
     
    }
     
    }
     
    }
     
    /*
     
     * 创建节点
     
     *
     
     */
     
    private function makeNode($path, $value, array $params = array())
     
    {
     
    if (empty($params)) {
     
    $params = [
     
    [
     
    &#39;perms&#39; => Zookeeper::PERM_ALL,
     
    &#39;scheme&#39; => &#39;world&#39;,
     
    &#39;id&#39; => &#39;anyone&#39;
     
    ]
     
    ];
     
    }
     
    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(&#39;localhost:2181&#39;);
     
    //var_dump($zk->get(&#39;/zookeeper&#39;));
     
    var_dump($zk->getChildren(&#39;/foo&#39;));
     
    //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&#39;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 = &#39;&#39;) {
     
    $parts = explode(&#39;/&#39;, $path);
     
    $parts = array_filter($parts);
     
    $subpath = &#39;&#39;;
     
    while (count($parts) > 1) {
     
    $subpath .= &#39;/&#39; . 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(
     
    &#39;perms&#39; => Zookeeper::PERM_ALL,
     
    &#39;scheme&#39; => &#39;world&#39;,
     
    &#39;id&#39; => &#39;anyone&#39;,
     
    )
     
    );
     
    }
     
    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(&#39;@/$@&#39;, $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, &#39;watchCallback&#39;));
     
    }
     
    }
     
    }
     
     
     
    /**
     
     * 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, &#39;watchCallback&#39;));
     
    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(&#39;localhost:2181&#39;);
     
    // var_dump($zk->get(&#39;/&#39;));
     
    // var_dump($zk->getChildren(&#39;/&#39;));
     
    // var_dump($zk->set(&#39;/test&#39;, &#39;abc&#39;));
     
    // var_dump($zk->get(&#39;/test&#39;));
     
    // var_dump($zk->getChildren(&#39;/&#39;));
     
    // var_dump($zk->set(&#39;/foo/001&#39;, &#39;bar1&#39;));
     
    // var_dump($zk->set(&#39;/foo/002&#39;, &#39;bar2&#39;));
     
    // var_dump($zk->get(&#39;/&#39;));
     
    // var_dump($zk->getChildren(&#39;/&#39;));
     
    // var_dump($zk->getChildren(&#39;/foo&#39;));
     
     
     
    //watch example 一旦/test节点的值被改变,就会调用一次callback
     
    function callback() {
     
    echo "in watch callback\n";
     
    }
     
    //$zk->set(&#39;/test&#39;, 1);
     
    $ret = $zk->watch(&#39;/test&#39;, &#39;callback&#39;); 
     
    //$zk->set(&#39;/test&#39;, 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( &#39;/test&#39;, array($this, &#39;watcher&#39; ) );
     
     
     
     }
     
     
     
    }
    
    $zoo = new ZookeeperDemo(&#39;127.0.0.1:2181&#39;);
    $zoo->get( &#39;/test&#39;, array($zoo, &#39;watcher&#39; ) );
    while( true ) {
     echo &#39;.&#39;;
     sleep(2);
    }
    */
    /*
    
    // $zc = new Zookeeper();
     
    // $zc->connect(&#39;127.0.0.1:2181&#39;);
    // var_dump($zc->get(&#39;/zookeeper&#39;));
    // exit;
    */
     
    ?>
程式碼參考連結:

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

 

以上是php的zookeeper擴充功能怎麼安裝的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn