返回每个cURL请求的AJAX结果

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

这个怎么样?

你将entie过程分解为3

过程1

您将ajax请求发送到访问数据库的php页面,并将URL列表发送回浏览器页面。 [简单地回显Urls] [使用分隔符’|’ 分开结果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 } } 

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

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

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

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

在你的情况下,我将建立另一个系统。

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

这将适用于任何情况(主要):)

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

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

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

好吧,我实际上没有得到你想做的事情,我认为WebSockets将帮助你摆脱Web Sockets Tutorail

您可以逐个存储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'); 

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

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

  1. array_push
  2. array_shift
  3. window.setInterval

Ajax对PHP脚本的请求的概念是,当你进行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响应。

希望它会对你有所帮助。