阻止ajax请求中的php脚本执行

时间:2018-09-29 15:12:41

标签: php jquery ajax image

我的小应用程序是这样工作的:在简单的文本输入中,要求用户插入一个url。更改后,我的脚本会尝试提取并显示此页面上找到的前10张图像。

<input type="text" name="url" id="url" value="">

$("form.link-form input#url").change(function() {
  var request =     $.ajax({
                      type: "GET",
                      url: "funzioni/ajax/loadImagestFromUrl.php",
                      data: "url=" + insertedUrl,
                      dataType: "html",
                      timeout: 5000,
                      success: function(res) {
                        loadUrlImages2div(msg99);
                      },
                      error: function() {
                         request.abort();
                      }
                    });
});

PHP脚本loadImagestFromUrl.php使用PHP Simple HTML DOM Parser库运行以下代码:

set_time_limit(5);
$html = file_get_html($url); // load into this variable the entire html of the page
$count=1;
foreach($html->find('img') as $key=>$element) { // only images
    if ($count==11) break; //only first 10 images
        echo "<img class=\"imgFromUrl\" src=\"".$element->src."\" />\n";
    }
    $count++;
}

在大多数情况下,此方法效果很好,但是有些URL在几秒钟内不可用,或者受密码保护,即使我将ajax请求的超时设置为5秒,将超时设置为5秒,服务器也会继续执行某些操作执行php代码。

这种情况发生时,所有内容都会被阻止,甚至刷新页面也是不可能的,因为它会不断加载,并且仅在很多时间后才返回“ 504网关超时。服务器未及时响应。”

有人可以帮助我了解如何完全阻止此请求并让服务器继续工作吗?

1 个答案:

答案 0 :(得分:0)

该解决方案必须在php代码超时中找到,而不是ajax超时。这很清楚。

我发现了这个有趣的讨论 Great answer: Handling delays when retrieving files from remote server in PHP 建议在file_get_contents函数中使用上下文参数。 但实际上它不适用于我的应用程序。

因此,按照Wieger的建议,我尝试使用curl而不是file_get内容。我定义了此功能

function file_get_contents_curl($url) {
  $ch = curl_init();
  $timeout=2;

  curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
  curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);       

  $data = curl_exec($ch);
  curl_close($ch);

  return $data;
}

并使用它而不是解析器库中的file_get_contents。

同样,它在大多数情况下都有效,但是某些URL使服务器加载大量时间,直到网关超时为止。