You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 14:52:36