Docker中用Swoole运行Laravel Octane:Laravel\Octane\Octane类找不到错误
Laravel\Octane\Octane类 我在Docker容器中尝试用Swoole作为应用服务器运行Laravel Octane应用,但启动时触发致命错误,提示找不到Laravel\Octane\Octane类。已按照Octane搭配Swoole的官方步骤完成配置,包括安装必要扩展和Dockerfile设置,相关环境配置如下:
Dockerfile
FROM php:8.3.7-fpm-alpine RUN apk add --no-cache linux-headers RUN apk --no-cache upgrade && \ apk --no-cache add bash git sudo openssh libxml2-dev oniguruma-dev autoconf gcc g++ make npm freetype-dev libjpeg-turbo-dev libpng-dev libzip-dev ssmtp # PHP: Install php extensions RUN pecl channel-update pecl.php.net RUN pecl install pcov swoole RUN docker-php-ext-configure gd --with-freetype --with-jpeg RUN docker-php-ext-install mbstring xml pcntl gd zip sockets pdo pdo_mysql bcmath soap RUN docker-php-ext-enable mbstring xml gd zip pcov pcntl sockets bcmath pdo pdo_mysql soap swoole RUN docker-php-ext-install pdo pdo_mysql sockets RUN apk add icu-dev RUN docker-php-ext-configure intl && docker-php-ext-install mysqli pdo pdo_mysql intl RUN curl -sS https://getcomposer.org/installer | php -- \ --install-dir=/usr/local/bin --filename=composer RUN apk add gnupg #Download the desired package(s) RUN curl -k -O https://download.microsoft.com/download/e/4/e/e4e67866-dffd-428c-aac7-8d28ddafb39b/msodbcsql17_17.10.5.1-1_amd64.apk RUN curl -k -O https://download.microsoft.com/download/e/4/e/e4e67866-dffd-428c-aac7-8d28ddafb39b/mssql-tools_17.10.1.1-1_amd64.apk #(Optional) Verify signature, if 'gpg' is missing install it using 'apk add gnupg': RUN curl -k -O https://download.microsoft.com/download/e/4/e/e4e67866-dffd-428c-aac7-8d28ddafb39b/msodbcsql17_17.10.5.1-1_amd64.sig RUN curl -k -O https://download.microsoft.com/download/e/4/e/e4e67866-dffd-428c-aac7-8d28ddafb39b/mssql-tools_17.10.1.1-1_amd64.sig RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --import - RUN gpg --verify msodbcsql17_17.10.5.1-1_amd64.sig msodbcsql17_17.10.5.1-1_amd64.apk RUN gpg --verify mssql-tools_17.10.1.1-1_amd64.sig mssql-tools_17.10.1.1-1_amd64.apk #Install the package(s) RUN apk add --allow-untrusted msodbcsql17_17.10.5.1-1_amd64.apk RUN apk add --allow-untrusted mssql-tools_17.10.1.1-1_amd64.apk #Extensiones necesarias para poder instalar los drivers de sql server con pecl RUN apk update && \ apk add --no-cache unixodbc-dev jpeg-dev zlib-dev gd-dev #Instala las extensiones de PHP para SQL Server RUN pecl install sqlsrv pdo_sqlsrv \ && docker-php-ext-enable sqlsrv pdo_sqlsrv COPY --from=composer:latest /usr/bin/composer /usr/bin/composer COPY --from=spiralscout/roadrunner:2.4.2 /usr/bin/rr /usr/bin/rr WORKDIR /app COPY . . RUN composer clear-cache RUN composer install RUN composer require laravel/octane spiral/roadrunner COPY .env .env RUN mkdir -p /app/storage/logs RUN php artisan octane:install --server="swoole" CMD php artisan octane:start --server="swoole" --host="192.168.4.234" --port=8001
docker-compose.yml
version: "3.7" services: gui: image: gui build: ./gui volumes: - ./gui:/app ports: - 5173:80 depends_on: - api networks: - my-network api: image: api build: ./api ports: - "8000:8000" networks: - my-network networks: my-network: driver: bridge
容器日志
Log container:2024-08-15 11:14:04 2024-08-15 11:14:04 INFO Server running… 2024-08-15 11:14:04 2024-08-15 11:14:04 Local: http://192.168.4.234:8001 2024-08-15 11:14:04 2024-08-15 11:14:04 Press Ctrl+C to stop the server 2024-08-15 11:14:04 2024-08-15 11:14:04 Fatal error: Uncaught Error: Class "Laravel\Octane\Octane" not found in /app/vendor/laravel/octane/src/Stream.php:56 2024-08-15 11:14:04 Stack trace: 2024-08-15 11:14:04 #0 /app/vendor/laravel/octane/bin/createSwooleServer.php(19): Laravel\Octane\Stream::shutdown(Object(Swoole\Exception)) 2024-08-15 11:14:04 #1 /app/vendor/laravel/octane/bin/swoole-server(35): require('/app/vendor/lar...') 2024-08-15 11:14:04 #2 {main} 2024-08-15 11:14:04 thrown in /app/vendor/laravel/octane/src/Stream.php on line 56
已尝试的解决方法:
- 确认所有依赖已正确安装
- 检查Laravel与Octane版本兼容性
- 排查依赖冲突问题
但问题仍未解决,求相关解决建议。
重新生成Composer自动加载映射
在Dockerfile中composer require之后添加composer dump-autoload -o命令,强制生成优化后的类映射文件,确保PHP能正确找到Octane类:RUN composer require laravel/octane spiral/roadrunner RUN composer dump-autoload -o调整Dockerfile依赖安装顺序
先复制composer.json和composer.lock到容器,提前安装依赖并生成自动加载,再复制项目其他文件,既利用Docker缓存,也避免文件覆盖导致的依赖问题:WORKDIR /app # 先处理依赖配置,缓存依赖层 COPY composer.json composer.lock ./ RUN composer clear-cache RUN composer install --no-scripts --no-autoloader RUN composer require laravel/octane spiral/roadrunner RUN composer dump-autoload -o RUN composer run-scripts # 再复制项目代码 COPY . .验证Octane安装完整性
进入运行中的容器,执行ls /app/vendor/laravel/octane/src/Octane.php,如果文件不存在,说明Octane未正确安装,重新执行composer require laravel/octane。检查Swoole扩展状态
在容器内执行php -m | grep swoole,确认Swoole扩展已启用。如果未显示,检查Dockerfile中docker-php-ext-enable swoole命令是否生效,可尝试在pecl install swoole后直接添加--enable-swoole参数。修复目录权限
部分场景下vendor目录权限不足会导致PHP无法读取类文件,执行以下命令修复:chown -R www-data:www-data /app/vendor chmod -R 755 /app/vendor检查容器工作目录
确认WORKDIR /app配置正确,所有项目文件都在/app目录下,执行pwd和ls /app验证路径和文件存在性。
内容的提问来源于stack exchange,提问作者Brayan Gomez

