Работа с удаленными файлами
В случае, если опция allow_url_fopen включена в конфигурационном файле php.ini , вы можете использовать HTTP и FTP ссылки в большинстве функций, принимающих в качестве параметра имя файла. Также вы можете использовать ссылки в операторах include() , include_once() , require() и require_once() (начиная с версии PHP 5.2.0 для корректной работы этих функций должна быть включена опция allow_url_include ). Дополнительную информацию о поддерживаемых в PHP протоколах вы можете найти в Supported Protocols and Wrappers.
Замечание:
В 4.0.3 и более ранних версиях при сборке необходимо использовать опцию —enable-url-fopen-wrapper для активации возможности работать с удаленными файлами.
Замечание:
Дистрибутивы PHP для Windows-платформ до версии 4.3 не поддерживают возможности работы с удаленными файлами для следующих операторов: include() , include_once() , require() , require_once() , и функций вида imagecreatefromXXX в расширении GD and Image Функции.
Например, вы можете использовать это для того, чтобы открыть файл на удаленном сервере, извлечь необходимые вам данные и использовать их в запросе к базе данных или же просто отобразить их в дизайне вашего сайта.
Пример #2 Получение заголовка удаленной страницы
$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 ( 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-авторизация.)
Пример #3 Сохранение данных на удаленном сервере
$file = fopen ( «ftp://ftp.example.com/incoming/outputfile» , «w» );
if (! $file ) echo «
Unable to open remote file for writing.\n» ;
exit;
>
/* Запись данных. */
fwrite ( $file , $_SERVER [ ‘HTTP_USER_AGENT’ ] . «\n» );
fclose ( $file );
?>?php
Замечание:
Глядя на приведенный выше пример, у вас может возникнуть идея использовать эту технику для ведения удаленного лог-файла. К сожалению, это нереализуемо, поскольку попытка записи в уже существующий удаленный файл при помощи функции fopen() приведет к ошибке. В реализации распределенного логирования, возможно, вам поможет функция syslog() .
Allow url fopen что это
Поведение этих функций зависит от установок в php.ini .
| Имя | По умолчанию | Место изменения | Список изменений |
|---|---|---|---|
| allow_url_fopen | «1» | PHP_INI_SYSTEM | |
| allow_url_include | «0» | PHP_INI_SYSTEM | Объявлена устаревшей с версии PHP 7.4.0. |
| user_agent | NULL | PHP_INI_ALL | |
| default_socket_timeout | «60» | PHP_INI_ALL | |
| from | «» | PHP_INI_ALL | |
| auto_detect_line_endings | «0» | PHP_INI_ALL | Объявлена устаревшей с версии PHP 8.1.0. |
| sys_temp_dir | «» | PHP_INI_SYSTEM |
Краткое разъяснение конфигурационных директив.
Данная директива включает поддержку обёрток URL (URL wrappers), которые позволяют работать с объектами URL как с обычными файлами. Обёртки, доступные по умолчанию, служат для работы с удалёнными файлами с использованием ftp или http протокола. Некоторые модули, например, zlib, могут регистрировать собственные обёртки.
Эта опция позволяет использование обёрток fopen, которые поддерживают работу с URL, в функциях include , include_once , require , require_once .
Замечание:
Эта опция требует включения опции allow_url_fopen.
user_agent string
Устанавливает отсылаемую PHP строку «User-Agent».
Значение времени ожидания по умолчанию (в секундах) для потоков, использующих сокеты. Отрицательное значения означает бесконечное время ожидания.
Адрес email, используемый в соединениях FTP без авторизации, а также в качестве значения заголовка From в HTTP соединениях при использовании ftp и http обёрток, соответственно.
Когда данная директива включена, PHP проверяет данные, получаемые функциями fgets() и file() с тем, чтобы определить способ завершения строк (Unix, MS-Dos или Macintosh).
Данная директива позволяет PHP взаимодействовать с системами Macintosh, однако, по умолчанию эта директива выключена, поскольку при её использовании возникает (несущественная) потребность в дополнительных ресурсах для определения символа окончания первой строки, а также потому, что программисты, использующие в системах Unix символы возврата каретки в качестве разделителей, столкнутся с обратно-несовместимым поведением PHP.
Как включить allow_url_fopen на VMBitrix

Что нужно сделать, для именения значения директивы allow_url_fopen = Off на allow_url_fopen = On на VMBitrix, которая собрана на CentOS:
- Зайти на сервер SFTP клиентом или по SSH c root правами
- Открыть конфигурационный файл /etc/php.d/bitrixenv.ini
- Найти allow_url_fopen и изменить значение на On
- Перезагрузить Apache. В командной строке выполните service httpd restart
- Проверить, что директива изменила значение можно в /bitrix/admin/phpinfo.php
allow_url_fopen на виртуальном хостинге: добро или зло?
Приветствую всех!
Держу сайты на двух разных виртуальных хостингах (не VPS, а shared hosting). Сайты на лёгких CMS с открытым кодом. Когда количество сайтов превысило количество пальцев, решил сделать так, чтобы сайты сами апдейтились. Для автоапдейта необходимы опции: cURL включён, safe_mode выключен, open_basedir выключен, allow_url_fopen включён. И столкнулся с тем, что один хостер «из соображений безопасности» не даёт включить в моём php.ini опцию allow_url_fopen. Другой хостер даёт и автоапдейт работает. На вопрос отвечает, конечно же: наплюй и неси все сайты ко мне – у нас всё чётко.
Не знаю, кому из них верить (в рнр настолько не разбираюсь). Более того, предполагаю околорелигиозную тематику. Поэтому: прошу вашего мнения. И, пожалуйста, не холиварьте;)
ап> суть вопроса: включённый allow_url_fopen это дыра или нет, если да, как эффективно закрывается и почему первый хостер предпочитает не позволять, чем закрывать дыру.