PHP shell_exec 不适用于两个不同的应用程序版本
PHP shell_exec does not work for two different app version
我遇到了一个有趣的奇怪问题 shell_exec...
描述
我开发了 PHP Web 应用程序,该应用程序使用 C++ 后端应用程序进行计算。服务器在 linux 上 运行ning,我使用 shell_exec 执行 C++ 程序。我更新了我的 C++ 应用程序版本,此后 shell_exec 不起作用,但是
- 我检查过两个版本的 C++ 应用程序都有 777 个权限
- 两个版本 运行 从控制台完美无缺
- 两个版本都针对相同的数据进行了测试
- 两个版本都在两个不同的 PCs/webservers 上进行了测试,结果相同
- 对于两个版本,webapp PHP 前端完全相同
- 第二个版本(无法启动)运行比之前的版本快
问题
你遇到过类似的问题吗?
是否有可能在 shell_exec 中出现问题,而在从控制台标准执行期间不会出现问题?
一段PHP代码
class LauncherManager extends Nette\Object {
private $wwwDir;
private $db;
private $f;
public function __construct($wwwDir, \DibiConnection $db) {
$this->wwwDir = $wwwDir;
$this->db = $db;
$this->f = (new Dao\DaoFactory())->setDb($db);
}
public function execMeasurement($measurementId) {
$this->execGenetrac(" -m $measurementId");
}
public function execSamples($analysisId) {
$this->execGenetrac(" -s $analysisId");
}
public function execAnalysis($analysisId) {
$this->execGenetrac(" -a $analysisId");
}
public function execGenetrac($params) {
// Check path to genetrac can be set
$path = $this->wwwDir . "/genetrac";
$this->checkPathExist($path);
// Check library path
$lib = './lib';
$expl = 'export LD_LIBRARY_PATH="' . $lib . '"';
$this->checkPathExist($path . "/" . $lib);
// Check genetrac executable exist
$this->checkPathExist($path . "/genetrac");
// Launch genetrac with parameters
$this->exec("cd $path; $expl; ./genetrac $params");
}
public function exec($command) {
return shell_exec($command);
}
...
shell_exec returns NULL 两种情况:
- 发生错误
- 执行程序returns无输出
为了区分这些情况,请改用exec():
public function exec($command) {
exec($command, $arrOutputLines, $intReturnStatus);
return join("", $arrOutputLines);
}
您可以通过 var_dump'ing $arrOutputLines 和 $intReturnStatus 调试此代码(这些是您的程序打印出的行数组和程序的数字退出状态(0 通常表示正常,非-0 表示错误)).
我遇到了一个有趣的奇怪问题 shell_exec...
描述
我开发了 PHP Web 应用程序,该应用程序使用 C++ 后端应用程序进行计算。服务器在 linux 上 运行ning,我使用 shell_exec 执行 C++ 程序。我更新了我的 C++ 应用程序版本,此后 shell_exec 不起作用,但是
- 我检查过两个版本的 C++ 应用程序都有 777 个权限
- 两个版本 运行 从控制台完美无缺
- 两个版本都针对相同的数据进行了测试
- 两个版本都在两个不同的 PCs/webservers 上进行了测试,结果相同
- 对于两个版本,webapp PHP 前端完全相同
- 第二个版本(无法启动)运行比之前的版本快
问题
你遇到过类似的问题吗?
是否有可能在 shell_exec 中出现问题,而在从控制台标准执行期间不会出现问题?
一段PHP代码
class LauncherManager extends Nette\Object {
private $wwwDir;
private $db;
private $f;
public function __construct($wwwDir, \DibiConnection $db) {
$this->wwwDir = $wwwDir;
$this->db = $db;
$this->f = (new Dao\DaoFactory())->setDb($db);
}
public function execMeasurement($measurementId) {
$this->execGenetrac(" -m $measurementId");
}
public function execSamples($analysisId) {
$this->execGenetrac(" -s $analysisId");
}
public function execAnalysis($analysisId) {
$this->execGenetrac(" -a $analysisId");
}
public function execGenetrac($params) {
// Check path to genetrac can be set
$path = $this->wwwDir . "/genetrac";
$this->checkPathExist($path);
// Check library path
$lib = './lib';
$expl = 'export LD_LIBRARY_PATH="' . $lib . '"';
$this->checkPathExist($path . "/" . $lib);
// Check genetrac executable exist
$this->checkPathExist($path . "/genetrac");
// Launch genetrac with parameters
$this->exec("cd $path; $expl; ./genetrac $params");
}
public function exec($command) {
return shell_exec($command);
}
...
shell_exec returns NULL 两种情况:
- 发生错误
- 执行程序returns无输出
为了区分这些情况,请改用exec():
public function exec($command) {
exec($command, $arrOutputLines, $intReturnStatus);
return join("", $arrOutputLines);
}
您可以通过 var_dump'ing $arrOutputLines 和 $intReturnStatus 调试此代码(这些是您的程序打印出的行数组和程序的数字退出状态(0 通常表示正常,非-0 表示错误)).