Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为每个cURL请求返回AJAX结果_Php_Jquery_Ajax_Curl - Fatal编程技术网

Php 为每个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

基本上,我的想法是做某种形式的“实时卷曲结果”系统,当执行每个请求时,该系统将生成实时结果,例如,我将有一个表,其中包含需要通过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!!!
    }
<?

在构建网站表的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