如何确定运行PHP CLI脚本的正确方法?

如何确定运行PHP CLI脚本的正确方法?,php,command,cgi,command-line-interface,Php,Command,Cgi,Command Line Interface,我有一个PHP脚本,它使用以下代码在后台执行另一个PHP脚本: exec("php myScript.php >/dev/null 2>&1 &"); 在我的开发服务器上,myScript.php使用PHPCLI运行(我已经使用php_sapi_name()进行了检查),并按预期运行。但是,在live服务器上,脚本似乎使用PHP CGI运行。这导致服务器尝试运行无限多个相同的脚本,并且我的脚本权限被挂起 关于运行PHP CLI脚本的正确命令可以是什么(取决于具体的服

我有一个PHP脚本,它使用以下代码在后台执行另一个PHP脚本:

exec("php myScript.php >/dev/null 2>&1 &");
在我的开发服务器上,myScript.php使用PHPCLI运行(我已经使用php_sapi_name()进行了检查),并按预期运行。但是,在live服务器上,脚本似乎使用PHP CGI运行。这导致服务器尝试运行无限多个相同的脚本,并且我的脚本权限被挂起

关于运行PHP CLI脚本的正确命令可以是什么(取决于具体的服务器配置),我已经看到了各种建议,包括“PHP”(我的开发服务器使用的是什么)、“PHP CLI”、“php5”和“php5 CLI”。是否有任何方法可以确定live web服务器上的正确命令?显然,我不想一个接一个地尝试它们,因为一个错误的选择可能会让我再次被暂停。

您的“exec()”几乎会立即返回,因此,如前所述,如果它处于循环中,您可能会产生无数个

您需要详细说明是看到一堆脚本实例突然同时运行,还是它们似乎只是随着时间的推移而累积,好像它们没有退出

关于PHP和exec,有许多已知的问题,其中一些涉及最终用户同时运行的几个问题以及各种不良影响和解决方法:

据称,mod_php和FastCGI不存在php-cgi蔓延的问题,因此,如果您可以切换到这些问题,那么您的问题可能就消失了。这就对PHP程序运行时需要在其上标记的用户ID做出了一些假设,但如果这是一个问题,那么将下面的内容与suexec结合使用可以为所使用的用户ID提供灵活性

这里有一个选项可以避免调用脚本必须了解有关下标实现的详细信息,顺便说一句,它允许您通过exec和phpcli模式简单地按名称调用它,就像您可能已经在测试它一样

$ cat the-php-script   # /usr/bin/php5 below would also work.
#!/usr/bin/php
<?php
print("hi\n");
?>
$ chmod 755 the-php-script 
$ ls -l the-php-script 
-rwxr-xr-x 1 username username 39 Sep  2 22:37 the-php-script
$ ./the-php-script 
hi
$
$cat下面的php脚本#/usr/bin/php5也可以工作。
#!/usr/bin/php
$chmod 755 php脚本
$ls-l php脚本
-rwxr-xr-x 1用户名用户名39 Sep 2 22:37 php脚本
$./php脚本
你好
$
理论上,这应该允许:exec(“/…路径名\u to…/myScript>/dev/null 2>&1&”)。
功能上的唯一区别在于它确定了哪个PHP解释脚本。

我的主机提供商最终能够向我提供在他们机器上安装的PHP CLI的名称。它有一个模糊的名字(php43)。如果其他任何人遇到需要使用PHPCLI而不是PHPCGP执行脚本的问题,那么您可能需要向托管提供商询问详细信息。不幸的是,我发现花了一段时间才找到理解我问题的人,并且可以问正确的人答案是什么,所以你可能需要非常清楚和耐心地对待他们

我不明白为什么php的用户\所有者会影响脚本的运行;特别是“这会导致服务器尝试运行无限多个相同的脚本”,我怀疑大量CGI实例是由您的CGI脚本等待CLI调用的返回值造成的。请尝试将
cron
用于后台任务。这是您的服务器还是托管解决方案。您可能没有exec权限或缺少PHP扩展。您是否可以远程进入服务器并在CLI中手动运行脚本进行测试?是否在循环中调用此
exec
函数?这个循环结束了吗?myscript.php是否在循环中包含另一个exec调用?有许多因素可能导致内生产卵。其中大部分归结为一个非终止循环