ホームページ  >  記事  >  バックエンド開発  >  PHP 用の Zookeeper 拡張機能をインストールする方法

PHP 用の Zookeeper 拡張機能をインストールする方法

藏色散人
藏色散人オリジナル
2021-03-08 10:31:042390ブラウズ

Zookeeper 拡張機能を PHP でインストールする方法: 最初に 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 拡張機能は後で説明します。 prefix=/usr /local/zookeeper //インストール ディレクトリを指定します

make && make install

インストールが完了しました

2. http: にある php Zookeeper 拡張機能をインストールします。 //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

Configure 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

cpzoo_sample.cfgzoo.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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。