Php 为每个cURL请求返回AJAX结果
基本上,我的想法是做某种形式的“实时卷曲结果”系统,当执行每个请求时,该系统将生成实时结果,例如,我将有一个表,其中包含需要通过cURL请求访问的网站列表,其中在每个cURL响应的结果中,我需要使用AJAX函数将数据发送回我的页面,我最初调用了执行此请求循环的文件Php 为每个cURL请求返回AJAX结果,php,jquery,ajax,curl,Php,Jquery,Ajax,Curl,基本上,我的想法是做某种形式的“实时卷曲结果”系统,当执行每个请求时,该系统将生成实时结果,例如,我将有一个表,其中包含需要通过cURL请求访问的网站列表,其中在每个cURL响应的结果中,我需要使用AJAX函数将数据发送回我的页面,我最初调用了执行此请求循环的文件 <? foreach($database['table'] as $row) { curl_init($row['url']); //the rest of the cURL request
<?
foreach($database['table'] as $row) {
curl_init($row['url']);
//the rest of the cURL request etc...
//SEND cURL RESPONSE BACK TO AJAX AFTER EACH ROW!!!
}
<?
在构建网站表的php脚本中,只需一次执行所有ajax请求,并在返回结果时将结果返回到表行。ajax请求php脚本的概念是,当您进行ajax调用时,它会执行请求的php脚本和发送给ajax的整个响应
根据您的需求,PHP脚本不会向Ajax调用发送部分响应,相反,PHP脚本可以立即发送cUrl响应集合
要解决此问题,可以执行以下步骤
在PHP中创建两个动作和两个Ajax调用
将表中的所有URL发送到第一个Ajax调用的一个操作
在获得第一个响应(URL列表)后,您可以执行序列
Ajax调用(在每个获取URL的循环中)
这个Ajax调用将请求执行cUrl的第二个PHP脚本
获取响应
然后将此响应发送回发起的Ajax调用。然后用卷曲反应做你想做的
希望它能对您有所帮助。您不能在编写邮件时返回邮件,除非您正在向套接字写入。
在对PHP脚本的普通AJAX调用中,这是不可能的,您只能编写一次响应并返回它。在您的情况下,您可以使用flush
或ob\u flush
。
此命令将强制将输出的数据发送到浏览器,但在某些情况下,它可以在中间软件中停止(例如nginx)
还有一个问题。在脚本发送数据之前,页面将不会触发已加载的事件。这么多js脚本将无法工作
在你的情况下,我将制作另一个系统
您的带有curl的脚本将在短时间内从crontab one运行李>
curl的所有结果都保存在数据库中李>
Ajax脚本调用php后端,输出最后的结果并将其从数据库中删除李>
这在任何情况下都会起作用(大部分):)这个怎么样
您可以将整个过程分解为3个部分
过程1
向访问数据库的php页面发送ajax请求,并将URL列表发回浏览器页面。[只需回显URL][使用分隔符“|”分隔结果URL。]
过程2
上述过程的ajax成功处理函数现在将调用一个新的JavaScript函数,该函数执行以下操作
在数组中拆分url列表
过程3
使用另一个ajax函数将URL列表逐个发送到服务器
这样,一次只处理一个url,处理后结果将立即发送回
下面是JavaScript中函数调用的原型,代码不是真实的,但您对它的工作原理有了总体了解
function ajaxCall_1()
{
// get url lsit from server
.onSuccess{
process_url(data);
}
}
function process_url(data){
var url_array = data.split('|')
fetch_urls(url_array,0); // sends the first url for processing
}
function fetch_urls(url_array,position){
if(position < url_array.lenght){ // not exceeding the array count
ajax_call2(url_array[position],url_array,position);
}
}
function ajaxCall_2(url,url_array,position)
{
// get url acced by curl and send back the result
.onSuccess{
// do whatever with the data you want
fetch_urls(url_array,position++) // or position+1 // to fetch the next url
}
}
函数ajaxCall_1()
{
//从服务器获取url lsit
.成功{
处理url(数据);
}
}
函数进程\u url(数据){
var url_array=data.split(“|”)
fetch_url(url_数组,0);//发送第一个url进行处理
}
函数获取url(url数组,位置){
if(position
我认为有两种方法可以实现你的目标
对每个cURL请求执行单独的AJAX请求。这样你就不必“找到一个棘手的解决方案”,一切都会按预期进行
使用curl\u multi.*
同时执行所有请求,然后在一个大批量中返回所有数据。这样,当有许多用户同时执行许多请求时,您的脚本就会面临潜在的负载问题
我在不同的项目中使用了这两种方法,如果您需要的话,我可以提供每种方法的更多细节。事实上,我没有得到您想要做的事情,我认为这会帮助您解决问题
您可以逐个存储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);
现在,将它放入队列($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');
我们需要得到输出。如何做到这一点?创建另一个php页面pull.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请求的结果,在这种情况下,你需要使用推式方法而不是拉式方法。
要了解有关我在此处使用的函数的更多信息,请执行以下操作:
AJAX是客户端,由J