首页 > 编程语言 >hyperf 3.1安装和配置php-zookeeper扩展

hyperf 3.1安装和配置php-zookeeper扩展

时间:2024-01-14 09:01:01浏览次数:48  
标签:zookeeper hyperf 3.1 apache php config 3.8

Hyperf 提供了分布式系统的外部化配置支持,默认适配了:

本章节我们使用zookeeper扩展:

环境准备:

php版本:php8.2 

zookeeper版本:3.8.0

php-zookeeper:1.2.1

centos:7.6

hyperf官方使用的是swoole/ext-zookeeper扩展,由于这个扩展很久没有更新了,目前不兼容php8以上的版本,我试了好几个8的版本都不行,无奈只能换到php-zookeeper扩展

1、首先我们需要安装zookeeper,具体安装流程在之前的章节已经说过了

2、安装需要的依赖,由于我系统已经自己安装了gcc(4.9.4),gcc-c++,所以我不需要安装了

yum install -y cppunit-devel ant build-essential zlib zlib-devel openssl openssl-devel pcre pcre-devel autoconf automake

3、我们需要编译zookeeper的c扩展,所以我们需要去下载zookeeper源码编译c的扩展,地址:https://archive.apache.org/dist/zookeeper/zookeeper-3.8.0/apache-zookeeper-3.8.0.tar.gz
如果下载很慢的话,可以使用我百度网盘分享的:

链接:https://pan.baidu.com/s/1vfvLBEbCGDxZkfKoX7Jm4g
提取码:gprp

wget https://archive.apache.org/dist/zookeeper/zookeeper-3.8.0/apache-zookeeper-3.8.0.tar.gz
cd apache-zookeeper-3.8.0

由于我是3.8的版本高于3.6,所以默认解压缩包后是没有 build.xml,ivy.xml,ivysettings.xml 这三个文件,所以我们需要去3.6版本以下的去获取这三个文件,然后并复制到当前目录下,这里我是3.5.9的版本,地址:https://archive.apache.org/dist/zookeeper/zookeeper-3.5.9/apache-zookeeper-3.5.9.tar.gz
解压缩之后,分别将三个文件复制到 apache-zookeeper-3.8.0这个目录下,然后分别执行以下命令:

cp build.xml ivy* /www/server/apache-zookeeper-3.8.0
cd apache-zookeeper-3.8.0
ant compile_jute
cd /www/server/apache-zookeeper-3.8.0/zookeeper-client/zookeeper-client-c
autoreconf -if
./configure --prefix=/usr/local/zookeeper-lib
make && make install

至此就已经编译好了c的扩展,我们可以在 /usr/local/zookeeper-lib 目录下看到已经编译好的

 4、接下来我们编译安装php-zookeeper扩展,链接地址为:https://pecl.php.net/get/zookeeper-1.2.1.tgz

如果下载很慢的话,百度网盘分享:

链接:https://pan.baidu.com/s/14-ZSl7RFl7S3G5qiYugxzg
提取码:y8fz

接着我们分别执行以下命令进行编译安装:

wget https://pecl.php.net/get/zookeeper-1.2.1.tgz
tar -zxvf zookeeper-1.2.1.tgz
cd zookeeper-1.2.1
ln -s /www/server/php/82/bin/php-config /usr/bin
phpize
./configure --with-libzookeeper-dir=/usr/local/zookeeper-lib
make && make install

至此就已经安装好了php-zookeeper扩展,我们只需要将 /www/server/php/82/lib/php/extensions/no-debug-non-zts-20220829/zookeeper.so  加入到php配置文件中去

extension = zookeeper.so

重启php服务

php -m | grep zookeeper 
php --ri zookeeper

查看是否已经加载了zookeeper扩展:

 5、安装完成后,在hyperf中使用,文档我们需要安装扩展包:

cd /www/wwwroot/hyperf
composer require hyperf/config-center
composer require hyperf/config-zookeeper
#生成配置文件
php bin/hyperf.php vendor:publish hyperf/config-center

由于我们安装的是php-zookeeper扩展,并不是hyperf指定的swoole/zookeeper扩展,所以安装后需要更改源码包才行

在 /vendor/hyperf/config-zookeeper/src/Client.php中,需要修改以下代码:

 首先需要注释掉  use Swoole\Zookeeper; 代码段,然后在pull方法中更改代码:

