记一次 Laravel5 升级到 Laravel10 经过 + 使用 octane 进行容器化

已有方案

升级过程

项目准备
  • 假设我现在的项目名为/var/www/monday-shop
  • monday-shop项目内创建一新的laravel项目(同一个项目内方便复制粘贴文件)
    • composer create-project laravel/laravel=10.* laravel10
    • 这时候项目内多了一个/var/www/monday-shop/laravel10
依赖处理
  • 更新依赖

    • /var/www/monday-shop/laravel10/composer.jsonrequirerequire-dev部分更新到/var/www/monday-shop/composer.json(注意删除旧版本的部分)
    • 删除/var/www/monday-shop/composer.lock
  • 安装依赖

    1. 运行composer install, 这时候会出现很多错误, 只能照着报错不断更新依赖
    2. 如果报错类似下面的问题, 就去github找到ramsey/uuid设配的版本, 然后修改composer.json文件, 重复执行1, 2步骤
      composer install
      No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information.
      Loading composer repositories with package information
      Updating dependencies
      Your requirements could not be resolved to an installable set of packages.
      

    Problem 1

    • laravel/framework[v10.10.0, …, v10.48.4] require ramsey/uuid ^4.7 -> found ramsey/uuid[4.7.0, …, 4.7.5] but it conflicts with your root composer.json require (^3.8).
      ```
  • 升级之后, 如果不确定这个依赖是否有用, 执行composer depends xxx/xxxx来查看是否有用, 如果不用到删除即可

文件更改

  • 复制/var/www/monday-shop/laravel10的基础文件到/var/www/monday-shop/
    ├─app
    │  ├─Console
    │  ├─Exceptions
    │  ├─Http
    │  │  ├─Controllers
    │  │  └─Middleware
    │  ├─Models
    │  └─Providers
    ├─bootstrap
    │  └─cache
    ├─config
    ├─database
    │  ├─factories
    │  ├─migrations
    │  └─seeders
    ├─public
    ├─resources
    │  ├─css
    │  ├─js
    │  └─views
    ├─routes
    ├─storage
    │  ├─app
    │  ├─framework
    │  └─logs
    ├─tests
    │  ├─Feature
    │  └─Unit
  • 例如app/Exceptions/Handler.php,app/Http/Kernel.php等等, 这些文件复制内容的时候需要仔细对比是否自己修改过
  1. 我处理的时候一般一个文件夹一个文件夹处理, 比如从app/Console开始处理
  2. 处理完之后删除app/Console目录(删除目录是/var/www/monday-shop/laravel10)
  3. 下一个目录是app/Exceptions, 重复1, 2 步骤, 直至/var/www/monday-shop/laravel10目录为空

处理报错

  • 运行服务: php artisan serve
  • 运行之后如果有报错按需解决, 服务启动之后, 查看storage/logs下的目录错误, 按需解决
  • 可能遇到的laravelhelpers函数不存在执行composer require laravel/helpers

容器化

composer require laravel/octane
.rr.yaml
  • 如果出现: RoadRunner can’t communicate with the worker
  • 请修改.rr.yaml为下面的配置, 主要是logs.channels的配置为标准输出
    version: '3'
    rpc:
    listen: 'tcp://127.0.0.1:6001'
    server:
    command: ""
    relay: pipes
    http:
    middleware: [ "static", "gzip", "headers" ]
    max_request_size: 20
    access_logs: false
    static:
      dir: "public"
      forbid: [ ".php", ".htaccess" ]
    uploads:
      forbid: [".php", ".exe", ".bat", ".sh"]
    address: "0.0.0.0:2114"
    pool:
      allocate_timeout: 10s
      destroy_timeout: 10s
      supervisor:
        max_worker_memory: 256
        exec_ttl: 60s
    ## 这里注意如果要输出标准输出必须在 channels 才会写 stdout
    logs:
    mode: production
    level: debug
    encoding: console
    output: stderr
    err_output: stderr
    channels:
      http:
        mode: production
        level: panic
        encoding: console
        output: stdout
        err_output: stderr
      server:
        mode: production
        level: info
        encoding: json
        output: stdout
        err_output: stdout
      rpc:
        mode: production
        level: debug
        encoding: console
        output: stderr
        err_output: stdout
    status:
    address: localhost:2114
    

##### Dockerfile
```Dockerfile
FROM composer:latest AS vendor

FROM php:8.2-cli-bookworm AS base
ARG TZ=PRC
ENV DEBIAN_FRONTEND=noninteractive \
  TERM=xterm-color \
  OCTANE_SERVER=roadrunner \
  ROOT=/var/www \
  COMPOSER_FUND=0 \
  COMPOSER_MAX_PARALLEL_HTTP=24

WORKDIR ${ROOT}

SHELL ["/bin/bash", "-eou", "pipefail", "-c"]

RUN ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime \
  && echo ${TZ} > /etc/timezone

