Raspbian 11 默认PHP 7.4不满足Laravel 9的PHP 8.0.2+要求,需添加Ondřej Surý源升级至PHP 8.1+,并用--ignore-platform-reqs绕过ARM兼容性限制,启用OPcache、绑定0.0.0.0端口、校验fileinfo扩展及缓存文件权限。

不能直接在 Raspbian 11 上原生运行 Laravel 9,必须先确认 PHP 版本和关键扩展是否达标——Raspbian 11 默认自带的 php 是 7.4,而 Laravel 9 强制要求 PHP 8.0.2+,否则 composer create-project 会直接失败或后续启动报 ParseError。
检查并升级 PHP 到 8.1+
Raspbian 11(bullseye)官方源只提供 PHP 7.4,需手动添加 Ondřej Surý 的 PPA(实际是 Debian backports 风格的第三方源):
- 运行
sudo apt update && sudo apt install -y ca-certificates apt-transport-https - 添加源:
sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg,再执行echo "deb https://packages.sury.org/php/ bullseye main" | sudo tee /etc/apt/sources.list.d/php.list - 更新并安装:
sudo apt update && sudo apt install -y php8.1 php8.1-cli php8.1-mbstring php8.1-xml php8.1-bcmath php8.1-opcache php8.1-curl php8.1-zip php8.1-fileinfo - 验证:
php -v应输出类似PHP 8.1.x;若仍显示 7.4,需执行sudo update-alternatives --config php手动切换默认版本
绕过 Composer 平台约束安装 Laravel 9
即使 PHP 版本正确,composer create-project laravel/laravel 在 ARM 架构下仍可能因依赖包(如 symfony/flex)未声明 arm64 兼容性而卡住。稳妥做法是强制忽略平台要求:
- 先确保 Composer 是最新版:
composer self-update - 创建项目时加
--ignore-platform-reqs:composer create-project --prefer-dist laravel/laravel myapp --ignore-platform-reqs - 安装后立刻进项目目录,运行
composer update --ignore-platform-reqs补全缺失的 dev 依赖(如laravel/pint) - 注意:此操作不跳过 PHP 版本检查,仅跳过扩展名、架构等次要约束
启动服务前必须处理的 ARM 兼容性细节
Laravel 9 的 php artisan serve 在树莓派上可运行,但默认监听 127.0.0.1:8000,外网无法访问;且 OPcache 在 ARM 上默认未启用,导致性能明显低于 x86:
- 启用 OPcache:编辑
/etc/php/8.1/cli/php.ini和/etc/php/8.1/apache2/php.ini(若用 Apache),取消注释并设为opcache.enable=1和opcache.enable_cli=1 - 启动时绑定所有接口:
php artisan serve --host=0.0.0.0 --port=8000(防火墙需放行 8000) -
fileinfo扩展必须启用——Raspbian 11 的 PHP 8.1 包已包含,但有时未自动加载,检查php -m | grep fileinfo,若无输出则确认/etc/php/8.1/cli/conf.d/20-fileinfo.ini存在且未被注释 - 避免使用
sail:Laravel Sail 依赖 Docker Desktop,而树莓派的 Docker(docker.io)不支持 Sail 的 compose v2+ 特性,会报unknown service
最关键的遗漏点是:Laravel 9 的路由缓存和配置缓存在 ARM 上生成的 OPcache 文件权限常出问题,首次运行 php artisan config:cache 后,务必检查 bootstrap/cache/config.php 是否可被 Web 用户(如 www-data)读取,否则 500 错误无日志提示。


















