我需要运行以下脚本。
// 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
内发生某种故障,我无法检查。
有人知道这个问题以及如何解决它?
答案 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? p>
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或它实际所在的路径。
感谢。