我的小应用程序是这样工作的:在简单的文本输入中,要求用户插入一个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网关超时。服务器未及时响应。” >
有人可以帮助我了解如何完全阻止此请求并让服务器继续工作吗?
答案 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使服务器加载大量时间,直到网关超时为止。