分类: PHP

  • box, by Hyperf

    Box 致力于帮助提升 PHP 应用程序的编程体验,尤其有助于 Hyperf 应用,管理 PHP 环境和相关依赖,同时提供将 PHP 应用程序打包为二进制程序的能力,还提供反向代理服务来管理和部署 Swoole/Swow 服务。

    目前还是早期实验版本,欢迎试玩 ~

    使用

    安装 box

    Mac
    wget https://github.com/hyperf/box/releases/download/v0.5.4/box_x86_64_macos -O box
    sudo mv ./box /usr/local/bin/box
    sudo chmod 755 /usr/local/bin/box
    // 确保 /usr/local/bin/box 在你的 $PATH 环境中,或者将 `box` 放到你想要的任意 $PATH 路径中
    Linux x86_64
    wget https://github.com/hyperf/box/releases/download/v0.5.4/box_x86_64_linux -O box
    sudo mv ./box /usr/local/bin/box
    sudo chmod 755 /usr/local/bin/box
    // 确保 /usr/local/bin/box 在你的 $PATH 环境中,或者将 `box` 放到你想要的任意 $PATH 路径中
    Linux aarch64

    目前我们缺少 AARCH64 Github Actions Runner,所以无法及时构建 AARCH64 版本的 bin 文件。

    wget https://github.com/hyperf/box/releases/download/v0.0.3/box_php8.1_aarch64_linux -O box
    sudo mv ./box /usr/local/bin/box
    sudo chmod 755 /usr/local/bin/box
    // 确保 /usr/local/bin/box 在你的 $PATH 环境中,或者将 `box` 放到你想要的任意 $PATH 路径中
    Windows
    curl -o box.exe https://github.com/hyperf/box/releases/download/v0.5.4/box_x64_windows.exe
    // 将 `box.exe` 放到你想要的任意 Path 环境变量路径中,同时 Windows 版本在执行时需要在命令行中使用 `box.exe` 而不是 `box`

    初始化 Github Access Token

    Box 需要一个 Github 访问令牌来请求 Github API,以检索包的版本。

    1. 创建 Github Access Tokenworkflow 范围需要勾选;
    2. 运行 box config set github.access-token <Your Token> 命令来设置您的 token;
    3. 玩得开心 ~

    设置 Box Kernel

    默认情况下,Box 由 Swow Kernel 提供支持,但是我们也提供了 Swoole Kernel,您可以通过 box config set kernel swoole 来切换为 Swoole Kernel,但是需要注意的是,Swoole Kernel 仅支持 PHP 8.1 版本,且不支持构建二进制程序功能和 Windows 系统环境。

    // 设置为 Swow Kernel [默认]
    box config set kernel swow
    
    // 设置为 Swoole Kernel (不支持 Windows)
    box config set kernel swoole

    命令

    • box get pkg@version从远程安装包,pkg是包名,version是包的版本,box get pkg表示安装最新版本的 pkg,例如, 运行 box get php@8.1 安装 PHP 8.1, 运行 box get composer 安装最新的 composer bin
    • box build-prepare 为 build 和 build-self 命令做好相关环境的准备
    • box build-self 构建 box bin 本身
    • box build <path> 将 Hyperf 应用程序构建成二进制文件
    • box self-update 将 box bin 更新至最新版本
    • box config list 输出 box 配置文件的所有内容
    • box config get <key> 从配置文件中按键检索值
    • box config set <key> <value>通过 key 设置 value 到配置文件中
    • box config unset <key>按 key 删除配置值
    • box config set-php-version <version>设置 box 的当前 PHP 版本,可用值:8.0 | 8.1
    • box config get-php-version <version>获取 box 的当前设置的 PHP 版本
    • box reverse-proxy -u <upsteamHost:upstreamPort> 启动一个反向代理 HTTP 服务器,用于将 HTTP 请求转发到指定的多个上游服务器
    • box php <argument> 通过当前 box 的 PHP 版本运行任何 PHP 命令
    • box composer <argument>通过当前 box 的 PHP 版本运行任何 Composer 命令,composer bin 的版本取决于最后执行的get composer命令
    • box php-cs-fixer <argument> 通过当前 box 的 PHP 版本运行任何 php-cs-fixer 命令,composer bin 的版本取决于最后执行的 get php-cs-fixer 命令
    • box cs-fix <argument> 通过当前 box 的 PHP 版本运行 php-cs-fixer fix 命令,composer bin 的版本取决于最后执行的 get php-cs-fixer 命令
    • box phpstan <argument> 通过当前 box 的 PHP 版本运行任何 phpstan 命令,composer bin 的版本取决于最后执行的 get phpstan 命令,此命令仅在 box v0.3.0 及以上的版本中可用
    • box pint <argument> 通过当前 box 的 PHP 版本运行任何 pint 命令,composer bin 的版本取决于最后执行的 get pint 命令,此命令仅在 box v0.3.0 及以上的版本中可用
    • box version 输出当前 box bin 的版本号

    关于 Swow-Skeleton

    希望体验 Box 完整功能的朋友,需要通过 Swow Kernel 来运行,因此您需要基于 hyperf/swow-skeleton 来运行您的项目,可通过 box composer create-project hyperf/swow-skeleton:dev-master 命令来创建一个基于 Hyperf 3.0 RC 版的 Swow 骨架项目。

  • Swoole-Cli 5.0.1 使用说明

    Swoole-Cli 5.0.1 使用说明

    avatar

    Rango

    Swoole-Cli 介绍

    Swoole-Cli 是一个 PHP 的二进制发行版,集成了 swoolephp 内核php-cliphp-fpm以及多个常用扩展。Swoole-Cli 是全部静态编译打包的,不依赖任何操作系统的so动态链接库,具备非常好的移植性,可以在任意 Linux 系统之间复制,下载即可使用。

    GitHub: https://github.com/swoole/swoole-cli

    操作系统

    Swoole-Cli 会提供LinuxmacOSWindows(Cygwin) 3种操作系统的二进制包的支持。

    Windows环境推荐使用WSL

    主要更新

    1. PHP 同步到 8.1.12 版本
    2. 增加了 mongodb 扩展
    3. 集成了 cli http server 和 php-fpm

    下载安装

    下载地址:

    直接下载后放置到 /usr/bin 目录,并且设置为可运行,chmod +x /usr/bin/swoole-cli 即可。在终端中执行:

    swoole-cli -v
    swoole-cli -m
    

    Shell

    替代 PHP

    将 Swoole-Cli 软链接到 php,替代 PHP

    ln -s /usr/bin/swoole-cli /usr/bin/php
    php -v
    # 安装 composer
    curl -sS https://getcomposer.org/installer | php
    

    Shell

    配置文件

    swoole-cli 默认不加载任何 php.ini 配置文件。

    可通过 -d 参数来设置 PHP 选项或使用 -c 参数指定加载的php.ini配置文件。

    swoole-cli -d swoole.use_shortname=off bin/hyperf.php start
    swoole-cli -c /tmp/php.ini -v
    

    Shell

    启动 PHP-FPM

    swoole-cli 集成了 PHP-FPM ,可使用 -P 命令来启动 fpm 。

    # 查看帮助文件
    swoole-cli -P -h
    # 运行 FPM
    swoole-cli -P --fpm-config /opt/php-8.1/etc/php-fpm.conf -p /opt/php-8.1/var
    # 关闭守护进程
    swoole-cli -P --fpm-config /opt/php-8.1/etc/php-fpm.conf -p /opt/php-8.1/var -F
    # 使用 root 账户启动
    swoole-cli -P --fpm-config /opt/php-8.1/etc/php-fpm.conf -p /opt/php-8.1/var -F -R
    

    Shell

    启动 CLI Server

    # 使用 Laravel Artisan 工具
    swoole-cli artisan serve
    # 启动 CLI Server
    swoole-cli -S 127.0.0.1:9001
    

    Shell

    启动 Swoole Server

    server.php

    $http = new Swoole\Http\Server('127.0.0.1', 9501);
    
    $http->on('start', function ($server) {
        echo "Swoole http server is started at http://127.0.0.1:9501\n";
    });
    
    $http->on('request', function ($request, $response) {
        $response->header('Content-Type', 'text/plain');
        $response->end('Hello World');
    });
    
    $http->start();
    

    PHP

    执行

    swoole-cli server.php
    

    Shell

    扩展列表

    Swoole-Cli 的 PHP 版本和所加载的扩展是确定的,因此不需要担心缺少某些功能扩展函数。

    htf@htf-ThinkPad-T470p:~/workspace/cli-swoole$ ./bin/swoole-cli -m
    [PHP Modules]
    bcmath
    bz2
    Core
    ctype
    curl
    date
    dom
    exif
    fileinfo
    filter
    gd
    gmp
    hash
    iconv
    imagick
    intl
    json
    libxml
    mbstring
    mongodb
    mysqli
    mysqlnd
    openssl
    pcntl
    pcre
    PDO
    pdo_mysql
    pdo_sqlite
    Phar
    posix
    redis
    Reflection
    session
    SimpleXML
    soap
    sockets
    sodium
    SPL
    sqlite3
    standard
    swoole
    tokenizer
    xml
    xmlreader
    xmlwriter
    xsl
    yaml
    zip
    zlib
    
    [Zend Modules]
  • Composer 国内加速,修改镜像源

    如何修改镜像源

    可以使用阿里巴巴提供的 Composer 全量镜像 https://mirrors.aliyun.com/composer/

    a). 配置只在当前项目生效
    
    
    composer config repo.packagist composer https://mirrors.aliyun.com/composer/
    
     取消当前项目配置
    composer config --unset repos.packagist
    b). 配置全局生效
    composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
    
     取消全局配置
    composer config -g --unset repos.packagist
  • think-swoole应用-微服务之RPC远程调用通信实战

    RPC(Remote Procedure Call):远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想。

    解决问题:
    解决分布式系统中,服务之间的调用问题。
    远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。

    Think-Swoole中已经实现了的基于TCP的PRC,这样我们使用传统型框架也可以做简单的分布式架构应用了。

    一、配置服务端
    1,修改 config/swoole.php

        'rpc'        => [
            'server' => [
                'enable'   => true,
                'port'     => 9000,
                'services' => [
                    \app\rpc\service\UserService::class            ],
            ],
            'client' => [
            ],
        ],

    2,新增rpc目录结构如下:

    3,定义接口抽象方法

    <?php// +----------------------------------------------------------------------// | najing [ 通用后台管理系统 ]// +----------------------------------------------------------------------// | Copyright (c) 2020 http://www.najingquan.com ;All rights reserved.// +----------------------------------------------------------------------// | Author: 救火队队长namespace app\rpc\interfaces;interface UserInterface{
        public function add($name);}

    4,实现接口方法

    <?php// +----------------------------------------------------------------------// | najing [ 通用后台管理系统 ]// +----------------------------------------------------------------------// | Copyright (c) 2020 http://www.najingquan.com ;All rights reserved.// +----------------------------------------------------------------------// | Author: 救火队队长namespace app\rpc\service;use app\rpc\interfaces\UserInterface;class UserService implements UserInterface{
        public function add($name)
        {
            return "您要新增的用户名是:{$name}";
        }}

    服务端的操作就已经完成。 可以开启swoole 命令 php think swoole start

    二、配置客户端
    1,修改 config/swoole.php

    
    
    
    
    'rpc'        => [
            'server' => [
                'enable'   => false,
                'port'     => 9000,
                'services' => [  
                ],
            ],
            'client' => [
                'userservice'=>[
                     //RPC服务端的ip地址
                    'host' => '127.0.0.1',
                     //RPC服务端的端口
                    'port' => 9000
    
                ]
            ],
        ],

    2,生成RPC服务接口

    php think rpc:interface

    会在app目录下生成一个rpc.php的文件,它就是RPC服务接口文件
    文件内容大致:

    
    
    
    
    <?php/**
     * This file is auto-generated.
     */declare(strict_types=1);namespace rpc\contract\userservice;interface UserInterface{
        public function add($name);}return ['userservice' => ['rpc\contract\userservice\UserInterface']];

    注意return中就是每个服务接口的命名空间;在控制器中使用该命名空间实例对象就可以调用

    3,Controller调用

    
    
    
    
    <?php// +----------------------------------------------------------------------// | najing [ 通用后台管理系统 ]// +----------------------------------------------------------------------// | Copyright (c) 2020 http://www.najingquan.com ;All rights reserved.// +----------------------------------------------------------------------// | Author: 救火队队长namespace app\controller;use app\BaseController;use rpc\contract\userservice\UserInterface;class User extends BaseController{
        public function add(UserInterface $user)
        {
           echo $user->add("救火队队长");
        }}

    4,浏览器访问客户端Controller
    6 收藏 点击回复

  • php替换html里面的图片相对路径地址为绝对路径

    /**
     * 替换html里面的图片相对路径地址为绝对路径
     * @param  string $content 请求html内容
     * @param  array  $prefix 绝对url地址
     */
    function pregReplaceImg2($content,$prefix)
    {
        $contentAlter = preg_replace_callback('/(<[img|IMG].*?src=[\'\"])([\s\S]*?)([\'\"])[\s\S]*?/i', function($match)use($prefix){
            if(strstr($match[2], 'http://') == false && strstr($match[1], 'https://') == false)
                return $match[1].$prefix.$match[2].$match[3];
            else
                return $match[1].$match[2].$match[3];
        } , $content);
        return $contentAlter;
    }