Windows报proc_open() fork失败是因WAMP/XAMPP用CGI模式,需改用CLI模式或php -S;macOS M1/M2因ARM与PHP扩展不匹配,应重装PHP并换阿里云镜像;Linux部署需确认.env权限及DB_HOST设为localhost;Docker中tinker失灵须加--init并安装readline扩展。

Windows上用Composer安装Laravel报错proc_open(): fork failed
这是Windows WSL未启用或PHP运行在旧版CGI模式下的典型表现,不是Laravel本身的问题。WAMP/XAMPP默认用CGI启动PHP,而Laravel的create-project需要完整进程控制能力。
- 改用
php -d variables_order=EGPCS artisan serve手动启动,绕过Composer的proc调用 - 或者切换到
php -S内置服务器:在项目根目录执行php -S localhost:8000 -t public/ - 若坚持用
laravel new,需确认PHP是CLI模式:php -v输出末尾带(cli),不是(cgi-fcgi)
macOS M1/M2芯片下composer create-project laravel/laravel卡在guzzlehttp/psr7
M1原生ARM架构与某些PHP扩展(尤其是openssl和curl)的交叉编译不匹配,导致依赖解析超时或SSL握手失败。
- 先运行
brew install openssl@3,再重装PHP:brew reinstall php --with-openssl - 临时禁用Composer的SSL验证(仅调试用):
composer config -g secure-http false - 换镜像源更有效:
composer config -g repo.packagist composer https://packagist.phpcomposer.com(注意该镜像已停用,推荐用https://mirrors.aliyun.com/composer/)
Linux服务器部署时php artisan migrate提示SQLSTATE[HY000] [2002] Connection refused
不是数据库密码错了,而是Laravel默认读.env,而生产环境常因权限或部署脚本漏掉php artisan config:cache,导致配置仍走config/database.php里的默认127.0.0.1:3306,但MySQL实际监听的是localhost或Unix socket。
- 检查
DB_HOST:MySQL本地连接优先用localhost而非127.0.0.1,前者走socket,后者走TCP - 确认
.env文件权限为644且属主是Web用户(如www-data),否则config:cache会静默失败 - 运行
php artisan config:clear后再php artisan config:cache,别跳过这步
Docker中artisan tinker无法输入中文或Ctrl+C无响应
Docker默认TTY分配不完整,尤其在docker run -it未加--init时,PHP的readline扩展收不到信号,导致交互式命令行失灵。
- 启动容器时必须加
--init参数:docker run --init -it my-laravel-app php artisan tinker - 确保基础镜像含
readline扩展:Alpine需apk add php-readline,Debian系需apt-get install php-readline - 中文输入问题多因locale未设置,Dockerfile里加
ENV LANG=C.UTF-8并安装对应语言包
跨平台安装最麻烦的从来不是命令本身,而是每个系统对“默认”二字的理解完全不同——Windows认CGI是常态,macOS信ARM是理所当然,Linux觉得localhost和127.0.0.1不该有区别。踩坑点往往藏在这些默认值背后。











