您可以一一存储 curl 请求的结果,并通过在每N秒(假设 5 秒)后执行一次请求来检索该结果。
在这一部分中,我们将 curl 请求的输出存储在某处。这里有一些修改过的源代码,它获取输出并调用一个函数将其存储在队列中:
//these two lines will be mostly same for all request
//so i put them out of the loop
curl_init($ch);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//these two lines will be mostly same for all request
//so i put them out of the loop
curl_init($ch);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
foreach($database['table'] as $row) {
// set URL and other appropriate options which
//vaires from request to requeste
curl_setopt($ch, CURLOPT_URL, $row['url']);
//grabbing the output in $output
$output = $curl_exec();
put_it_to_the_queue($output);
}
curl_exec($ch);
现在put_it_to_the_queue($output)
会怎么做?它将输出存储在某个地方,以便其他资源可以从那里获取它们。为简单起见,让我们把它放在你的会话中。
function put_it_to_the_queue($output) {
//Or you can store in sql lite or in a file or somewhere else
array_push($_SESSION['outputs']);
}
问题是客户将如何应对这种不同的情况。
让客户端第一次调用服务器以开始获取 url,然后完全忘记这一点。
$.get('start.php');
我们需要得到输出。如何做到这一点?pull.php
如果队列中有任何内容,则为将发送输出的内容创建另一个 php 页面。
echo array_shift($_SESSION['outputs']);
这是检索输出的客户端代码。在向服务器发送第一个请求后放置此代码。
//delay is in ms
//5 is the value of N seconds
//we will retrieve the output form
var delay = 5 * 1000;
window.setInterval(function(){
$.get('pull.php',function(response){
//do something with the reponse here
alert(response);
})
}, delay);
笔记
这个解决方案不是万无一失的。如果您有一个重听的网站,您需要使用更精确的存储来存储 html 请求的结果,并且在这种情况下您需要使用推送方法而不是拉取方法。
要了解更多关于我在这里使用的功能:
- array_push
- 数组移位
- window.setInterval