PHP 7.4.33中shell_exec执行失败,报php: No such file or directory
问题分析与解决
问题背景
在两台Mac电脑上运行相同PHP代码时,一台正常执行,另一台报错找不到php命令:
- Mac A:MAMP 5.5(PHP 7.3.8),运行正常
- Mac B:MAMP 6.8(PHP 7.4.33),报错信息:
nice: php: No such file or directory
执行代码
$urlfile=dirname(__FILE__)."/test.php value1 value2 "; $cmd = 'nohup nice -n 10 php -f '.$urlfile.' 2>&1 '; $res = shell_exec($cmd); echo $res;
原因排查
这个问题和PHP版本无关,核心原因是两台机器的shell执行环境PATH变量不一致:
- MAMP 5.5默认将自身的PHP路径加入了shell的PATH中,系统能直接找到
php命令 - MAMP 6.8的shell环境未包含MAMP的PHP路径,导致执行
nice命令时,系统在默认PATH里找不到php可执行文件
另外原代码存在写法隐患:把文件路径和参数直接拼接成一个变量,既容易因空格等特殊字符导致命令解析错误,也存在命令注入风险。
解决方案
方案1:使用PHP绝对路径
直接指定MAMP中PHP可执行文件的绝对路径(Mac B的PHP路径通常为/Applications/MAMP/bin/php/php7.4.33/bin/php),同时对路径和参数做转义处理:
// 替换为你的MAMP PHP绝对路径 $phpExec = '/Applications/MAMP/bin/php/php7.4.33/bin/php'; $scriptPath = dirname(__FILE__) . '/test.php'; // 对路径和参数分别转义,避免命令注入和空格问题 $escapedScript = escapeshellarg($scriptPath); $escapedArg1 = escapeshellarg('value1'); $escapedArg2 = escapeshellarg('value2'); $cmd = "nohup nice -n 10 {$phpExec} -f {$escapedScript} {$escapedArg1} {$escapedArg2} 2>&1"; $res = shell_exec($cmd); echo $res;
方案2:临时设置PATH变量
在执行命令前,将MAMP的PHP路径加入到当前shell的PATH中:
$mampPhpBin = '/Applications/MAMP/bin/php/php7.4.33/bin'; $scriptPath = dirname(__FILE__) . '/test.php'; $escapedScript = escapeshellarg($scriptPath); $escapedArg1 = escapeshellarg('value1'); $escapedArg2 = escapeshellarg('value2'); // 先设置PATH,再执行命令 $cmd = "export PATH={$mampPhpBin}:\$PATH && nohup nice -n 10 php -f {$escapedScript} {$escapedArg1} {$escapedArg2} 2>&1"; $res = shell_exec($cmd); echo $res;
额外注意事项
- 务必使用
escapeshellarg()对命令中的动态参数(包括文件路径)进行转义,避免命令注入攻击和特殊字符导致的解析错误 - 不同MAMP版本的PHP路径可能略有差异,可以在MAMP的偏好设置→PHP中查看具体版本对应的路径
内容的提问来源于stack exchange,提问作者user31929
相关产品推荐
相关产品推荐

