我正在尝试为我的网站构建一个备份应用程序,作为其中的一部分,我想在后台启动一个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脚本。我不知道还有什么可以尝试的。
答案 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;
这将打印您尝试运行的命令的输出,这有望为您提供一些线索。