PHP system() - 返回状态始终为0

时间:2010-11-09 08:54:25

标签: php unix system return status

我需要运行以下脚本。

// 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 个答案:

答案 0 :(得分:1)

你可能想检查它是否在Unix机器上调用正确的php可执行文件。在许多UNIX系统上,您需要调用php-cli可执行文件,以便在命令行上使用。 要检查的另一件事是权限。也许执行script_b.php脚本的用户没有执行script_a的权限?

答案 1 :(得分:1)

在某处调用

__halt_compiler(),能够检查吗?

答案 2 :(得分:1)

尝试使用PHP可执行文件和脚本文件名的绝对路径进行PHP system调用,例如:system('/usr/bin/php /path/to/script_a.php', $return);。也许这是一个路径问题。 (您可以使用以下命令找到PHP可执行文件的绝对路径:which php)。

另外,正如有人建议的那样,尝试通过在命令行上运行php script_a.php; echo $?来调试UNIX服务器上script_a.php的实际返回值。 echo将输出最后一个返回值,即script_a.php返回的值。

无论如何,我建议使用include语句执行return,如include() documentation的示例#5所述。如果您可以像这样调整脚本,那么这是一种更有效的沟通方式。

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

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

答案 3 :(得分:0)

您是否检查过unix服务器上是否启用了safe_mode?

PHP注意:

  

注意:启用安全模式时,您   只能执行中的文件   safe_mode_exec_dir之。实用   原因,目前不允许   在...的路径中有..组件   可执行文件。

或许禁止执行系统功能?

答案 4 :(得分:0)

我也无法重现它(PHP 5.3.3,Ubuntu)。

当我将exit-value设置为更好的grep-able时,比如“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&gt;&amp; 1”将stderr重定向到stdout以让一切变得更加强大。你也可以把它传递给“| less”来完成但是输出很长而且不太可读。

答案 5 :(得分:0)

我无法在我的系统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$ 

“$?”是shell提示符下最后一次运行命令的退出代码。

答案 6 :(得分:0)

尝试:

<?php
    die(1);
?>

如果失败,请查看以下标准:

strace php script_a.php

答案 7 :(得分:0)

不确定这些问题是否相关,但您可以查看exec always returns -1 (or 127),因为我过去遇到过类似的问题......即使我没有真正解决它。

在你的情况下,它可能是另一个问题,不确定它是如何可再现的,但我已经看到了caeses,其中未知命令的返回字符串将是来自bash的返回字符串({{1 }})。在大多数服务器上,我什么都没有。您可以尝试检查当前用户的shell设置(我假设它将是www-data)

答案 8 :(得分:0)

考虑到您的注释,当您的script_b类似于

时,您的问题出现在UNIX系统中
  

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

您可以使用此语法

  

system(“bash -c'php script_a.php | tee log.txt; exit \ $ {PIPESTATUS [0]}'”,$ return);

请男人猛击并搜索PIPESTATUS以获取更多详情。

答案 9 :(得分:0)

我知道这是一个老线程,但我遇到了类似的问题。

当我在后台运行脚本时,退出状态被设置为0,类似于

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

你能这样做但只是为了可读性而进行推广吗?

答案 10 :(得分:-1)

你需要以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或它实际所在的路径。

感谢。