如何使用 fsockopen 从 xml 站点地图加载 URL


How to use fsockopen to load a url from an xml 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";
    }
}

但这给了我每个 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);
}

用于应用程序缓存预热!