认识hyperf
1. Hyperf 是一个高性能的渐进式 PHP 协程框架,封装了很多常用的组件:
MySQL 客户端、Redis 客户端、协程版的 Eloquent ORM、WebSocket 服务端及客户端、Guzzle HTTP 客户端、
Elasticsearch 客户端、AMQP 组件、基于令牌桶算法的限流器等组件。
2. 还有一些便捷的功能:
基于 PSR-11 的依赖注入容器、注解、AOP 面向切面编程、自定义进程、
Redis/RabbitMQ 消息队列、Crontab 秒级定时任务等,以上功能基本上是框架的特点。
使用docker compose 进行安装
- 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"
- 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"
- 启动hyperf项目
bash
docker compose up -d --build h_hyperf