#php #readfile #safe-mode #php-safe-mode
#php #readfile #безопасный режим #php-safe-mode
Вопрос:
Я размещаю свой сайт на общем хостинге, который недавно перевел сервер в безопасный режим (даже не уведомив об этом). Я использую функцию, которая загружает файлы с сервера, используя функцию readfile() (я использую php). Теперь, в safe_mode, эта функция больше недоступна. Есть ли замена или обходной путь, чтобы справиться с ситуацией, когда файл сможет быть загружен пользователем?
Спасибо
Комментарии:
1. Не работает, я уже пробовал это, но я получаю пустой экран Word для файлов .docx или просто ошибку для файлов pdf и т.д.
2. Какое сообщение об ошибке вы получаете? Учитывая, что это
safe_mode
устарело , вы можете захотеть переключить хосты, если они включили его совсем недавно. В любом случае, отправьте своему хостеру электронное письмо с просьбой расслабитьсяsafe_mode
.3. Это не поможет, поскольку они утверждают, что это уменьшает количество взломов серверов, и это общий хостинг, поэтому я мало что могу сделать, чтобы убедить их — это их новая политика, я могу просто сменить хосты, если захочу, но у меня там около 20 сайтов клиентов, и начать перемещать их все сейчас будет головной болью. Интересно, есть ли обходной путь для обработки загрузки файла, об этом чертовом хостинге я подумаю позже, что делать..
4. В этом случае,
readfile()
на самом деле не зависит от безопасного режима. В документах говорится, что файл и каталог должны принадлежать одному и тому же пользователю, который выполняет скрипт, это то, что проверяется в безопасном режиме . В этом случаеreadfile()
полностью отключен, что скорее делаетсяdisable_functions
.5. @Maor, хотя это и не решает проблему, это может направить вас в правильном направлении. Знание причины проблемы является частью решения.
Ответ №1:
Как я писал в комментариях, readfile()
отключается путем включения его в директиву disable_functions
php.ini. Это не имеет ничего общего с безопасным режимом. Попробуйте проверить, какие функции отключены, и посмотрите, можете ли вы использовать любую другую функцию (-ы) файловой системы для выполнения того, что readfile()
делает.
Чтобы просмотреть список отключенных функций, используйте:
var_dump(ini_get('disable_functions'));
Вы могли бы использовать:
// for any file
$file = fopen($filename, 'rb');
if ( $file !== false ) {
fpassthru($file);
fclose($file);
}
// for any file, if fpassthru() is disabled
$file = fopen($filename, 'rb');
if ( $file !== false ) {
while ( !feof($file) ) {
echo fread($file, 4096);
}
fclose($file);
}
// for small files;
// this should not be used for large files, as it loads whole file into memory
$data = file_get_contents($filename);
if ( $data !== false ) {
echo $data;
}
// if and only if everything else fails, there is a *very dirty* alternative;
// this is *dirty* mainly because it "explodes" data into "lines" as if it was
// textual data
$data = file($filename);
if ( $data !== false ) {
echo implode('', $data);
}
Комментарии:
1. Это отключенные функции — «readfile, system, shell_exec, proc_terminate, proc_nice, proc_open, pclose, popen, passthru, pcntl_fork, pcntl_exec, posix_kill, pcntl_signal, ini_restore, posix_getpwuid, escapeshellarg, escapeshellcmd. Я собираюсь попробовать ваши предложения выше
2. ты король! fpassthru, похоже, работает просто отлично. Большое, большое спасибо. Я хотел также проголосовать за это, но я не могу, пока у меня не будет еще 2 баллов репутации (новый пользователь здесь ..)
Ответ №2:
Я предполагаю, что вы используете readfile
для загрузки удаленных файлов, как вы сказали «с сервера». Если это правильно, ваша проблема не в безопасном режиме, а в том, что открытие URL-адресов с помощью обычных функций php-файла больше не разрешено (настройка allow_url_fopen
отключена).
В этом случае вы можете использовать функции curl PHP для загрузки файлов. Кроме того, file_get_contents
является допустимой альтернативой.
Комментарии:
1. Ну, это небольшой плагин, который я использую, который использует функцию readfile () для загрузки файла с сайта (сервера) на компьютер пользователя. Все работало нормально, пока недавно хостинговая компания не включила safe_mode. Это сообщение об ошибке, которое я получаю — Предупреждение>: readfile () был отключен по соображениям безопасности в /home/full/path/to/my/script.php в строке 146