@phenya

Связка exec() + mysqli_query(), что тут вообще происходит?

Имеется большой проект со сложной разветвлённой бизнес-логикой, работающий в связке php-fpm + nginx. В качестве БД выступает mysql. И в этом большом проекте есть маленькая такая проблема, которая, как таковая, к самому проекту никак не относится, зато проект теперь относится к ней. Очень плохо относится.
Итак:
- имеется абстрактная таблица в БД `table` с полями `id`, `name`
- имеется простейший php-скрипт, который инициализирует подключение и пытается сделать выборку
<?php
//1.php
conn = mysqli_connect('localhost', 'user', 'pass', 'db_name');
$res = $conn->query('SELECT * FROM `table` WHERE `id` = 1');
var_dump($res);
mysqli_close($conn);

- имеется второй php-скрипт, который запускает первый с помощью exec()
<?php
//2.php
exec('php -f 1.php', $output);
var_dump($output);

Если теперь запустить 2-й скрипт, то все отлично отработает и $output будет не пустым. Но стоит нам только поменять выборку в 1-м скрипте таким образом, чтобы нам пришел пустой результат и опять выполнить 2-й скрипт, то всё - $output пустой (а должен быть дамп пустого объекта). Причем просто происходит "вылет" 1-го скрипта при вызове
$conn->query('SELECT * FROM `table` WHERE `id` = 2');  // пользователя с ИД = 2 не существует

без ошибки, без предупреждения и вообще вывода какой-либо информации(в логах тоже ничего). 1-й скрипт просто тихонько умирает, а 2-й вынужден показывать пустой массив. Причем такое поведение только в случае, если 1-й скрипт запустится посредством вызова exec()(shell_exec(), system()), если же 1-й скрипт вызвать из консоли ручками (php -f 1.php), то все нормально отработает: запрос ушел, а ответ пришел в виде пустого объекта.

Ну а вопрос, как обычно, вечный - кто виноват? и что делать? Может сталкивался кто? Или есть какие-то идеи?

php - 5.6.31
с mysql php общается через mysqlnd (5.0.11-dev - 20120503)
  • Вопрос задан
  • 237 просмотров
Пригласить эксперта
Ответы на вопрос 1
@hurgadan
А вы ничего не путаете? :)
Даже если вы в 1.php сделаете синтаксическую ошибку, то 2.php отработает успешно и выдаст вам ее в output:
php -f 2.php
array(2) {
  [0]=>
  string(0) ""
  [1]=>
  string(87) "Parse error: syntax error, unexpected ')' in 1.php on line 2"
}

Может быть проблема с 1.php? В любом случае тут:
conn = mysqli_connect('localhost', 'user', 'pass', 'db_name');

перед conn не помешал бы знак $
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы