Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP system()-返回状态始终为0_Php_Unix_System_Return_Status - Fatal编程技术网

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

PHP system()-返回状态始终为0,php,unix,system,return,status,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); ?> //文件:script\u a.php //文件:script_b.php 现在我的问题是:在运行script_b.php的windows系统上,显示的int(1)与预期一致

我需要运行以下脚本

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

// File: script_b.php
<?php 
     system('php script_a.php', $return);
     var_dump($return);
?>
//文件:script\u a.php
//文件:script_b.php
现在我的问题是:在运行
script_b.php
的windows系统上,显示的
int(1)
与预期一致。在我们的Unix服务器上,我总是得到
int(0)
,如果
脚本a.php
中发生某个故障,我就无法进行检查


有人知道这个问题以及如何解决吗?

您是否检查过unix服务器上是否启用了安全模式

PHP注意:

注意:启用安全模式时,您 只能在中执行文件 安全模式执行目录。实用的 由于种种原因,目前不允许这样做 拥有。。路径中的组件 可执行文件


或者系统函数被禁止执行?

您可能需要检查它是否在Unix机器上调用了正确的php可执行文件。在许多UNIX系统上,您需要调用php cli可执行文件,而不是php可执行文件,以便在命令行上使用。
要检查的另一件事是权限。可能执行脚本\u b.php脚本的用户没有权限执行脚本\u a?

\u halt\u compiler()
在某个地方被调用,可以检查是否?

尝试使用php可执行文件和脚本文件名的绝对路径调用php
系统,例如:
系统('/usr/bin/php/path/to/script_a.php',$return);
可能是路径问题。(您可以通过以下命令找到php可执行文件的绝对路径:
哪个php

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

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

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

// File: script_b.php
<?php 
     $return = (include 'script_a.php');
     var_dump($return);
?>
//文件:script\u a.php
//文件:script_b.php

我也不能复制它(PHP5.3.3,Ubuntu)

当我将exit值设置为更好的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
strace-f php5 script_b.php 2>&1|grep EXITSTATUS
[pid 18574][{WIFEXITED(s)和&WEXITSTATUS==666}],0,NULL=18575
waitpid(18574,[{WIFEXITED(s)和&WEXITSTATUS(s)==666}],0)=18574

用“-f”表示strace,让我们在使用系统调用时跟踪子进程。“2>&1”将stderr重定向到stdout,使所有内容都变为grep。您也可以通过管道将其传输到“less”,但输出很长且可读性不强。

我无法在我的系统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$ 
也可以是脚本的完整路径:

system('/usr/bin/php /tmp/sbuzz/script_a.php')
您还可以尝试具体执行一个返回1的程序,就像另一个数据点一样,例如:

system('false')
system('bash -c "exit 69"')
您可能希望尝试除1以外的退出代码,这是常见的失败。这就是为什么我在上面写了“69号出口”。“false”将以1退出

当然,还可以尝试直接运行脚本_a.php:

/tmp/sbuzz$ php script_a.php 
/tmp/sbuzz$ echo $?
2
/tmp/sbuzz$ 
“$?”是最后一个运行命令在shell提示符下的退出代码。

请尝试:

<?php
    die(1);
?>

您需要以root用户身份运行,或者使用sudo通过php进行访问

试着这样做:-

system('sudo /usr/bin/php -f script_a.php', $return);
在脚本_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或其物理位置的路径


谢谢。

不确定这些问题是否相关,但您可以看看,因为我过去也遇到过类似的问题。。。即使我没有真正解决它


在您的情况下,这可能是另一个问题,不确定它如何可复制,但我看到过这样的情况:未知命令的返回字符串将是来自
bash
bash:command not found
)的返回字符串。在大多数服务器上,我什么都不知道。您可以尝试检查当前用户的shell设置(我假设它是www-data)

考虑到您的评论,即当您的脚本类似于

系统('php脚本_a.php | tee myLogFile',$return)

您可以使用这种语法

系统(“bash-c'php脚本_a.php | tee log.txt;退出\${PIPESTATUS[0]}'”,$return)


执行man bash并搜索PIPESTATUS以获取更多详细信息。

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

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

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

您是否可以这样做,但只是为了可读性进行概括

从命令行运行script_a.php时,
$?
包含哪些内容?与Windows相比,您在unix服务器上使用的php版本是什么?如果我从命令行运行script_b,则一切正常。什么是$?windows系统运行在PHP5.2.6上,Unix运行在PHP5.2.11上
$?
是bash中的返回参数<代码>php脚本_a.php;echo$?
安全模式已关闭。并且允许调用系统。如果我在退出之前在脚本_a中放入一些echo语句,我通常可以获取该输出,但退出状态仍然为0。您尝试过其他执行方法吗?也许exec()或passthru()可以正常工作我试过了,exec()和passthru()。在命令行上,结果与预期一致,但在Web服务器上执行时,$return的结果为0。如果执行echo 1而不是exit(1),该怎么办?带数字退出只发送一个退出信号,不会根据php文档打印任何内容,这可能就是问题所在。@Ignacio-我可以在嵌入
\uuuu halt\u compiler()时复制相同的输出;出口(1),可能是unix别名中的PHP出现了问题?在这种情况下,它不会在两种平台上都失败吗?是的,它没有
system('sudo /usr/bin/php -f script_a.php', $return);
apache    ALL=(ALL) NOPASSWD: /usr/bin/php -f script_a.php
system('php script_a.php &', $return);