我想抢其他网站的信息,所以,我有这样的功能:使用此功能可以安全地阅读其他网站吗?
$doc = new DOMDocument();
@$doc->loadHTMLFile($aUrl);
$xpath = new DOMXPath($doc);
它会帮助我获得来自客户端的URL,但我担心,一些网站可以让我程序崩溃,例如,它们超时,或者没有响应,或者继续重定向或者返回一个非常大的网站,这可能使我的程序没有记忆。我怎样才能避免这种情况?
我想抢其他网站的信息,所以,我有这样的功能:使用此功能可以安全地阅读其他网站吗?
$doc = new DOMDocument();
@$doc->loadHTMLFile($aUrl);
$xpath = new DOMXPath($doc);
它会帮助我获得来自客户端的URL,但我担心,一些网站可以让我程序崩溃,例如,它们超时,或者没有响应,或者继续重定向或者返回一个非常大的网站,这可能使我的程序没有记忆。我怎样才能避免这种情况?
我会用卷曲来获取网站的内容,因为这允许更配置,并且可以设置几个选项来解决您的问题。这应该做你需要的:
<?php
$aUrl = "http://www.example.com";
$ch = curl_init($aUrl);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_MAXREDIRS, 2);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$html = curl_exec($ch);
curl_close($ch);
$maxlength = 51200; // 50 kilobytes
if ($html && strlen($html) < $maxlength) {
$doc = new DOMDocument();
@$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
// Do your processing here.
} else {
die('There was an error fetching the HTML.');
}
?>
这将照顾超时和限制重定向到两个。它也不会尝试处理大于50千字节的页面(您可能希望根据您期望页面的大小来调整)。
简单的说,你不能 - 容易。
您可以使用“协同进程”,即您的脚本使用exec()
运行单独的PHP进程,然后检查进程是否成功终止。这样,即使当“共同进程”由于内存限制或类似情况而终止时,脚本也可以作出反应。
而且,你应该注意的是fopen() wrappers被禁用,或者至少file://
是不允许的。如果不是,也许有人可以尝试给file:///usr/local/secrets.xml
作为$aUrl
。
的可能是最好的办法是使用cURL获取远程文件并存储在本地。 cURL支持最大数量的重定向,连接超时和接收超时。然后,使用上述功能在“协同进程”中从临时存储器处理文件。
你不能避免这些情况,所以你适当地处理它们。 –
我无法设置缓冲区?或等待时间?如果不是....如何适当地处理它? – DNB5brims