我正在尝试将每个网址加载到站点地图.xml文件中,以预先缓存它们并加快用户体验。
我有以下代码,可以从站点地图中获取网址
$ch = curl_init();
/**
* Set the URL of the page or file to download.
*/
curl_setopt($ch, CURLOPT_URL, 'http://onlineservices.letterpart.com/sitemap.xml;jsessionid=1j1agloz5ke7l?id=1j1agloz5ke7l');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec ($ch);
curl_close ($ch);
$xml = new SimpleXMLElement($data);
foreach ($xml->url as $url_list) {
$url = $url_list->loc;
echo $url ."<br>";
}
我现在正在尝试使用 fsockopen 依次加载每个 url。
其中$url采用以下格式:http://onlineservices.letterpart.com:80/content/en/FAMILY-201103311115/Family_FLJONLINE_FLJ_2009_07_4
foreach ($xml->url as $url_list) {
$url = $url_list->loc;
$fp = fsockopen ($url,80);
if ($fp) {
fwrite($fp, "GET / HTTP/1.1'r'nHOST: $url'r'n'r'n");
while (!feof($fp)) {
print fread($fp,256);
}
fclose ($fp);
} else {
print "Fatal error'n";
}
}
但这给了我每个 url 的此错误:
[2011 年 5 月 12 日 13:34:09] PHP 警告:fsockopen() [function.fsockopen]:无法连接到 http://onlineservices.letterpart.com:80/content/en/FAMILY-201103311115/Family_FLJONLINE_FLJ_2009_07_4:-1 (找不到套接字传输"http" - 您在配置 PHP 时忘记启用它吗?) 在/home/digital1/public_html/dev/sitemap.php 第 32 行
我已经读到我需要:"只是主机名,而不是 fsockopen 调用中的 URL。您需要提供 uri,减去实际 HTTP 标头中的主机/端口"
所以我试了这个:
$fp = fsockopen ("http://onlineservices.letterpart.com",80);
if ($fp) {
fwrite($fp, "GET / HTTP/1.1'r'nHOST: content/en/FAMILY-201103311115/Family_FLJONLINE_FLJ_2009_07_4'r'n'r'n");
while (!feof($fp)) {
print fread($fp,256);
}
fclose ($fp);
} else {
print "Fatal error'n";
}
但我仍然收到同样的错误。
编辑:
如果我将 fsockopen 调用更改为:
$fp = fsockopen ("onlineservices.letterpart.com",80);
然后我得到一个稍微不同和更好但仍然错误的回答。 它似乎忽略了 onlineservices.letterpart.com 部分并尝试 http:///content/但是......它已将:/web/ui.xql?action=html&resource=login.html 附加到我们的登录页面的URL的末尾,因此它必须看到我们的服务器...
HTTP/1.1 302 临时移动 日期:2011 年 5 月 12 日星期四 14:40:02 GMT 服务器:Jetty/5.1.12 (Windows 2003/5.2 x86 java/1.6.0_07 到期:1970 年 1 月 1 日星期四 00:00:00 GMT 设置饼干:JSESSIONID=nh62zih3q8mf;路径=/位置:http:///content/en/FAMILY-201103311115/Family_FLJONLINE_FLJ_2009_07_4/web/ui.xql?action=html&resource=login.html 内容长度:0
谢谢。
fsockopen 不打算用于 HTTP 请求,Curl是更好的选择(而且功能更强大)。
还有file_get_contents可以使其快速:
foreach ($xml->url as $url_list) {
$url = $url_list->loc;
file_get_contents($url);
}
用于应用程序缓存预热!