4

我正在尝试使用shell_exec()并且很难理解如何使用它。我参考了这个页面:有没有办法使用shell_exec而不等待命令完成?.

我创建了两个 PHP 文件:

shell_exec.php

<?php 
    shell_exec('php ' . __DIR__ . '/log.php > /dev/null 2>/dev/null &');
?>

日志文件

<?php
    $file = __DIR__ . '/log.txt';
    $current = time() . ": sample text\r\n";
    file_put_contents($file, $current,FILE_APPEND);
?>

然后我从浏览器访问了 shell_exec.php 的页面。我希望它运行 log.php 并创建一个文件。然而,什么也没有发生。

我怀疑上面代码中的函数中指定的php路径php在不同的操作系统中是不同的。我目前正在 Windows 中进行测试,所以这可能是它不起作用的原因。但我不是 100% 确定。

如果是这样,我怎样才能找到 php 路径并在我的环境中指定它?这是否也意味着如果我分发一个使用shell_exec()和调用 php 脚本的脚本,我是否必须编写一些代码来找出 php 路径?在这种情况下,有没有好的方法呢?

4

4 回答 4

4

如果是这样,我怎样才能找到 php 路径并在我的环境中指定它?这是否也意味着如果我分发一个使用 shell_exec() 的脚本...

不幸的是,是的。分发脚本的环境必须有一个命令行PHP(它不一定与 Web 服务器使用的 PHP 相同——它可能是不同的版本)。

并且没有简单的方法可以“找到”它。

因此,您需要做的是,明确说明(在分发时)PHP 命令行可执行文件必须在 PATH 中。

那时, shell_exec('php -q -f yourfile...') 应该可以工作。

您可以将输出重定向到一个文件(如果需要,始终相同)并在没有错误时将其删除。否则该文件将显示发生了什么错误,这可能很有用。

更新:第一次调试时,不要重定向输出,而是尝试:

<?php
    Header("Content-Type: text/plain");
    error_reporting(E_ALL);
    print shell_exec('php "' . __DIR__ . '/log.php" 2>&1'); // > /dev/null 2>/dev/null &');
?>

通过这种方式,您可以查看该命令是否遇到了其他问题,例如首先没有创建 log.txt 文件的权限。

于 2012-09-12T21:55:26.090 回答
1

如果您的文件位于包含空格的目录树中,则有问题:

shell_exec('php ' . __DIR__ . '/log.php > /dev/null 2>/dev/null &');

变成:

shell_exec('php somepath/with spaces in it/log.php > /dev/null 2>/dev/null &');

这使得 phpsomepath/with作为带有参数的脚本运行:

'spaces', 'in', 'it/log.php'

尝试在你的论点周围加上引号:

shell_exec('php "' . __DIR__ . '/log.php" > /dev/null 2>/dev/null &');
于 2012-09-12T21:59:29.650 回答
0

您是否尝试过您希望 shell_exec 执行的命令行?

我认为您错过了该行中的“-f”

于 2012-09-12T21:53:14.443 回答
-2

这看起来是一个非常糟糕的主意。你为什么使用 shell_exec 来调用 php?听起来您正在从浏览器进行测试,并通过另一个 PHP 文件进行调用,因此您知道服务器环境中有一个有效的 PHP 解释器。

而不是 shell_exec(),您应该包含该文件并直接使用它。

这样您就不必担心 PHP 二进制文件的路径,实际上您将获得对文件的更多控制权。

于 2012-09-12T21:59:14.750 回答