c ++ — PHP shell_exec не работает для двух разных версий приложения

Я испытываю интересную странную проблему с shell_exec …

Описание

Я разрабатываю PHP веб-приложение, которое использует приложение C ++ для расчетов. Сервер работает под Linux, и я использую shell_exec для выполнения программы на C ++. Я обновил версию своего приложения на C ++ и с тех пор shell_exec не работает, но

  • Я проверил обе версии приложения C ++ имеют права 777
  • Обе версии работают без проблем с консоли
  • Обе версии были проверены на одинаковые данные
  • Обе версии были протестированы на двух разных ПК / веб-серверах с одинаковыми результатами
  • Для обеих версий интерфейс веб-приложения 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);
}

...

0

Решение

shell_exec возвращает NULL в двух ситуациях:

  • происходит ошибка
  • выполненная программа не возвращает выходных данных

Чтобы различать эти ситуации, используйте Exec () вместо:

public function exec($command) {
exec($command, $arrOutputLines, $intReturnStatus);
return join("", $arrOutputLines);
}

Вы можете отладить этот код с помощью var_dump’ing $ arrOutputLines и $ intReturnStatus (это массив строк, которые распечатывает ваша программа, и числовой статус выхода вашей программы (0 обычно означает «ОК», ненулевое значение означает «ошибка»)).

1

Другие решения

Других решений пока нет …