分类 php 下的文章

git log --since="$(date +%Y-%m-%d\ 00:00:00)" --pretty=tformat: --numstat | \
awk '{ add += $1; subs += $2; loc += $1 - $2 } END \
{ printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }'

需要在Linux或者gitbash里面执行

http缺陷

  • 设置回调将成为异步,不设置回调将阻塞,而无法实现真正的流式读取

安装所需拓展

sudo apt install -y \
    php8.3-cli \
    php8.3-mysql \
    php8.3-curl \
    php8.3-gd \
    php8.3-xml \
    php8.3-dom \
    php8.3-mbstring \
    php8.3-zip \
    php8.3-bcmath \
    php8.3-intl \
    php8.3-opcache \
    php8.3-swoole

wsl1无法热重启

经过测试wsl1无法热重启
但是wsl2正常

wsl2热重启速度慢

这个主要是wsl2的io太慢,目前只能使用docker compose解决他的热重启bug
使用他已有的Dockerfile和docker-compose.yml

services:
  hyperf-api:
    container_name: hyperf-api
    build: .
    develop:
      watch:
        - action: sync
          path: ./
          target: /opt/www
          ignore:
            - vendor/
            - runtime/
        - action: rebuild
          path: composer.json
    ports:
      - 9502:9502
      - 8080:8080
    environment:
      - APP_ENV=dev
      - SCAN_CACHEABLE=false

networks:
  default:
    name: backend
    attachable: true

程序报错后进程没有退出

开发中发现,有时候写错了代码,程序error后再次启动正常,但是其实还有一个旧的程序在运行老代码

di生成的类遇到一次问题

今天wsl1环境重启后di总是无法正确生成各个类,后来删除了缓存才好了

  • 2025-12-20
    今天发生hyperf已经退出,但是存在还是没有退出的程序,导致重启后还是老的逻辑
    this->stdoutLogger->info context里的东西经常无法打印
  • 2025-12-28
    似乎是swoole的问题,安装了最新版后,wsl1环境swoole里guzzle无法联网,似乎是对curl的hook出了问题
    wsl1看起来不能再用来开发swoole,经常出问题
    改为使用docker compose watch开发目前速度还可以
  • 2025-12-29
  • windows docker desktop发生无法重启hyperf容器
  • 使用try时候应该在携程go内部,而不是外部,在go外部try是没效果的
  • 今天遇到使用hyperf guzzle时候,由于上游接口拒绝连接,不知道为何导致mysql也出问题,暂时先不管了,改回到curl,我发现hyperf的客户端是不支持connect_timeout的

     Connection pool exhausted. Cannot establish new connection before wait_timeout.

    pecl安装

  • cares会导致dns卡住
  • 那几个压缩算法要yes,否则websocket发不出去
enable sockets support? [no] :
enable openssl support? [no] : yes
enable mysqlnd support? [no] :
enable curl support? [no] : yes
enable cares support? [no] :
enable brotli support? [yes] :
enable zstd support? [no] : yes
enable PostgreSQL database support? [no] :
enable ODBC database support? [no] :
enable Oracle database support? [no] :
enable Sqlite database support? [no] :
enable swoole thread support (need php zts support)? [no] :
enable iouring for file async support? [no] :

启用swoole

sudo phpenmod swoole
  • 2026-01-04
    今天发现wsl2如果转为wsl1,就会导致http请求被卡死,如果返回切换会导致wsl2的请求也被卡死,换virtualbox更独立
  • 2026-01-05
    在通过跨文件系统文件夹共享开发后,io性能远不及wsl1,慢了好像3倍,但是开发还能接受
    发现hyperf无法写入日志,经过测试后发现hyperf默认的cache配置中有一个prefix => 'c:',他会在路径里加上这个东西,导致无法写入,改为其他的就好了

这个东西没什么大用,还总是下载很难

    "fxp-asset": {
      "enabled": false
    },

增加如下配置,去除这些无用依赖

  "replace": {
    "bower-asset/jquery": "*",
    "bower-asset/inputmask": "*",
    "bower-asset/punycode":"*",
    "bower-asset/yii2-pjax": "*"
  },

程序配置

config/autoload/server.php中配置settings启动参数,增加

Constant::OPTION_MAX_WAIT_TIME => 60,

确保程序收到类似kill -15 $(<runtime/hyperf.pid)这样的信号,可以在处理完当前请求后自己退出

设置swarm

yaml如下

version: '3.8'

services:
  hyperf:
    image: hyperf/hyperf:8.1-alpine-v3.18-swoole
    stop_grace_period: 1m # 重要:给予足够的宽限期以完成处理
    deploy:
      replicas: 1
      update_config:
        parallelism: 1
        order: start-first # 重要:先启动新任务再停止旧任务
    ports:
      - "9502:9502" 
      - "9501:9501"
    volumes:
      - /www/hyperf-skeleton:/data/project # 挂载代码目录
    networks:
      - webnet
    working_dir: /data/project # 设置容器内工作目录
    command: php bin/hyperf.php start # 根据实际启动命令修改

networks:
  webnet:

更新

docker service update --force app_hyper

只需要将不同版本的php文件夹放在一起,然后在cmd中执行

mklink /d linkname php文件夹名

注意不是powershell

这样只要将linkname的环境变量写好,每次执行一个命令就可以换php版本而不要改环境变量