我在共享主机上托管我的网站,最近将服务器更改为安全模式(甚至没有通知)。 我使用从服务器下载文件的功能,使用 readfile()功能(我使用php)。 现在,在safe_mode中,此函数不再可用。 是否有替代或解决方法来处理用户可以下载文件的情况?
由于
答案 0 :(得分:8)
正如我在评论中写的那样,readfile()
被禁用在disable_functions
php.ini 指令中。它与安全模式无关。尝试检查哪些功能被禁用,看看是否可以使用任何其他文件系统函数(-s)来执行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 :(得分:1)
我假设你正在使用readfile
来加载远程文件,正如你所说的“来自服务器”。如果这是正确的,您的问题不是安全模式,但不允许打开具有正常php文件功能的URL(设置allow_url_fopen
已禁用)。
在这种情况下,您可以使用PHP的curl functions下载文件。此外,file_get_contents
是有效的替代方案。