Как использовать fsockopen для загрузки URL-адреса из XML-карты сайта - PullRequest
0 голосов
/ 12 мая 2011

Я пытаюсь загрузить каждый URL в файле sitemap.xml, чтобы предварительно их кэшировать и ускорить работу пользователей.

У меня есть следующий код, который берет URL-адреса с карты сайта

$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:

[12-May-2011 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

Я прочитал, что мне нужно: "только имя хоста, а не URL в вызове fsockopen. Вам нужно будет указать 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";
    }

Но я все еще получаю ту же ошибку.

EDIT:

Если я изменю вызов fsockopen на:

$fp = fsockopen ("onlineservices.letterpart.com",80);

тогда я получаю немного другой и лучший, но все же неправильный ответ. кажется, что он игнорирует раздел onlineservices.letterpart.com и пытается http: /// content / НО ... он добавил: /web/ui.xql?action=html&resource=login.html tot конец URL, который является нашей страницей входа в систему, поэтому он должен видеть наш сервер ...

HTTP / 1.1 302 Временно перемещено Дата: чт, 12 мая 2011 г. 14:40:02 GMT Сервер: Jetty / 5.1.12 (Windows 2003 / 5.2 x86 java / 1.6.0_07 Истекает: чт, 1 января 1970 00:00 : 00 GMT Set-Cookie: JSESSIONID = nh62zih3q8mf; Path = / Location: http: ///content/en/FAMILY-201103311115/Family_FLJONLINE_FLJ_2009_07_4/web/ui.xql? Action = html & resource = login.html 1037 *1037* 1037 Длина контента: 0

Спасибо.

1 Ответ

1 голос
/ 12 мая 2011

fsockopen не используется для HTTP-запроса, Керл - лучший выбор (и гораздо более мощный).

Существует также file_get_contents, который может сделать это быстро:

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

Полезно для прогрева кэша приложения!

...