Разработчику. Сборник рецептов PHP
Задавайте вопросы

Получение содержимого URL методом GET

Вернуться назад

Задача

Необходимо получить содержимое URL. Например, требуется вставить часть одной веб-страницы в содержимое другой страницы.

Решение

Передайте URL функции fopen() и получите содержимое страницы с помощью функции fread():

$page = '';
$fh = fopen('http://www.example.com/robots.txt','r') or die($php_errormsg);
while (! feof($fh)) {
    $page .= fread($fh,1048576);
}
fclose($fh);

Можно прибегнуть к расширению c URL:

$c = curl_init('http://www.example.com/robots.txt');
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
$page = curl_exec($c);
curl_close($c);

А можно применить классHTTP_Request из PEAR:

require 'HTTP/Request.php';

$r = new HTTP_Request('http://www.example.com/robots.txt');
$r >sendRequest();
$page = $r->getResponseBody();

Обсуждение

Для того чтобы получить доступ к защищенной странице, можно поместить имя пользователя и пароль в URL. В приведенном ниже примере имя пользователя – david, а пароль – hax0r. Покажем, как это сделать с помощью функции fopen():

$fh = fopen('http://david:hax0r@www.example.com/secrets.html','r')
    or die($php_errormsg);
while (! feof($fh)) {
    $page .= fread($fh,1048576);
}
fclose($fh);

Ниже показано, как это выполнить, применяя расширение c URL:

$c = curl_init('http://www.example.com/secrets.html');
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_USERPWD, 'david:hax0r');
$page = curl_exec($c);
curl_close($c);

Теперь посмотрим, как это сделать с помощью класса HTTP_Request:

$r = new HTTP_Request('http://www.example.com/secrets.html');
$r->setBasicAuth('david','hax0r');
$r->sendRequest();
$page = $r->getResponseBody();

Функция fopen() следует переадресациям, определенным в заголовках ответа Location, а класс HTTP_Request этого не делает. Расширение c URL подчиняется им, только если установлен параметр CURLOPT_FOLLOWLOCATION:

$c = curl_init('http://www.example.com/directory');
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1);
$page = curl_exec($c);
curl_close($c);

Расширение c URL может делать некоторые другие вещи с извлеченной страницей. Если установлен параметр CURLOPT_RETURNTRANSFER, то функция curl_exec() возвращает строку, содержащую полученную страницу:

$c = curl_init('http://www.example.com/files.html');
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
$page = curl_exec($c);
curl_close($c);

Для записи извлеченной страницы в файл откройте дескриптор файла на запись с помощью функции fopen() и установите для этого дескриптора файла параметр CURLOPT_FILE:

$fh = fopen('local-copy-of-files.html','w') or die($php_errormsg);
$c = curl_init('http://www.example.com/files.html');
curl_setopt($c, CURLOPT_FILE, $fh);
curl_exec($c);
curl_close($c);

Чтобы передать ресурсы c URL и содержимое полученной страницы в функцию, установите значение параметра CURLOPT_WRITEFUNCTION равным имени этой функции:

// сохраняем URL и содержимое страницы в базу данных
function save_page($c,$page) {
    $info = curl_getinfo($c);
    mysql_query("INSERT INTO pages (url,page) VALUES ('" .
        mysql_escape_string($info['url']) . "', '" .
        mysql_escape_string($page) . "')");
}
$c = curl_init('http://www.example.com/files.html');
curl_setopt($c, CURLOPT_WRITEFUNCTION, 'save_page');
curl_exec($c);
curl_close($c);

Если ни один из параметров CURLOPT_RETURNTRANSFER, CURLOPT_FILE или CURLOPT_WRITEFUNCTION не установлен, то расширение c URL выводит содержимое возвращенной страницы.

Функция fopen() вместе с параметрами include и require может получать доступ к удаленным файлам, только если доступ к таковым разрешен. А по умолчанию он разрешен и управляется с помощью параметра настройки allow_url_fopen. Однако в Windows опции include и require не дают возможности извлекать удаленные файлы в версиях PHP более ранних, чем 4.3, даже если параметр allow_url_fopen установлен в on.

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования

Рейтинг Сайтов ДОСКИ.РУ