2

基本上,我的想法是做某种形式的“实时 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请求吗?

4

8 回答 8

5

这个怎么样?

您将实体过程分解为 3

过程 1

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

过程 2

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

将 url 列表拆分为一个数组。

过程 3 使用另一个 ajax 函数将 urls 列表一个一个发送到服务器。

这样,一次只处理一个 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
    }
}
于 2013-11-10T05:58:31.587 回答
1

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

于 2013-10-29T02:32:17.110 回答
1

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

于 2013-11-08T11:51:33.533 回答
1

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

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

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

  1. 您的 curl 脚本会在短时间内从 crontab 运行。
  2. curl的所有结果都保存在数据库中。
  3. Ajax 脚本调用 php 后端输出最后的结果并将它们从数据库中删除。

这在任何情况下都有效(大多数情况下):)

于 2013-11-09T20:59:52.923 回答
1

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

  1. 为每个 cURL 请求执行单独的 AJAX 请求。这样你就不必“找到一个棘手的解决方案”,一切都会按预期工作
  2. 用于curl_multi_*同时执行所有请求,然后大批量返回所有数据。这样,您可以打开脚本以解决潜在的负载问题,以防有许多用户同时执行许多请求

我在不同的项目中都使用了它们,如果您需要,可以提供有关每个项目的更多详细信息。

于 2013-11-11T15:09:19.770 回答
1

好吧,我实际上并没有得到您想要做的事情,我认为WebSockets将帮助您解决 Web Sockets Tutorail

于 2013-11-12T07:23:13.217 回答
1

您可以一一存储 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 请求的结果,并且在这种情况下您需要使用推送方法而不是拉取方法。

要了解更多关于我在这里使用的功能:

  1. array_push
  2. 数组移位
  3. window.setInterval
于 2013-11-12T08:37:07.333 回答
0

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

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

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

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

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

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

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

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

希望它会帮助你。

于 2013-11-08T06:37:56.707 回答