浏览器窗体必须启动断开连接并在后台运行的PHP脚本

浏览器窗体必须启动断开连接并在后台运行的PHP脚本,php,command-line,exec,background-process,Php,Command Line,Exec,Background Process,我有一个PHP例程,可以在浏览器中正确运行查询/获取数据,我想在启动后将其与浏览器断开连接,以便它可以在后台运行。它将文件写入磁盘并通过电子邮件将链接发送给用户,因此不再需要浏览器 浏览器启动的iframe路径如下所示 src="tool/scan.php?types=All&order=Newest&email=test@example.com" 我将用一个中间人替换iframe目标,该中间人将把所有内容传递到scan.phpworkhorse文件 我知道可以使用exec()

我有一个PHP例程,可以在浏览器中正确运行查询/获取数据,我想在启动后将其与浏览器断开连接,以便它可以在后台运行。它将文件写入磁盘并通过电子邮件将链接发送给用户,因此不再需要浏览器

浏览器启动的iframe路径如下所示

src="tool/scan.php?types=All&order=Newest&email=test@example.com"
我将用一个中间人替换iframe目标,该中间人将把所有内容传递到
scan.php
workhorse文件

我知道可以使用
exec()
,但显然不知道如何设置命令行的格式,而且我对迄今为止找到的资源感到困惑

我尝试只传递$\u服务器[“DOCUMENT\u ROOT”]。路径/文件名$_服务器['QUERY_STRING']通过逐字记录,但这似乎不起作用(echo在下面的引号中显示了该值):

所以我想知道命令行和浏览器参数是否不同,并尝试了这个,但也不是这样

exec("/var/www/vhosts/example.com/httpdocs/tool/scan.php types=All order=Newest email=test@example.com");

我只需要一个正确方向的提示,如果有人能提供一个指针,我就可以重新开始。我不太懂PHP,也不太会读大部头,但我通常可以通过一些适当的提示绕过大多数障碍。谢谢…

您最好的选择可能是创建一个消息队列。因此,接受表单post的脚本将数据提交到消息队列。消息队列可以是MySQL数据库中保存要处理的数据的表。然后,您有一个cron服务,它每隔几分钟左右运行一次,将从队列中取出所有消息并对其进行处理

如果要在
exec()
函数中使用$\u GET参数运行PHP,可以通过以下方式执行:

exec('php-cgi -f /var/www/vhosts/example.com/httpdocs/tool/scan.php types=All order=Newest email=test@example.com');
exec('wget "http://example.com/tool/scan.php?types=All&order=Newest&email=test@example.com"');
或者这样:

exec('php-cgi -f /var/www/vhosts/example.com/httpdocs/tool/scan.php types=All order=Newest email=test@example.com');
exec('wget "http://example.com/tool/scan.php?types=All&order=Newest&email=test@example.com"');

这不是在cli环境中解析参数的方式cli环境意味着“命令行界面”?你看到我的问题了吗?那些exec行,如果你想把参数传递给脚本,你可以把它们放在命令行上,比如
scan.phptest@example.com
并在文件中访问阵列$argv,谢谢!非常有帮助。chrislondon,谢谢你的建议,但是没有MySQL,只有unix。哦,好的@user2507595我添加了一些你可以做的
exec()
s。如果脚本等待它们完成,请尝试在末尾添加一个“&”,这样它将是
exec('php-cgi…&')wget
是一个unix命令行函数,可以调用网页
PHPCGI
是php的cgi版本“如果脚本等待它们完成”——脚本只做自己的事情并编写一个文件。
&
是否用于返回值?如果是这样,那么就不需要了。wget看起来很吸引人。我来探索一下。