2015-01-16 36 views
0

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

我拼凑起来的一个简单的例子...

首先,我创建了一个简单的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'ing到我的主机和运行这个运行该脚本命令:

# 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__; 
    } 
?> 

最后,我创建了一个漂亮的头版,应该是能够查看输出:

​​

的问题是当脚本贯穿这个页面时,它似乎完全忽略了我传递给它的脚本。它运行当前的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脚本。我不知道还有什么可以尝试的。

+1

您是否有权执行此任务/操作?根或共享服务器? –

+0

尝试'php phpb-back.php 2>&1 >> phpbg-out.txt'来查看'shell_exec'返回的信息。 – jsxqf

+0

@TopQuestions至于权限,它似乎允许我执行像tar或cp这样的shell命令。我有SSH访问服务器。这是一个共享服务器,所以我没有root权限。 – digitaleagle

回答

0

如果您位于共享服务器上,shell命令将不起作用。如果你是一个专用机/ VM上,尝试使用:

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

这将打印您要执行的命令,这将有望给你一些线索的输出。

+0

我在共享服务器上。有没有办法做到这一点,或者没有办法在共享服务器的后台运行长时间运行的进程? – digitaleagle

+0

您无法在共享服务器上运行任何shell命令。在共享框上允许shell命令会引发大量的安全问题。如果您想要命令行控制,我推荐使用专用服务器或虚拟专用服务器(VPS)。 – woz

+0

我只希望能够自动执行一些管理任务,例如备份和部署更新到我的应用程序。我想我只需要重新思考我在做什么。我不确定我是否已经准备好去购买专用服务器或VPS的成本。 – digitaleagle

2

$命令= “PHP phpbg-back.php> phpbg-out.txt 2> ”;

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

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

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

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

+0

感谢您指出所有这一切。你的文章很有帮助。我仍然无法完成这项工作。我试过这个命令: echo/usr/bin/php .../www/example/phpbg-back.php \&> .../www/example/phpbg-out.txt |/usr/bin/at now 2&gt;&1 我删除了部分路径以发布此消息,但是应该修复关于路径的假设。 权限似乎没有问题;它正在创建该文件。 现在它使用at服务来运行该进程。 它仍然运行当前页面而不是我指定的页面。你看到我缺少的东西吗? – digitaleagle