PHP system () - статус возврата всегда 0 - PullRequest
11 голосов
/ 09 ноября 2010

Мне нужно запустить следующие скрипты.

// File: script_a.php
<?php exit(1); ?>

// File: script_b.php
<?php 
     system('php script_a.php', $return);
     var_dump($return);
?>

Теперь моя проблема: в моей операционной системе Windows script_b.php показывает int(1), как и ожидалось. На нашем Unix-сервере я всегда получаю int(0), поэтому я не могу проверить, происходит ли определенный сбой внутри script_a.php.

Кто-нибудь знает эту проблему и как ее решить?

Ответы [ 11 ]

1 голос
/ 11 ноября 2010

Попробуйте сделать вызов PHP system с абсолютным путем как исполняемого файла PHP, так и имени файла скрипта, например: system('/usr/bin/php /path/to/script_a.php', $return);. Может быть, это проблема пути. (Вы можете найти абсолютный путь к вашему исполняемому файлу PHP с помощью: which php).

Также, как кто-то предложил, попробуйте отладить фактическое возвращаемое значение script_a.php на вашем сервере UNIX, запустив php script_a.php; echo $? в командной строке. Это echo выведет последнее возвращаемое значение, то есть значение, возвращаемое script_a.php.

В любом случае, я предлагаю сделать include с оператором return, как описано в Примере № 5 include () документации . Если вы можете адаптировать свои сценарии таким образом, это будет более эффективный способ их передачи.

// File: script_a.php
<?php return 1; ?>

// File: script_b.php
<?php 
     $return = (include 'script_a.php');
     var_dump($return);
?>
1 голос
/ 11 ноября 2010

__halt_compiler() где-то вызывается, может это проверить?

1 голос
/ 11 ноября 2010

Возможно, вы захотите проверить, вызывает ли он правильный исполняемый файл php на Unix-машине. Во многих системах UNIX вам потребуется вызывать исполняемый файл php-cli insted из php для использования в командной строке. Еще одна вещь, чтобы проверить, были бы разрешения. Может быть, пользователь, выполняющий скрипт script_b.php, не имеет прав на выполнение script_a?

0 голосов
/ 30 декабря 2010

Я знаю, что это старая тема, но у меня была похожая проблема.

Когда я запускал сценарий в фоновом режиме, статус выхода был равен 0, что-то вроде

system('php script_a.php &', $return);

Не могли бы вы сделать это, но просто обобщить для удобства чтения?

0 голосов
/ 17 ноября 2010

Принимая во внимание ваш комментарий о том, что ваша проблема возникает в системе UNIX, когда ваш script_b похож на

system ('php script_a.php | tee myLogFile', $ return);

Вы можете использовать этот синтаксис

system ("bash -c 'php script_a.php | tee log.txt; выход \ $ {PIPESTATUS [0]}'", $ return);

Сделайте man bash и найдите PIPESTATUS для более подробной информации.

0 голосов
/ 16 ноября 2010

Не уверен, что эти проблемы связаны, но вы можете взглянуть на exec всегда возвращает -1 (или 127) , так как у меня была похожая проблема в прошлом ... даже если я этого не делал Я на самом деле решил это.

В вашем случае это может быть другая проблема, не знаю, как это будет воспроизводиться, но я видел случаи, когда возвращаемая строка для неизвестной команды была бы возвращаемой строкой из bash (bash: command not found). На большинстве серверов я ничего не делаю, хотя. Вы можете попытаться проверить настройки оболочки для текущего пользователя (я предполагаю, что это будут www-данные)

0 голосов
/ 16 ноября 2010

вам нужно работать от имени root или использовать sudo для доступа через php.

попробуйте что-то вроде этого: -

system('sudo /usr/bin/php -f script_a.php', $return);

в вашем script_b.php

и отредактируйте / etc / sudoers, добавив следующую строку: -

apache    ALL=(ALL) NOPASSWD: /usr/bin/php -f script_a.php

, если php отсутствует в / usr / bin / php, измените эту ссылку, а также укажите полный путь к файлу script_a.php, например, /var / www / html / script_a.php или путь, по которому он физически расположен.

Спасибо.

0 голосов
/ 14 ноября 2010

Попробуйте:

<?php
    die(1);
?>

Если и это не поможет, проверьте стандартный вывод:

strace php script_a.php
0 голосов
/ 13 ноября 2010

Я не могу воспроизвести это на моей системе, Ubuntu Hardy.Вот пример:

/tmp$ mkdir /tmp/sbuzz
/tmp$ cd /tmp/sbuzz
/tmp/sbuzz$ echo '<?php exit(1); ?>' >script_a.php  
/tmp/sbuzz$ cat >script_b.php
<?php 
     system('php script_a.php', $return);
     var_dump($return);
?>
/tmp/sbuzz$ php script_b.php 
int(1)
/tmp/sbuzz$ echo '<?php exit(2); ?>' >script_a.php  
/tmp/sbuzz$ php script_b.php
int(2)
/tmp/sbuzz$ 

Код выхода 0 означает успешное выполнение программы, поэтому может показаться, что вы запускаете неправильный скрипт script_a.php или, возможно, исполняемый файл "php" не выполняет то, что нужновы ожидаете?Возможно, у вас есть скрипт php, который находится у вас на пути до переводчика?Что сообщает "какой php"?В моей системе написано "/usr/bin/php".

Если PHP не может найти скрипт, он завершится с 1, например:

/tmp/sbuzz$ cat script_b.php 
<?php
     system('php doesnt_exist_script_a.php', $return);
     var_dump($return);
?>
/tmp/sbuzz$ php script_b.php 
Could not open input file: doesnt_exist_script_a.php
int(1)
/tmp/sbuzz$

В этом случаеЯ изменил script_b.php, чтобы попытаться запустить скрипт, который не существует, и я получаю код выхода 1 (он должен быть 2, если он завершился успешно, потому что я изменил script_a выше), но он также показывает ошибку, котораяпрограмма не может быть запущена.

Возможно, вы захотите изменить ее, чтобы конкретно запустить полный путь к исполняемому файлу PHP:

system('/usr/bin/php script_a.php')

или также полный путь к сценарию, какхорошо:

system('/usr/bin/php /tmp/sbuzz/script_a.php')

Вы также можете попробовать выполнить программу, которая будет возвращать 1, точно так же, как другую точку данных, например:

system('false')
system('bash -c "exit 69"')

Возможно, вы захотите попробовать выйтикод, отличный от 1, который является общей ошибкой.Вот почему я сделал «выход 69» выше.«false» завершится с 1.

Также, конечно, попробуйте запустить скрипт script_a.php напрямую:

/tmp/sbuzz$ php script_a.php 
/tmp/sbuzz$ echo $?
2
/tmp/sbuzz$ 

«$?»код завершения последней команды запуска в командной строке.

0 голосов
/ 12 ноября 2010

Я тоже не могу воспроизвести его (PHP 5.3.3, Ubuntu).

Когда я установил значение выхода на что-то лучше, поддерживающее grep, например «666», трассировка сценариев вернула также то, что ожидалось:

strace -f php5 script_b.php 2>&1 | grep EXITSTATUS

[pid 18574] <... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 666}], 0, NULL) = 18575
waitpid(18574, [{WIFEXITED(s) && WEXITSTATUS(s) == 666}], 0) = 18574

«-f» для связывания позволяет ему следовать дочерним процессам при использовании системного вызова. «2> & 1» перенаправляет stderr в stdout, чтобы все работало. Вы также можете перенаправить его на «| less», но результат будет длинным и не очень читабельным.

...