hyperf初步认识和安装

认识hyperf

复制代码
1. Hyperf 是一个高性能的渐进式 PHP 协程框架,封装了很多常用的组件:
MySQL 客户端、Redis 客户端、协程版的 Eloquent ORM、WebSocket 服务端及客户端、Guzzle HTTP 客户端、
Elasticsearch 客户端、AMQP 组件、基于令牌桶算法的限流器等组件。
2. 还有一些便捷的功能:
基于 PSR-11 的依赖注入容器、注解、AOP 面向切面编程、自定义进程、
Redis/RabbitMQ 消息队列、Crontab 秒级定时任务等,以上功能基本上是框架的特点。

使用docker compose 进行安装

  1. docker-compose.yml 相关部分
bash 复制代码
hyperf:
    # 服务名称(自定义)
    container_name: h_hyperf
    # 基于官网Dockerfile构建镜像
    build:
      context: ./hyperf/${PHP_VERSION}/alpine/swoole   # Dockerfile所在目录(根据实际路径调整)
      dockerfile: Dockerfile                # 指定使用的Dockerfile
      # 传递构建参数(与Dockerfile中的ARG对应)
      args:
        ALPINE_VERSION: ${ALPINE_VERSION}                # 固定Alpine版本为3.18
        SW_VERSION: ${SW_VERSION}                        # Swoole版本(与Dockerfile默认值一致)
        COMPOSER_VERSION: ${COMPOSER_VERSION}            # Composer版本(与Dockerfile默认值一致)
        PHP_BUILD_VERSION: ${PHP_BUILD_VERSION}          # PHP 8.2对应的值(需与PHP版本匹配)
        TIMEZONE: ${TIMEZONE}                            # 时区设置
    # 端口映射:主机端口:容器端口(Hyperf默认端口9501)
    ports:
      - "9501:9501"
    # 目录挂载:将本地项目代码同步到容器内(开发必备)
    volumes:
      - C:\data_disk:/data_disk
      - C:\phpstudy_pro\WWW\rf_smart_hyperf:/opt/www # 本地 hyperf_dev 目录映射到容器内项目目录
    # 环境变量:设置开发环境配置
    environment:
      - APP_ENV=dev            # 开发环境(Hyperf 会优先加载 config/autoload/prod|dev 目录下的配置(若存在),覆盖基础配置。)
      - TIMEZONE=Asia/Shanghai # 时区设置
      - SCAN_CACHEABLE=false   # 关闭扫描缓存(开发时实时更新代码)
    # 启动命令:启动Hyperf服务(默认命令,可根据项目调整)
    command: sh -c "cd /opt/www && php bin/hyperf.php server:watch" # 安装"热重载工具" Watcher 组件:composer require hyperf/watcher --dev | php bin/hyperf.php vendor:publish hyperf/watcher | docker-compose down hyperf | docker-compose up -d hyperf
    # 注:安装 Watcher 组件,生成的配置文件可能在根目录下.watcher.php,需要手动迁移到 /config/autoload 目录下watcher.php
    # command: sh -c "cd /opt/www && php bin/hyperf.php start"
    # command: tail -f /dev/null # 使用tail命令保持容器运行: docker pull hyperf/hyperf:8.2-alpine-v3.18-base | docker-compose up -d --build | docker-compose exec hyperf sh | cd /opt/www | composer create-project hyperf/hyperf-skeleton .
    networks:
      - ms-network
    # 重启策略:容器退出时不自动重启(开发环境推荐):always | no | on-failure | unless-stopped
    restart: "unless-stopped"
  1. dockerfile 代码
bash 复制代码
# hyperf/hyperf:8.2
#
# @link     https://www.hyperf.io
# @document https://hyperf.wiki
# @contact  group@hyperf.io
# @license  https://github.com/hyperf/hyperf/blob/master/LICENSE

ARG ALPINE_VERSION

FROM hyperf/hyperf:8.2-alpine-v${ALPINE_VERSION}-base

LABEL maintainer="Hyperf Developers <group@hyperf.io>" version="1.0" license="MIT"

ARG SW_VERSION
ARG COMPOSER_VERSION
ARG PHP_BUILD_VERSION
ARG TIMEZONE

##
# ---------- env settings ----------
##
ENV SW_VERSION=${SW_VERSION:-"v5.1.1"} \
    COMPOSER_VERSION=${COMPOSER_VERSION:-"2.6.6"} \
    COMPOSER_ALLOW_SUPERUSER=1 \
    TIMEZONE=${TIMEZONE:-"Asia/Shanghai"} \
    #  install and remove building packages
    PHPIZE_DEPS="autoconf dpkg-dev dpkg file g++ gcc libc-dev make php${PHP_BUILD_VERSION}-dev php${PHP_BUILD_VERSION}-pear pkgconf re2c pcre-dev pcre2-dev zlib-dev libtool automake libaio-dev openssl-dev curl-dev"

# 设置工作目录为
WORKDIR /opt/www

# 创建 www-data 用户和组
# RUN set -ex \
#     && addgroup -g 82 -S www-data 2>/dev/null || true \
#     # 创建 www-data 用户(如果不存在)
#     && adduser -u 82 -S -G www-data -s /bin/sh -D -H www-data 2>/dev/null || true

COPY composer.phar /usr/local/bin/composer
COPY swoole-src-5.1.1.tar.gz /tmp/swoole.tar.gz
COPY php-8.2.16.tar.gz /tmp/php-8.2.16.tar.gz

# update
RUN set -ex \
    && apk update \
    # for swoole extension libaio linux-headers
    && apk add --no-cache libstdc++ openssl git bash c-ares-dev libpq-dev php82-pdo_pgsql php82-pdo_sqlite php82-pdo_odbc \
    && apk add --no-cache --virtual .build-deps $PHPIZE_DEPS unixodbc-dev sqlite-dev \
    # download
    && cd /tmp \
    # && curl -SL "https://github.com/swoole/swoole-src/archive/${SW_VERSION}.tar.gz" -o swoole.tar.gz \
    && ls -alh \
    # php extension:swoole
    && cd /tmp \
    && mkdir -p swoole \
    && tar -xf swoole.tar.gz -C swoole --strip-components=1 \
    && ln -s /usr/bin/phpize${PHP_BUILD_VERSION} /usr/local/bin/phpize \
    && ln -s /usr/bin/php-config${PHP_BUILD_VERSION} /usr/local/bin/php-config \
    && ( \
        cd swoole \
        && phpize \
        && ./configure --enable-openssl --enable-swoole-curl --enable-cares --enable-swoole-pgsql --enable-swoole-sqlite --with-swoole-odbc=unixodbc,/usr \
        && make -s -j$(nproc) && make install \
    ) \
    # 安装 exif 和 ftp 扩展
    && cd /tmp \
    && mkdir -p php-src \
    && tar -xf php-8.2.16.tar.gz -C php-src --strip-components=1 \
    # ----- [新增] 编译安装 ftp 扩展 -----
    && cd php-src/ext/ftp \
    && phpize \
    && ./configure --with-openssl-dir=/usr \
    && make -j$(nproc) \
    && make install \
    # ----- [新增结束] -----
    && cd /tmp/php-src/ext/exif \
    && phpize \
    && ./configure \
    && make -s -j$(nproc) \
    && make install \
    # max_input_vars 是 PHP 的一个配置指令,用于限制 HTTP 请求中可以接受的输入变量数量。PHP_INT_MAX 是 PHP 中预定义的常量,表示整数的最大值。
    && echo "memory_limit=1G" > /etc/php${PHP_BUILD_VERSION}/conf.d/00_default.ini \
    && echo "max_input_vars=PHP_INT_MAX" >> /etc/php${PHP_BUILD_VERSION}/conf.d/00_default.ini \
    && echo "upload_max_filesize=128M" >> /etc/php${PHP_BUILD_VERSION}/conf.d/00_default.ini \
    && echo "post_max_size=128M" >> /etc/php${PHP_BUILD_VERSION}/conf.d/00_default.ini \
    && echo "date.timezone=${TIMEZONE}" >> /etc/php${PHP_BUILD_VERSION}/conf.d/00_default.ini \
    && echo "opcache.enable_cli = 'On'" >> /etc/php${PHP_BUILD_VERSION}/conf.d/00_opcache.ini \
    && echo "extension=swoole.so" > /etc/php${PHP_BUILD_VERSION}/conf.d/50_swoole.ini \
    && echo "swoole.use_shortname = 'Off'" >> /etc/php${PHP_BUILD_VERSION}/conf.d/50_swoole.ini \
    && echo "extension=exif.so" > /etc/php${PHP_BUILD_VERSION}/conf.d/50_exif.ini \
    # ----- [新增] 注册 ftp 扩展 -----
    && echo "extension=ftp.so" > /etc/php${PHP_BUILD_VERSION}/conf.d/50_ftp.ini \
    # ----- [新增结束] -----
    # - config timezone
    && ln -sf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \
    && echo "${TIMEZONE}" > /etc/timezone \
    # install composer
    # && wget -nv -O /usr/local/bin/composer https://github.com/composer/composer/releases/download/${COMPOSER_VERSION}/composer.phar \
    && chmod u+x /usr/local/bin/composer \
    # ---------- clear works ----------
    && apk del .build-deps \
    && rm -rf /var/cache/apk/* /tmp/* /usr/share/man /usr/local/bin/php* \
    # php info
    && php -v \
    && php -m \
    && php --ri swoole \
    && php --ri exif \
    && php --ri Zend\ OPcache \
    # ----- [新增] 验证 ftp 扩展 -----
    && php --ri ftp \
    # ----- [新增结束] -----
    && composer \
    && echo -e "\033[42;37m Build Completed :).\033[0m\n"
  1. 启动hyperf项目
bash 复制代码
docker compose up -d --build h_hyperf 
相关推荐
噢,我明白了3 小时前
java中唯一键和幂等键的应用
java·后端
GreenTea3 小时前
我把 Agent 的 while 循环拆掉了:一种你可能没想到的 Agent 架构
前端·后端·架构
考虑考虑3 小时前
synchronized字符串常量
java·后端·java ee
颜进强4 小时前
16 · NestJS LifecycleEvents 生命周期事件:五个钩子、三条边界,和 rag-server 的优雅停机
前端·后端·ai编程
GetcharZp4 小时前
定位不再一个个吐坐标:英伟达 LocateAnything 上手全攻略
后端
郑州光合科技余经理5 小时前
同城电商系统:库存变更怎么同步到订单
java·开发语言·前端·后端·uni-app·php·ai编程
我叫黑大帅6 小时前
Go日志库工程选型与逃逸分析评测报告
后端·面试·go
IT_陈寒8 小时前
JavaScript闭包的这个坑,我居然今天才爬出来
前端·人工智能·后端
Thneonl8 小时前
消息队列选型决策树:RabbitMQ vs Kafka vs Redis Streams
后端·架构