我想抓住其他网站的信息,所以,我有这样的功能:
$doc = new DOMDocument();
@$doc->loadHTMLFile($aUrl);
$xpath = new DOMXPath($doc);
它可以帮助我从客户端获取网址,但我担心有些网站可能会导致我的程序崩溃,例如,它们超时或无响应,或者继续重定向或返回一个非常大的网站可能使我的程序没有记忆的网站。我怎么能避免这个?
答案 0 :(得分:1)
简单地说,你不能 - 轻松。
您可以使用“协同进程”,即您的脚本使用exec()
运行单独的PHP进程,然后检查进程是否成功终止。这样,即使由于内存限制或类似事件导致“协同进程”终止,您的脚本也会做出反应。
并且,您应该注意fopen() wrappers被禁用,或者至少file://
不被允许。如果没有,也许有人可以尝试将file:///usr/local/secrets.xml
作为$aUrl
。
最好的方法是使用cURL获取远程文档并将其存储在本地。 cURL支持最大数量的重定向,连接超时和接收超时。然后,使用上述函数在“协同进程”中处理临时存储中的文件。
答案 1 :(得分:1)
我会使用cURL来获取网站的内容,因为这样可以提供更多配置,您可以设置几个选项来解决您的问题。这应该做你需要的:
<?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千字节的页面(您可能希望根据您希望页面的大小来调整它)。