2011-08-13 29 views
1

我想抢其他网站的信息,所以,我有这样的功能:使用此功能可以安全地阅读其他网站吗?

$doc = new DOMDocument(); 
@$doc->loadHTMLFile($aUrl); 
$xpath = new DOMXPath($doc); 

它会帮助我获得来自客户端的URL,但我担心,一些网站可以让我程序崩溃,例如,它们超时,或者没有响应,或者继续重定向或者返回一个非常大的网站,这可能使我的程序没有记忆。我怎样才能避免这种情况?

+1

你不能避免这些情况,所以你适当地处理它们。 –

+0

我无法设置缓冲区?或等待时间?如果不是....如何适当地处理它? – DNB5brims

回答

1

我会用卷曲来获取网站的内容,因为这允许更配置,并且可以设置几个选项来解决您的问题。这应该做你需要的:

<?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千字节的页面(您可能希望根据您期望页面的大小来调整)。

+0

如果PHP的内存限制为1 MB和页面为2 MB,它已经太迟你检查的时间。 – zneak

+0

当然。我认为问题在于如果处理量太大,处理时间将会很长,而不是PHP内存限制受到影响。 – EdoDodo

1

简单的说,你不能 - 容易。

您可以使用“协同进程”,即您的脚本使用exec()运行单独的PHP进程,然后检查进程是否成功终止。这样,即使当“共同进程”由于内存限制或类似情况而终止时,脚本也可以作出反应。

而且,你应该注意的是fopen() wrappers被禁用,或者至少file://是不允许的。如果不是,也许有人可以尝试给file:///usr/local/secrets.xml作为$aUrl

的可能是最好的办法是使用cURL获取远程文件并存储在本地。 cURL支持最大数量的重定向,连接超时和接收超时。然后,使用上述功能在“协同进程”中从临时存储器处理文件。

相关问题