无法启动PHP后台脚本

时间:2015-01-16 13:08:48

标签: php

我正在尝试为我的网站构建一个备份应用程序,作为其中的一部分,我想在后台启动一个PHP脚本。这样我就不用担心它超时了。奇怪的是它在我的本地计算机上工作正常,但是当我将它复制到Hostgator网站时,它就变得疯狂了。

我拼凑了一个简单的例子......

首先,我创建了一个简单的PHP脚本:

<?php
    echo 'Current PHP version: ' . phpversion() . "\n";
    echo 'Now:       '. date('Y-m-d') ."\n";
    echo "This is created by phpbg-back.php\n\n";
    echo "Current file: " . __FILE__;
?>

我可以通过SSH运行该脚本并进入我的主机并运行此命令:

# php phpbg-back.php 
Current PHP version: 5.4.36
Now:       2015-01-16
This is created by phpbg-back.php

....

所以,脚本似乎工作正常。现在,我创建了一个将脚本作为后台进程启动的页面:

<?php
    if(isset($_GET["schedule"])) {  ?>
<html>
    <head>
        <title>Scheduling PHP Process</title>
    </head>
    <body>
        <h1>Schedule....</h1>
        <p>We are scheduling the process right now.  Here is the output:</p>
        <pre><?php
            $command = "php phpbg-back.php > phpbg-out.txt 2>&1 &";
            echo "Command: " . $command . "\n";
            echo shell_exec($command);
        ?></pre>

        <a href="phpbg-front.php">Go back to the front page and check the output</a>
    </body>
</html>
<?php
    } else {
        echo "Invalid -- the page should have the schedule parameter set.\n\n";
        echo "Current file: " . __FILE__;
    }
?>

最后,我创建了一个很好的首页,应该能够查看输出:

<html>
    <head>
        <title>Example: PHP Background Process</title>
    </head>
    <body>
        <h1>Example: PHP Background Process</h1>

        <h2>Schedule</h2>
        <p>Click this link to schedule the background process to run</p>
        <a href="phpbg-sched.php?schedule=true">Schedule</a>

        <h2>Output</h2>

        <?php if(file_exists('phpbg-out.txt')) { ?>
            <pre><?= file_get_contents('phpbg-out.txt') ?></pre>
        <?php } else { ?>
            <p>No output file found</p>
        <?php } ?>
    </body>
</html>

问题是,当脚本运行此页面时,它似乎完全忽略了我传递给它的脚本。它改为运行当前的PHP页面。所以,输出看起来更像这样(phpbg-out.txt):

Content-type: text/html^M
^M
<html>
    <head>
        <title>Scheduling PHP Process</title>
    </head>
    <body>
        <h1>Schedule....</h1>
        <p>We are scheduling the process right now.  Here is the output:</p>
        <pre>Command: php phpbg-back.php > phpbg-out.txt 2>&1 &
</pre>

        <a href="phpbg-front.php">Go back to the front page and check the output</a>
    </body>
</html>

我尝试过各种各样的事情让它发挥作用。我尝试在命令前添加bash -c。我使用-f开关来选择PHP脚本。我不知道还有什么可以尝试的。

2 个答案:

答案 0 :(得分:2)

  

$ command =“php phpbg-back.php&gt; phpbg-out.txt 2&gt;&amp; 1&amp;”;

这里有很多问题。首先,假设Web PHP在与ssh会话相同的上下文(相同的根文件系统,相同的$ PATH环境变量,相同的CWD)中运行 - 这不是一个有效的假设。

下一个问题是您假设Web PHP运行时对可执行文件和目标文件具有与ssh会话相同的权限。这不是一个有效的假设。

第三,您假设从父进程生成守护进程的子进程和expect it to be isloated是安全的。这不是一个有效的假设。

这些都没有解释为什么使用您描述的内容创建文件 - 这让我觉得您正在查看的文件不是由您向我们展示的代码创建的。

答案 1 :(得分:0)

如果您在共享服务器上,则shell命令将不起作用。如果您使用的是专用计算机/ VM,请尝试使用:

$output = '';
shell_exec($command, $output);
echo $output;

这将打印您尝试运行的命令的输出,这有望为您提供一些线索。