我的开发机器和我的服务器为安装的不同python版本提供了不同的路径。
为了获得某个python可执行文件的正确路径,我创建了这个方法
static function pythonPath ($version='') {
$python = $version === '' ? 'python': '';
if (preg_match('/^\d(\.?\d)?$/', $version)) {
$python = 'python'.$version;
}
return trim(shell_exec("/usr/bin/which $python 2>/dev/null"));
}
在我的开发机器上,我可以这样做
$> php -r 'require("./class.my.php"); $path=MyClass::pythonPath("2.7"); var_dump($path); var_dump(file_exists($path));'
string(18) "/usr/bin/python2.7"
bool(true)
在服务器上我得到了这个
$> php -r 'require("./class.my.php"); $path=MyClass::pythonPath("2.7"); var_dump($path); var_dump(file_exists($path));'
string(27) "/opt/python27/bin/python2.7"
bool(true)
但如果我在fastCGI上使用此方法,则which
的结果为空(CentOS 6)。
据我所知,which
会搜索用户的$PATH
。这可能是我没有得到which python2.7
任何结果的原因,因为执行脚本的用户(我的猜测httpd
)与帐户用户的路径不同。
那么,如何在fastCGI脚本中找到可执行路径?
让用户路径不同。 (未经测试的猜测:继续使用which
并首先获取我的服务器帐户的完整路径变量并在which
之前加载<)
答案 0 :(得分:0)
在我的服务器上,脚本由&#34; nobody&#34;运行。用户。
从脚本中打印$PATH
将显示/usr/bin
是运行fastCGI脚本的此用户设置的唯一可执行二进制文件路径。
诀窍是在执行which
之前获取用户环境变量。
由于bash配置文件的名称可能因我的脚本目录而异,所以我使用此函数来获取正确的路径。
static function getBashProfilePath () {
$bashProfilePath = '';
$userPathData = explode('/', __DIR__);
if (!isset($userPathData[1]) || !isset($userPathData[2]) || $userPathData[1] != 'home') {
return $bashProfilePath;
}
$homePath = '/'.$userPathData[1].'/'.$userPathData[2].'/';
$bashProfileFiles = array('.bash_profile', '.bashrc');
foreach ($bashProfileFiles as $file) {
if (file_exists($homePath.$file)) {
$bashProfilePath = $homePath.$file;
break;
}
}
return $bashProfilePath;
}
获取python二进制路径的最终实现是这个
static function pythonPath ($version='') {
$python = $version === '' ? 'python': '';
if (preg_match('/^\d(\.?\d)?$/', $version)) {
$python = 'python'.$version;
}
$profileFilePath = self::getBashProfilePath();
return trim(shell_exec(". $profileFilePath; /usr/bin/which $python 2>/dev/null"));
}