返回每个cURL请求的AJAX结果

时间:2013-10-29 02:19:13

标签: php jquery ajax curl

基本上,我的想法是做某种形式的" 现场cURL结果"在执行每个请求时生成实时结果的系统,例如,我将有一个表格,其中包含需要通过cURL请求访问的网站列表,其中每个请求的结果cURL响应我需要使用AJAX函数将数据发送回我的页面我最初调用执行此循环请求的文件

<?
    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!!!
    }
<?

然后我希望它在发生时返回每个 cURL 响应的结果,而不是等到完整脚本完成后立即返回它们。

这可能吗?如果是这样,我仍然会使用正常的 AJAX 请求?

7 个答案:

答案 0 :(得分:5)

这个怎么样?

你将entie过程分解为3

流程1

您向访问数据库的php页面发送ajax请求,并将URL列表发送回浏览器页面。 [简单地回显Urls] [使用分隔符'|'分开结果网址。]

流程2

上述过程的ajax成功处理函数现在将调用一个新的JavaScript函数来执行以下操作。

将url列表拆分为数组。

流程3 使用另一个ajax函数将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
    }
}

答案 1 :(得分:1)

在构建该网站表的php脚本中,只需一次执行所有ajax请求,并在结果返回时将结果返回到表行。

答案 2 :(得分:1)

除非您正在写入套接字,否则在编写时不能返回消息。 在对PHP脚本的正常AJAX调用中,这是不可能的,并且您只能编写一次响应并将其返回。

答案 3 :(得分:1)

在您的情况下,您可以使用flushob_flush。 此命令将强制将输出的数据发送到浏览器,但在某些情况下,它可以在中间软件中停止(例如nginx)

还有另一个问题。直到你的脚本发送数据,页面不会触发加载的事件。这么多js脚本都行不通。

在你的情况下,我将制作另一个系统。

  1. 您的脚本在短时间内从crontab运行curl。
  2. curl的所有结果都保存在数据库中。
  3. Ajax脚本调用php后端,输出最后的结果并从数据库中删除它们。
  4. 这适用于任何情况(主要是):)

答案 4 :(得分:1)

我看到了实现目标的两种方法。

  1. 为每个cURL请求单独执行AJAX请求。这样你就不必“找到一个棘手的解决方案”,一切都会按照它应该的方式工作
  2. 使用curl_multi_*同时执行所有请求,然后返回一大批中的所有数据。通过这种方式,您可以在有许多用户同时执行多项请求的情况下打开脚本以解决潜在的负载问题
  3. 我在不同的项目中使用了它们,并且如果您需要,可以提供更多详细信息。

答案 5 :(得分:1)

您可以逐个存储卷曲请求的结果,并在每 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');

我们需要获得输出。怎么做到这一点?创建另一个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请求的结果,在这种情况下你需要使用推送方法而不是拉方法。

要了解我在这里使用的功能的更多信息:

  1. array_push
  2. array_shift
  3. window.setInterval

答案 6 :(得分:0)

对PHP脚本的Ajax请求的概念是,当你进行Ajax调用时,它会执行请求的PHP脚本和整个响应发送到Ajax。

根据您的要求,PHP脚本不会向Ajax调用发送部分响应,而PHP脚本可以立即发送cUrl响应的集合。

要解决此问题,您可以执行以下步骤

  1. 在PHP和两个Ajax调用中创建两个操作。

  2. 将所有URls从Table发送到第一个Ajax调用的一个操作。

  3. 获得第一个响应(URLS列表)后,您可以执行系列 Ajax调用(在每个获取的URls的循环中)。

  4. 此Ajax调用将请求执行cUrl的第二个PHP脚本 获取回应。

  5. 然后将此响应发送回已启动的Ajax调用。然后按照cUrl响应做你想做的事。

  6. 希望它会对你有所帮助。