0

两者都不

<?php system('php file.php'); ?>

也不

<?php system('/usr/bin/php file.php'); ?>

工作。为什么?

我试过 with -q, with!#/usr/bin/php等。

4

12 回答 12

4

你应该用 -f 调用它,但没有它它也应该工作:

<?php system('/usr/bin/php -f file.php'); ?>

“它不起作用”是什么意思?

您是否希望内容像来自您的脚本一样被输出?使用includerequire

你想要变量中的内容吗?使用反引号运算符

您可以通过使用反引号运算符而不是系统来查看从命令中返回的内容。

于 2008-10-13T08:49:59.503 回答
1

可能是因为安全模式。

Note: When safe mode is enabled, you can only execute files within the safe_mode_exec_dir. For practical reasons, it is currently not allowed to have .. components in the path to the executable.

http://www.php.net/system

于 2008-10-13T08:51:29.547 回答
0

没有更多信息......它可能是 PHP 可执行文件的路径、file.php 的路径或文件权限问题。

于 2008-10-13T08:49:46.867 回答
0

当您将完整路径传递给“file.php”时会发生什么?

此外,尝试将输出(但 stdout 和 stderr)重定向到文件,以便您可以看到生成的错误消息。

于 2008-10-13T08:50:36.990 回答
0

谢谢大家的回答!!

对于“不起作用”,我的意思是:它不会返回或打印任何东西。

我有两个文件 a.php && b.php (具有所有权限)并且安全模式已关闭

b.php

<?php
$a = system('/usr/bin/php -f /Applications/MAMP/htdocs/a.php',$b);
print_r($a);
echo '-'; # for separation
print_r($b); ?>

和一个.php

<?php echo 'hello world'; ?>

当我从浏览器(localhost/b.php)运行 b.php 时,它会打印:

字符串(0)“”-int(5)

这意味着 $b 变量是 5 但是... 5 什么?

于 2008-10-13T09:21:03.403 回答
0

当您打开错误报告时它会说什么?

<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
$a = system('/usr/bin/php -f /Applications/MAMP/htdocs/a.php',$b);
print_r($a);
echo '-'; # for separation
print_r($b);
于 2008-10-13T09:23:49.263 回答
0

}} 对于“不起作用”,我的意思是:它不会返回或打印任何东西。

尝试在您的服务器上获取终端/shell 并尝试您的系统命令。如果您的操作系统是 unixy,您可以使用which php之类的东西来找到 php cli 的正确路径。

您确实安装了 php cli 对吗?默认情况下通常不安装它。

您的网络服务器是否执行 chroot 或其他操作?在您尝试使用 system() 的环境中,可能不存在 php cli。

与其尝试调用脚本,不如尝试做一个简单的system('php -v')。一旦你得到正确输出 php 版本号,然后将调用添加到你的脚本。

于 2008-10-13T23:44:13.600 回答
0

当我改变

system('/usr/bin/php -f /Applications/MAMP/htdocs/a.php',$b);

为了

('/bin/php -f /Applications/MAMP/htdocs/a.php',$b);

然后它说 127 而不是 5,我猜这些是错误代码

于 2008-10-13T10:59:32.877 回答
0

尝试:

$output = array();
$returnCode = 0;
exec('/usr/bin/php -f /Applications/MAMP/htdocs/a.php 2>&1', $output, $returnCode);
print_r($output);

2>&1标准错误重定向到标准输出,因此任何错误消息都将被捕获$output

于 2008-10-13T11:16:49.193 回答
0

等等……你到底想在这里实现什么?只需运行 a.php 并将输出返回到浏览器?在这种情况下,包括它。从您发布的 a.php ( <?php echo 'hello world'; ?> ) 内容的外观来看,这似乎是您想要的。

如果 a.php 的内容还有更多内容,请回帖并说明您真正想做的事情。

于 2008-10-13T11:26:22.747 回答
0

尝试:

$fp = popen('/usr/bin/php -f file.php', 'r');

if(false === $fp)
{
   // something bad happened: error handle
}

$contents = '';

while(false === feof($fp))
{
  $contents .= fgets($fp);
}

fclose($fp);    
echo $contents;

这将允许您捕获子shell 的输出并捕获错误。

于 2008-10-13T15:06:38.073 回答
-1

您显然不了解系统功能的工作原理。你真正需要的可能是popen使用popen启动进程,然后使用fgets读取其输出。

或者,您可以使用其他人已经建议的反引号运算符。

于 2008-10-13T11:04:18.033 回答