Самый простой способ захватить файл удаленного файла в PHP?
Я думал о том, чтобы сделать запрос на голову с помощью cURL, было интересно, не так ли это?
Solutions Collecting From Web of «Самый простой способ захватить файл удаленного файла в PHP?»
Да. Поскольку файл удален, вы полностью зависите от значения заголовка Content-Length (если вы не хотите загрузить весь файл). Вам нужно будет curl_setopt($ch, CURLOPT_NOBODY, true) и curl_setopt($ch, CURLOPT_HEADER, true) .
Лучшее решение, которое следует принципу KISS
$head = array_change_key_case(get_headers("http://example.com/file.ext", TRUE)); $filesize = $head['content-length'];
Я предполагаю, что использование curl для отправки запроса HEAD – хорошая возможность; что-то вроде этого, вероятно, будет:
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://sstatic.net/so/img/logo.png'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_NOBODY, true); curl_exec($ch); $size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD); var_dump($size);
Таким образом, вы используете запрос HEAD и не загружаете весь файл. Тем не менее, вы полагаетесь на удаленный сервер, отправляете правильный заголовок Content-length.
Другим вариантом, о котором вы могли подумать, было бы использовать filesize … Но это не удастся : в документации указано (цитирование) :
Начиная с PHP 5.0.0, эта функция также может использоваться с некоторыми обертками URL. См. Список поддерживаемых протоколов / Wrappers для списка, в которых обертки поддерживают семейство функций stat ().
И, к сожалению, с обертками HTTP и HTTPS , stat() не поддерживается …
Если вы попытаетесь, вы получите сообщение об ошибке:
Warning: filesize() [function.filesize]: stat failed for http://sstatic.net/so/img/logo.png
Использование запроса HEAD и проверка Content-Length – это стандартный способ сделать это, но вы не можете полагаться на него в целом, так как сервер может его не поддерживать. Заголовок Content-Length является необязательным, и, кроме того, сервер может даже не реализовать метод HEAD. Если вы знаете, какой сервер вы исследуете, то вы можете проверить, работает ли он, но в качестве общего решения оно не является доказательством пули.
Если вам не нужен пуленепробиваемый раствор, вы можете просто сделать:
strlen(file_get_contents($url));
Работа с удалёнными файлами
В случае, если опция allow_url_fopen включена в конфигурационном файле php.ini , вы можете использовать URL-адреса HTTP и FTP в большинстве функций, принимающих в качестве параметра имя файла. Также вы можете использовать ссылки в операторах include , include_once , require и require_once (для корректной работы этих функций должна быть включена опция allow_url_include). Дополнительную информацию о поддерживаемых в PHP протоколах вы можете найти в Поддерживаемые протоколы и обёртки.
Например, вы можете использовать это для того, чтобы открыть файл на удалённом сервере, извлечь необходимые вам данные и использовать их в запросе к базе данных или же просто отобразить их в дизайне вашего сайта.
Пример #1 Получение заголовка удалённой страницы
$file = fopen ( «http://www.example.com/» , «r» );
if (! $file ) echo «
Невозможно открыть удалённый файл.\n» ;
exit;
>
while (! feof ( $file )) $line = fgets ( $file , 1024 );
/* Сработает, только если заголовок и сопутствующие теги расположены в одной строке */
if ( preg_match ( «@\(.*)\@i» , $line , $out )) $title = $out [ 1 ];
break;
>
>
fclose ( $file );
?>?php
Вы также можете работать с удалёнными файлами, расположенными на FTP-сервере (подразумевается, что вы авторизовались с необходимыми для этого привилегиями). Таким образом вы можете только создавать новые файлы, но попытка перезаписать существующий файл при помощи функции fopen() приведёт к ошибке.
Для того, чтобы авторизоваться под пользователем, отличным от ‘anonymous’, вам необходимо указать логин (и, возможно, пароль) в адресной строке, например так: ‘ ftp://user:password@ftp.example.com/path/to/file ‘. (Вы можете использовать этот же синтаксис для доступа к удалённым файлам по HTTP -протоколу, если необходима Basic-аутентификация.)
Пример #2 Сохранение данных на удалённом сервере
$file = fopen ( «ftp://ftp.example.com/incoming/outputfile» , «w» );
if (! $file ) echo «
Невозможно перезаписать удалённый файл.\n» ;
exit;
>
/* Запись данных. */
fwrite ( $file , $_SERVER [ ‘HTTP_USER_AGENT’ ] . «\n» );
fclose ( $file );
?>?php
Замечание:
Глядя на приведённый выше пример, у вас может возникнуть идея использовать эту технику для ведения удалённого лог-файла. К сожалению, это нереализуемо, поскольку попытка записи в уже существующий удалённый файл при помощи функции fopen() приведёт к ошибке. В реализации распределённого логирования, возможно, вам поможет функция syslog() .
User Contributed Notes
- Отличительные особенности
- HTTP-аутентификация в PHP
- Cookies
- Сессии
- Работа с XForms
- Загрузка файлов на сервер
- Работа с удалёнными файлами
- Работа с соединениями
- Постоянные соединения с базами данных
- Использование PHP в командной строке
- Сборка мусора
- Динамическая трассировка DTrace
Использование удалённых/remote файлов
Если поддержка «URL fopen-оболочки/wrapper» включена при конфигурировании PHP (если вы только не передали явным образом флаг —disable-url-fopen-wrapper для конфигурирования (для версий, новее 4.0.3) или не установили allow_url_fopen в off в файле php.ini (для более новых версий)), вы можете использовать HTTP и FTP- URL’ы с большинством функций, которые принимают filename/имя файла в качестве параметра, в том числе — операторы require() и include().
Примечание: Windows-версия PHP в настоящее время не поддерживает удалённый доступ к файлам для следующих функций: include(), include_once(), require() require_once().
Например, вы можете использовать это для того, чтобы открыть файл на удалённом web-сервере, разобрать вывод данных, а затем использовать эти данные в запросе к БД или просто вывести их в стиле вашего web-сайта.
Пример: Получение названия/title удалённой страницы
Unable to open remote file. "; exit; > while (!feof ($file)) < $line = fgets ($file, 1024); /* Это будет работать, только если title и его тэги расположены в одной строчке */ if (eregi ("", $line, $out)) < $title = $out[1]; break; >> fclose($file); ?>
Вы можете также записывать в файлы по FTP, если соединены как пользователь с корректными правами доступа и если файл ещё не существует. Для соединения как любой пользователь, кроме ‘anonymous’, вам необходимо специфицировать username (и, возможно, password) в URL, как, например: ‘ftp://user:password@ftp.example.com/path/to/file’. (Вы можете использовать тот же синтаксис для доступа к файлам по HTTP, если необходима Basic-аутентификация.)
Пример: Сохранение данных на удалённом сервере
Unable to open remote file for writing. "; exit; > /* Здесь записываются данные. */ fputs ($file, $_SERVER['HTTP_USER_AGENT'] . " "); fclose ($file); ?>
Примечание: из этого примера у вас может возникнуть идея использовать эту технику для записи в удалённый log, но, как указано выше, вы можете записывать только в новый файл с использованием оболочек URL fopen(). Для выполнения распределённого логинга, вроде этого, вы должны просмотреть syslog().
Работа с удаленными файлами
В случае, если опция allow_url_fopen включена в конфигурационном файле php.ini , вы можете использовать HTTP и FTP ссылки в большинстве функций, принимающих в качестве параметра имя файла. Также вы можете использовать ссылки в операторах include , include_once , require и require_once (начиная с версии PHP 5.2.0 для корректной работы этих функций должна быть включена опция allow_url_include ). Дополнительную информацию о поддерживаемых в PHP протоколах вы можете найти в Поддерживаемые протоколы и обработчики (wrappers).
Например, вы можете использовать это для того, чтобы открыть файл на удаленном сервере, извлечь необходимые вам данные и использовать их в запросе к базе данных или же просто отобразить их в дизайне вашего сайта.
Пример #1 Получение заголовка удаленной страницы
$file = fopen ( «http://www.example.com/» , «r» );
if (! $file ) echo «Невозможно открыть удаленный файл.\n» ;
exit;
>
while (! feof ( $file )) $line = fgets ( $file , 1024 );
/* Сработает, только если заголовок и сопутствующие теги расположены в одной строке */
if ( preg_match ( «@\(.*)\@i» , $line , $out )) $title = $out [ 1 ];
break;
>
>
fclose ( $file );
?>?phpВы также можете работать с удаленными файлами, расположенными на FTP-сервере (подразумевается, что вы авторизовались с необходимыми для этого привилегиями). Таким образом вы можете только создавать новые файлы, но попытка перезаписать существующий файл при помощи функции fopen() приведет к ошибке.
Для того, что бы авторизоваться под пользователем, отличным от ‘anonymous’, вам необходимо указать логин (и, возможно, пароль) в адресной строке, например так: ‘ftp://user:password@ftp.example.com/path/to/file‘. (Вы можете использовать этот же синтаксис для доступа к удаленным файлам по HTTP -протоколу, если необходима Basic-авторизация.)
Пример #2 Сохранение данных на удаленном сервере
$file = fopen ( «ftp://ftp.example.com/incoming/outputfile» , «w» );
if (! $file ) echo «Невозможно перезаписать удаленный файл.\n» ;
exit;
>
/* Запись данных. */
fwrite ( $file , $_SERVER [ ‘HTTP_USER_AGENT’ ] . «\n» );
fclose ( $file );
?>?phpЗамечание:
Глядя на приведенный выше пример, у вас может возникнуть идея использовать эту технику для ведения удаленного лог-файла. К сожалению, это нереализуемо, поскольку попытка записи в уже существующий удаленный файл при помощи функции fopen() приведет к ошибке. В реализации распределенного логирования, возможно, вам поможет функция syslog() .
Работа с удаленными файлами
В случае, если опция allow_url_fopen включена в конфигурационном файле php.ini, вы можете использовать HTTP и FTP ссылки в большинстве функций, принимающих в качестве параметра имя файла. Также вы можете использовать ссылки в операторах include(), include_once(), require() и require_once(). Дополнительную информацию о поддерживаемых в PHP протоколах вы можете найти в List of Supported Protocols/Wrappers.
Замечание: В 4.0.3 и более ранних версиях при сборке необходимо использовать опцию —enable-url-fopen-wrapper для активации возможности работать с удаленными файлами.
Замечание: Дистрибутивы PHP для Windows-платформ до версии 4.3 не поддерживают возможности работы с удаленными файлами для следующих операторов: include(), include_once(), require(), require_once(), и функций вида imagecreatefromXXX (GD Функции).
Например, вы можете использовать это для того, чтобы открыть файл на удаленном сервере, извлечь необходимые вам данные и использовать их в запросе к базе данных или же просто отобразить их в дизайне вашего сайта.
Пример 1 Получение заголовка удаленной страницы
$file = fopen ("http://www.example.com/", "r"); if (!$file) < echo "
Unable to open remote file.\n"; exit; > while (!feof ($file)) < $line = fgets ($file, 1024); /* Сработает, только если заголовок и сопутствующие теги расположены в одной строке */ if (eregi ("", $line, $out)) < $title = $out[1]; break; >> fclose($file);
Вы также можете работать с удаленными файлами, расположенными на FTP-сервере (подразумевается, что вы авторизировались с необходимыми для этого привилегиями). Таким образом вы можете создавать новые файлы, но попытка перезаписать существующий файл при помощи функции fopen() приведет к ошибке.
Для того, что бы авторизироваться под пользователем, отличным от ‘anonymous’, вам необходимо указать логин (и, возможно, пароль) в адресной строке, например так: ‘ftp://user:password@ftp.example.com/path/to/file’. (Вы можете использовать этот же синтаксис для доступа к удаленным файлам по HTTP-протоколу, если необходима Basic-авторизация.)
Пример 2 Сохранение данных на удаленном сервере
$file = fopen ("ftp://ftp.example.com/incoming/outputfile", "w"); if (!$file) < echo "
Unable to open remote file for writing.\n"; exit; > /* Запись данных. */ fputs ($file, $_SERVER['HTTP_USER_AGENT'] . "\n"); fclose ($file);
Замечание: Глядя на приведенный выше пример, у вас может возникнуть идея использовать эту технику для ведения удаленного лог-файла. К сожалению, это не реализуемо, поскольку попытка записи в уже существующий удаленный файл при помощи функции fopen() приведет к ошибке. В реализации распределенного логирования, возможно, вам поможет функция syslog().