Laravel 5.6从控制器调用Envoy报错问题求助
解决Laravel控制器调用Envoy时找不到brew的问题
这个问题的核心原因很明确:当你通过Laravel控制器执行Envoy脚本时,运行脚本的PHP进程(比如php-fpm)的环境变量$PATH和你终端里的完全不一样。终端里的$PATH包含了brew的路径,但Web进程的PATH默认是极简的,所以找不到brew命令。
下面给你几个可行的解决办法,按优先级推荐:
方法一:直接使用brew的绝对路径(最简单)
先在终端里执行which brew,得到brew的绝对路径(比如M1/M2 Mac通常是/opt/homebrew/bin/brew,Intel Mac是/usr/local/bin/brew)。
然后在你的Envoy脚本里,把所有brew命令替换成这个绝对路径。比如原来的:
brew update
改成:
/opt/homebrew/bin/brew update
方法二:在Envoy任务中手动设置PATH
如果不想每次都写绝对路径,可以在Envoy的任务开头,先把brew所在的目录添加到$PATH里:
@servers(['web' => 'your-server-address']) @task('deploy') # 把brew的路径加到PATH最前面,确保优先找到 export PATH="/opt/homebrew/bin:/usr/local/bin:$PATH" # 现在可以正常用brew命令了 brew upgrade some-package # 其他任务命令... @endtask
方法三:修改PHP-FPM的环境变量配置(全局生效)
如果希望所有Web进程都能找到brew,可以修改php-fpm的配置文件:
- 找到Valet对应的php-fpm配置文件,比如PHP 8.2的话,路径是
/usr/local/etc/php/8.2/php-fpm.d/www.conf(不同版本路径会有变化)。 - 找到
env[PATH]这一行(如果被注释了就去掉前面的;),把它改成包含brew所在目录的路径:
env[PATH] = /opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
- 重启php-fpm服务:
brew services restart php@8.2
(注意替换成你正在使用的PHP版本号)
额外提示
因为Valet是全局安装的,它运行的Web进程继承的是系统默认的环境变量,而不是你终端用户的个性化PATH配置(比如.zshrc或.bashrc里设置的PATH),所以才会出现终端能找到brew,但控制器调用找不到的情况。优先用前两种方法,避免全局修改可能带来的其他问题。
内容的提问来源于stack exchange,提问作者killstreet
相关产品推荐
相关产品推荐

