0

我正在尝试将每个 url 加载到 sitemap.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";
    }
}

但这给了我每个网址的这个错误:

[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 时是否忘记启用它?)在第 32 行的 /home/digital1/public_html/dev/sitemap.php

我读过我需要:“只是主机名,而不是 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 到他的网址末尾是我们的登录页面,所以它必须看到我们的服务器......

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设置 Cookie:JSESSIONID=nh62zih3q8mf;Path=/ 位置:http:///content/en/FAMILY-201103311115/Family_FLJONLINE_FLJ_2009_07_4/web/ui.xql?action=html&resource=login.html内容长度:0

谢谢。

4

1 回答 1

1

fsockopen 不注意用于 HTTP 请求,Curl 是更好的选择(并且功能更强大)。

还有 file_get_contents 可以使它快速:

foreach ($xml->url as $url_list) {
    $url = $url_list->loc;
    file_get_contents($url);
}

对应用程序缓存预热很有用!

于 2011-05-12T14:59:19.133 回答