11

我需要运行以下脚本。

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

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

现在我的问题:在我的 Windows 系统上script_b.phpint(1)预期运行。在我们的 Unix 服务器上,我总是得到int(0). 是什么让我无法检查,如果在script_a.php.

有谁知道这个问题以及如何解决它?

4

11 回答 11

1

尝试system使用 PHP 可执行文件和脚本文件名的绝对路径进行 PHP 调用,例如: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() 文档的示例 #5 中的说明执行includewith语句。如果您可以像这样调整您的脚本,这是一种更有效的交流方式。return

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

// File: script_b.php
<?php 
     $return = (include 'script_a.php');
     var_dump($return);
?>
于 2010-11-11T16:50:22.307 回答
1

__halt_compiler()被称为某处,能够检查吗?

于 2010-11-11T16:31:55.400 回答
1

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

于 2010-11-11T16:04:31.677 回答
0

尝试:

<?php
    die(1);
?>

如果这也失败了,请查看以下标准输出:

strace php script_a.php
于 2010-11-14T16:48:30.437 回答
0

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

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

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

您是否可以一直这样做但只是为了可读性而进行概括?

于 2010-12-30T17:41:18.263 回答
0

考虑到您的评论,当您的 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 以获取更多详细信息。

于 2010-11-17T16:12:31.640 回答
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 提示符下。

于 2010-11-12T23:43:38.677 回答
0

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

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

于 2010-11-16T14:28:50.920 回答
0

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

PHP 注释:

注意:启用安全模式后,您只能执行 safe_mode_exec_dir 中的文件。出于实际原因,目前不允许在可执行文件的路径中包含 .. 组件。

或者可能是系统功能被禁止执行?

于 2010-11-09T09:05:57.093 回答
0

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

当我将退出值设置为更好的 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”让它在您使用系统调用时跟随子进程。"2>&1" 将 stderr 重定向到 stdout 以让所有内容都 grep。您也可以将其通过管道传递给“|less”,但输出很长且可读性不强。

于 2010-11-12T11:50:45.233 回答
-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 或它的物理位置。

谢谢。

于 2010-11-16T08:10:05.490 回答