调用" php"来自PHP脚本的命令导致奇怪的进程行为

时间:2013-02-08 04:31:57

标签: php process command-line-interface

我刚刚将一个站点从一个主机移动到另一个主机。服务器环境非常相似(LAMP堆栈),所有代码在传输时都有效,除了一行。我已经对它进行了一些变异测试,但仍然得到了非常奇怪的结果:

<?php
$out = `php ../test/test.php 123 abc`;
?>

在SSH中从命令行运行php ../test/test.php 123 abc时,正常工作正常。当我在SSH中运行:php testrunner.php(上面只有“$ out”行的文件)时,它也可以正常工作。

但是一旦我从浏览器加载testrunner.php,它就会挂起。使用ps aux | grep php监视进程,进程似乎产生并消亡(为简洁而截断):

myuser   12790  0.0  0.3 259016 45284  . . . 0:00 php ../test/test.php 123 abc

如果我将“$ out”行修改为:

<?php
$out = `php ../test/test.php 123 abc &`;
?>

然后我让该脚本在后台运行。令人惊讶的是,几秒钟之后,当我再次运行ps aux | grep php时,它会显示相同的内容,但会显示新的PID。我继续运行ps aux并继续使用不同的PID。这持续了相当长的一段时间(几秒钟,甚至一分钟)。

这对我来说很奇怪,因为test.php只有一行来回显一些文本用于测试目的。

从终端正常工作。从Web调用时挂起并具有其他奇怪的行为。我错过了什么吗?

(我有证据通过将输出重定向到日志文件,当从Web浏览器运行时,PHP脚本似乎调用ITSELF而不是其他脚本test.php。当它的行为像这样,它没有'接收任何$argv参数...但是当我从命令行运行它时,一切都很好!奇怪吗?)

更新:Geez ......我只是在观察服务器进程,而test.php的PHP开始产生失控。它们成倍增加到数百甚至数千个进程:服务器被关闭了一分钟,SSH和一切。它现在已经恢复,但我无法解释发生了什么。代码中没有循环,所涉及的文件都非常简单,隔离用于测试目的......

我正在与我的主人合作,因为他们回复我的支持请求,看看这是否与环境有关,或者是什么......只是通过更改服务器环境会导致这种情况发生?

2 个答案:

答案 0 :(得分:0)

我的主人,小橙子,一直很有帮助,但最后,我或他们所能想到的是(来自我的支持票):

  

......我们作为堆栈的一部分运行的SuPHP或其他一些基于安全的软件阻止了您的进程产生新进程(因为这种行为可能因为显而易见的原因而不安全)......

在任何情况下,脚本都可以在我的Macbook(与nginx完全不同的配置)和我的旧主机的LAMP堆栈上正常工作,ASO具有类似的设置。

也许我会询问是否在不调用命令行的情况下生成长时间运行的进程,以便在另一个问题中不会阻止调用脚本。

答案 1 :(得分:-3)

删除空格并放置下划线

$out = `php ../test/test.php_123_abc`;