public function pull(): array
    {
        $zk = new \Zookeeper($this->config->get('config_center.drivers.zookeeper.server'));
        $path = $this->config->get('config_center.drivers.zookeeper.path', '/conf');
        $config = $zk->get($path);
        return json_decode($config, true);
    }

然后在生成的配置文件config_center.php中,我们配置一下相关的代码:

<?php

declare(strict_types=1);
/**
 * This file is part of Hyperf.
 *
 * @link     https://www.hyperf.io
 * @document https://hyperf.wiki
 * @contact  [email protected]
 * @license  https://github.com/hyperf/hyperf/blob/master/LICENSE
 */
use Hyperf\ConfigCenter\Mode;

use function Hyperf\Support\env;

return [
    'enable' => (bool) env('CONFIG_CENTER_ENABLE', true),
    'driver' => env('CONFIG_CENTER_DRIVER', 'zookeeper'),
    'mode' => env('CONFIG_CENTER_MODE', Mode::COROUTINE),
    'drivers' => [
        'zookeeper' => [
            'driver' => Hyperf\ConfigZookeeper\ZookeeperDriver::class,
            'server' => env('ZOOKEEPER_SERVER', '192.168.43.21:2181'),
            'path' => env('ZOOKEEPER_CONFIG_PATH', '/conf'),
            'interval' => 5,
        ],
    ],
];

然后我们启动hyperf

php bin/hyperf.php server:watch

启动之后,报错,是因为zookeeper服务端没有创建 /conf这个节点,所以我这里写了一个代码创建/conf,并将本地的配置推送到zookeeper服务端:

<?php
declare(strict_types=1);