################################################################################################
## 安装依赖
################################################################################################
ADD --chmod=0755 https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
RUN apt-get update; \
  apt-get upgrade -yqq; \
  apt-get install -yqq --no-install-recommends --show-progress \
  apt-utils \
  curl \
  wget \
  nano \
  ncdu \
  ca-certificates \
  supervisor \
  libsodium-dev \
  # Install PHP extensions
  && install-php-extensions \
  bz2 \
  pcntl \
  mbstring \
  bcmath \
  sockets \
  pgsql \
  pdo_pgsql \
  opcache \
  exif \
  pdo_mysql \
  zip \
  intl \
  gd \
  redis \
  rdkafka \
  memcached \
  igbinary \
  ldap \
  && apt-get -y autoremove \
  && apt-get clean \
  && docker-php-source delete \
  && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
  && rm /var/log/lastlog /var/log/faillog


################################################################################################
## 复制代码文件和部署文件
################################################################################################
COPY  . .
COPY deployment/supervisord.*.conf /etc/supervisor/conf.d/
COPY deployment/php.ini ${PHP_INI_DIR}/conf.d/99-octane.ini
COPY deployment/start-container /usr/local/bin/start-container

################################################################################################
## 安装依赖
################################################################################################
COPY --from=vendor /usr/bin/composer /usr/bin/composer
RUN composer install \
  --no-dev \
  --no-interaction \
  --no-ansi
RUN if composer show | grep spiral/roadrunner-cli >/dev/null; then \
  ./vendor/bin/rr get-binary; else \
  echo "`spiral/roadrunner-cli` package is not installed. Exiting..."; exit 1; \
  fi

################################################################################################
## 权限目录设置
################################################################################################
RUN chmod +x rr /usr/local/bin/start-container
RUN mkdir -p \
  storage/framework/{sessions,views,cache,testing} \
  storage/logs \
  bootstrap/cache && chmod -R a+rw storage

ENTRYPOINT ["start-container"]

HEALTHCHECK --start-period=5s --interval=2s --timeout=5s --retries=8 CMD php artisan octane:status || exit 1
php.ini
[PHP]
post_max_size = 100M
upload_max_filesize = 100M
expose_php = 0
realpath_cache_size = 16M
realpath_cache_ttl = 360

;; 使用 roadrunner 开不开 opcache 影响不大
[Opcache]
opcache.enable = 1
opcache.enable_cli = 0
opcache.memory_consumption = 128M
opcache.use_cwd = 0
opcache.max_file_size = 0
opcache.max_accelerated_files = 32531
opcache.validate_timestamps = 0
opcache.file_update_protection = 0
opcache.interned_strings_buffer = 16
opcache.file_cache = 60

[JIT]
opcache.jit_buffer_size = 64M
opcache.jit = function
opcache.jit_prof_threshold = 0.001
opcache.jit_max_root_traces = 2048
opcache.jit_max_side_traces = 256

[zlib]
zlib.output_compression = On
zlib.output_compression_level = 9
start.container
#!/usr/bin/env bash
set -e

container_mode=${CONTAINER_MODE:-http}
octane_server=${OCTANE_SERVER}
echo "Container mode: $container_mode"

initialStuff() {
    php artisan config:cache;
}

if [ "$1" != "" ]; then
    exec "$@"
elif [ ${container_mode} = "http" ]; then
    echo "Octane Server: $octane_server"
    initialStuff
    exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.roadrunner.conf
elif [ ${container_mode} = "scheduler" ]; then
    initialStuff
    exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.scheduler.conf
elif [ ${container_mode} = "worker" ]; then
    initialStuff
    exec /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.worker.conf
else
    echo "Container mode mismatched."
    exit 1
fi
supervisord.roadrunner.conf
[supervisord]
nodaemon=true
user=root
logfile=/dev/stdout
logfile_maxbytes=0
pidfile=/var/run/supervisord.pid

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL  for a unix socket

[unix_http_server]
file=/var/run/supervisor.sock   ; (the path to the socket file)
chmod=0700                       ; sockef file mode (default 0700)

[program:octane]
process_name=%(program_name)s_%(process_num)02d
command=php %(ENV_ROOT)s/artisan octane:start --server=roadrunner --host=0.0.0.0 --port=8080 --rpc-port=6001 --workers=4 --log-level=warn --max-requests=0 --rr-config=%(ENV_ROOT)s/deployment/.rr.yaml
autostart=true
autorestart=true
environment=LARAVEL_OCTANE="1"
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0

结束

  • 之后就可以愉快的运行了
本作品采用《CC 协议》,转载必须注明作者和本文链接
当神不再是我们的信仰,那么信仰自己吧,努力让自己变好,不辜负自己的信仰!
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 17
nff93

你可真虎,我都是一个大版本一个大版本的升上来,你直接跳 5 个版本

2周前 评论
seth-shi (楼主) 2周前

是个狠人,也是个高手

2周前 评论
seth-shi (楼主) 2周前

在v站看到了 :+1:

2周前 评论
seth-shi (楼主) 2周前

升级花了多长时间啊

2周前 评论
seth-shi (楼主) 2周前

你们城里人真会玩 :confused:

2周前 评论

咋不直接升级到11

2周前 评论
seth-shi (楼主) 2周前

我都是跟着文档一点点升,你这没出问题也是🐂

2周前 评论
seth-shi (楼主) 2周前

PHP 容器化只是为了方便部署?

2周前 评论
seth-shi (楼主) 2周前

请问这是生产环境吗?

2周前 评论
seth-shi (楼主) 2周前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
40
粉丝
157
喜欢
705
收藏
345
排名:31
访问:22.1 万
私信
所有博文
社区赞助商