PHP exec()一次又一次地重复执行相同的脚本

时间:2012-10-15 08:06:45

标签: php jquery webserver hosting exec

这里我正在详细介绍我的流程。

我正在同一主机上执行Ajax请求。 AJAX调用saveUser.php

saveUser.php中,我添加了Common.php

Common.phpcreateFile1()createFile2()功能。

createFile1()只为其他目的创建sample1.php

createFile2()中,我正在创建一个文件sample2.php并执行exec('php /home/public/sample2.php > /dev/null &');命令来执行该文件。

我分别从createFile1()调用此createFile2()saveUser.php函数,这是由AJAX请求调用的。

由于我已将exec命令设置为在命令结束时按“&”在后台运行,因此它将在不等待响应的情况下返回,并且一切顺利进行。

但是当我检查我的服务器时,这些文件sample1.php和sample2.php一次又一次地被创建。似乎所有这些saveUser.php操作都会一次又一次地执行,直到我从SSH停止sample2.php进程。

我检查了进程列表,每次“php /home/public/sample2.php”都有new process_id,因此它确认它一次又一次被执行。如果我删除exec()代码并从SSH执行此sample2.php,它会按预期工作,没有这样的问题。

请建议我哪里出错了?服务器配置是否有任何问题,我使用的是hostgator共享帐户。

此外,我还在Common.php中包含了相同的sample2.php文件,以便通知以防它可以提供帮助。

提前感谢您的帮助。

saveUser.php代码

include_once dirname(__FILE__).'/Common.php';

createFile1();

createFile2();

echo 'saved successfully!';

Common.php代码

function createFile1()
        {
                $template = file_get_contents('sendDmTemplate.php');

                $serviceFp = fopen('sendDmFiles/sample1.php',"w");
                fwrite($serviceFp , $fileContent);
                fclose($serviceFp);
        }

        function createFile2()
        {
                $fileContent = file_get_contents(dirname(__FILE__).'/sampleFileTemplate.php');

                $serviceFp = fopen('sample2.php',"w");
                fwrite($serviceFp , $fileContent);
                fclose($serviceFp);

                exec('php '.dirname(__FILE__).'/sample2.php > /dev/null &');
        }

sample2.php代码

include_once dirname(__FILE__).'/Common.php';
echo 'hi';

2 个答案:

答案 0 :(得分:1)

检查以下内容:

1)你确定你没有多次调用你的脚本saveUser.php吗? Mayby在javascript XHR中的某个地方犯了错误吗?通过查看(apache?)日志来检查这一点。

2)你确定你的php在没有-q的情况下执行正常吗?我使用php -q pathtoscript.php

3)如果不是1或2:在saveUser.php的这里(或某处)发布代码

编辑:我看到了你的问题。您创建的文件再次包含common.php,然后再次执行。等等 - 错误的哎呀。我写得太早了。现在再看一遍。

4)您是否可以使用一些重定向到saveUser.php的错误处理?

编辑:

5)由于您将正在执行命令的文件与include_once结合使用,可能会出现问题,但我不确定。您可以通过调整sampleFileTemplate.php来更改sample2.php内容的内容来测试它。创建一个common2.php(与common.php具有相同的内容),然后使用它。告诉你设置和报告的testdrive?

答案 1 :(得分:1)

这件事发生在我身上。我试图让一个PHP脚本调用exec()在另一个PHP脚本上,但由于一些奇怪的原因,它只会exec()本身再次创建一个无限循环。目前接受的答案并没有让我任何地方,但我能够通过指定php的绝对路径让它工作。

所以,而不是

exec('php /home/public/sample2.php > /dev/null &');

它将是

exec('/usr/local/bin/php /home/public/sample2.php > /dev/null &');