php 后台执行,客户端无需等待。

我需要做一个PHP采集系统,也就是客户端访问了一个页面,页面就提交一次采集请求,然后立马响应结果。
无需让客户端一直等待。PHP后台执行采集任务,无视客户端是否关闭浏览器。

自己网上查了很多,可以做到后台执行,但是浏览器一直处于等待。

 <?php
ignore_user_abort(true); // 后台运行,不受前端断开连接影响
set_time_limit(60);// 脚本最多运行1分钟
ob_end_clean();//清除之前的缓冲内容,
header("HTTP/1.1 200 OK"); //可以发送200状态码,

for ($x=0; $x<=100000; $x++) {
$handle=fopen('num.txt',"a+");
fwrite($handle,$x);
@fclose($handle);
}

?>

你要立即显示服务器端数据,最简单的可以用EventSource这个对象,具体参考这个:http://www.w3dev.cn/article/20180517/Asp.net-SSE-DEMO.aspx

高级一点就是websocket之类的

或者用streaming ajax http://www.w3dev.cn/article/20121010/firefox-Streaming-AJAX.aspx

https://www.cnblogs.com/zdz8207/p/3765567.html

很多方法可以解决。楼上几个都行,如果看不太懂,你可以用js,每隔几秒查询一次结果是否出来了。出来了就刷新页面,或者是把数据拉取出来显示就OK了。

你这属于异步执行,使用SWOOLE即可。SWOOLE有现成的采集类可以直接使用。

写一个服务器进程 让他跑着呗

用socket或者queue都可以
这个我不久之前就写过类似的,对于socket用得不多的话我还是建议使用queue,应该用起来跟简单,实现多进程后台队列,给你写一个简单的例子:
你可以分开两个方法来写,
发送端:
<?php
for ($x=0; $x<=100000; $x++) {
Queue::push('xx\xx\Queue@fire', $x, $queue = 'class_queue');//四个参数分别是:use的命名空间@方法,传过去的数据,队列名称
}
数据处理端:
<php
class Queue
{
public function fire(Job $job, $id)
{
$handle=fopen('num.txt',"a+");
fwrite($handle,$x);
@fclose($handle);
}
这样就可以了,具体用法https://blog.csdn.net/zqtsx/article/details/9188845或者上github甚至百度一下应该都有很多使用的例子