namespace App\Controller\Mouse;
use App\Controller\AbstractController;
class ConfigCenter extends AbstractController
{
    public function index()
    {
        /** @var \Hyperf\Contract\ConfigInterface $serverConfig */
        $serverConfig = $this->container->get(\Hyperf\Contract\ConfigInterface::class);
        $zookeeperAddress = $serverConfig->get('config_center.drivers.zookeeper.server');
//        $serverConfig->set('databases.default.host','127.0.0.1');
        $path = $serverConfig->get('config_center.drivers.zookeeper.path');
        $serverConfig = \Hyperf\Collection\collect($serverConfig)->toArray();
//        foreach ($serverConfig as $key=>$value){
//            $serverConfig = $value;
//        }
        $config = json_encode($serverConfig);
        $zk = new \Zookeeper($zookeeperAddress);
        $isExist = $zk->exists($path);
        $aclArray = array(
            array(
                'perms'  => \Zookeeper::PERM_ALL,
                'scheme' => 'world',
                'id'     => 'anyone',
            )
        );
//如果节点不存在则创建接节点 if(!$isExist){ $isAdd = $zk->create($path,$config,$aclArray); var_dump($isAdd); } $isSet = $zk->set($path,$config); var_dump($isSet); return $this->jsonResponse(1,'成功更新配置'); } }

更新到zookeeper服务端后,重新启动hyperf,发现配置生效了,但是我尝试修改zookeeper服务端的配置后,本地hyperf配置也自动更新了,但是并没有重新加载配置:

 原来官方就是这么设计的,更新之后需要重启才能生效,但是我想要更新之后不需要重启,所以我又没办法的更改了一下源码,在 \vendor\hyperf\config-center\src\AbstractDriver.php 这个文件中添加了一段代码:

在方法  createMessageFetcherLoop() 中

 

 foreach ($config as $configKey => $configValue){
                            $config = $configValue;
                        }

更改之后,重启hyperf已经生效,再次更新zookeeper服务端配置之后,本地也能自动更新配置并且生效了,至此hyperf使用zookeeper配置中心就完成,总的来说hyperf对zookeeper的支持还不算太好,主要是swoole/zookeeper不支持高版本的php,所以只能无奈更改hyperf的源代码之后才能实现,现在只能希望zookeeper的swoole扩展能更新一下吧!

标签:zookeeper,hyperf,3.1,apache,php,config,3.8
From: https://www.cnblogs.com/mouseOrCat/p/17963350

相关文章

  • MySQL运维实战(3.1) MySQL官方客户端使用介绍
    作者:俊达引言MySQL是MySQL安装包默认的客户端,该客户端程序通常位于二进制安装包的bin目录中,或者通过rpm安装包安装mysql-community-client,是数据库管理系统的重要组成部分。MySQL客户端不仅仅是一个简单的软件工具,更是连接用户与数据库之间的桥梁,对于有效地使用MySQL数据库的功......
  • 移动护理系统-ZooKeeper单机和集群方式安装部署
    1.1zookeeper安装1.下载地址http://mirror.bit.edu.cn/apache/zookeeper/选择版本,我选择的是注意:下载新版本的时候需要下载带bin的,因为有时候会报错错误:找不到或无法加载主类org.apache.zookeeper.server.quorum.QuorumPeerMain你下载使用的zk是未编译的apache-zookeep......
  • Xcode14.3.1真机调试iOS17的方法
    Hello,大家好我是咕噜铁蛋!Xcode是苹果官方开发工具,它提供了完整的开发环境和工具集,支持开发iOS、macOS、watchOS和tvOS应用程序。对于iOS开发者来说,Xcode是必备的工具之一。而随着iOS系统的不断更新和升级,Xcode也在不断地升级和改进,确保最好的开发体验。今天铁蛋将介绍如......
  • Mac安装Python3.12开发环境
    官网https://www.python.org/downloads/安装pythonpython-3.12.1-macos11.pkg下载后,安装一直下一步即可验证是否安装成功,执行python3命令和pip3命令配置环境变量获取python3安装位置并配置在.bash_profile#查看python路径whichpython3#修改配置文件.bash_profileopen-e.bash......
  • KubeSphere 社区双周报 | 2023.12.21-2024.01.04
    KubeSphere社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过commit的贡献者,并对近期重要的PR进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。本次双周报涵盖时间为:2023.12.21-2024.01.04。贡献者名单新晋KubeSpherecon......
  • 全解在Hyperf中避免进程残留的问题
    进程残留问题的原因进程资源未释放进程残留问题的原因主要是由于进程在运行过程中未能正确释放所占用的资源。这可能是由于代码逻辑错误、异常退出、资源管理不当等原因引起的。具体来说,进程资源未释放可能包括但不限于各种文件句柄、数据库连接、网络连接等。当这些资源没有被及时......
  • 世微 AP3471 8-30V 输出1.8V-28V 3.1A 同步降压恒压驱动器
    产品描述     AP3471是一款支持宽电压输入的同步降压电源管理芯片,输入电压8-30V范围内可实现3.1A的连续电流输出。通过调节FB端口的分压电阻,设定输出1.8V到28V的稳定电压。AP3471具有优秀的负载调整率和线电压调整率,在全范围内不超过±5%。AP3471采用电流......
  • 文心一言 VS 讯飞星火 VS chatgpt (165)-- 算法导论13.1 5题
    五、用go语言,证明:在一棵红黑树中,从某结点x到其后代叶结点的所有简单路径中,最长的一条至多是最短一条的2倍。文心一言:首先,我们要理解红黑树的性质。红黑树是一种自平衡的二叉查找树,它满足以下性质:每个节点或是红色,或是黑色。根节点是黑色。每个叶节点(NIL或空节点)是黑色。如果......
  • 文心一言 VS 讯飞星火 VS chatgpt (166)-- 算法导论13.1 6题
    六、用go语言,在一棵黑高为k的红黑树中,内部结点最多可能有多少个?最少可能有多少个?文心一言:红黑树是一种自平衡的二叉查找树,其中每个节点都有一个颜色属性,可以是红色或黑色。红黑树满足以下性质:每个节点或者是红色,或者是黑色。根节点是黑色。每个叶节点(NIL或空节点)是黑色。如......
  • JetBrains AppCode 2023.1 (macOS x64、aarch64) - 适用于 iOS/macOS 开发的智能 IDE
    Xcode14.3compatibility,Swiftrefactoringsandintentions,theIDE’sUI,andKotlinMultiplatformMobile.作者主页:sysin.orgJetBrainsAppCode-适用于iOS/macOS开发的智能IDEAppCode2023现已推出,立即了解最新变化为什么选择AppCode得益于对代码结构的深刻理解,Ap......