2011-06-13 38 views
2

我在共享主機上託管我的網站,最近它將服務器更改爲安全模式(甚至沒有通知)。 我使用從服務器下載文件的功能,使用readfile()函數(我使用php)。 現在,在safe_mode中,此功能不再可用。 是否有替代方案或解決方法來處理文件將能夠由用戶下載的情況?在安全模式服務器中有沒有替代php的readfile()?

感謝

+0

'的file_get_contents()'? – Teneff 2011-06-13 10:32:54

+0

不工作,我已經嘗試過,但我得到一個空白的Word屏幕的.docx文件,或只是一個錯誤的PDF文件等 – 2011-06-13 10:38:34

+5

更改主機.. – dynamic 2011-06-13 10:43:39

回答

7

正如我在評論中寫的,readfile()被禁用,將其包含在disable_functionsphp.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); 
} 
+0

這些是禁用函數 - 「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。我會嘗試從上面的建議 – 2011-06-13 16:34:59

+0

你是一個國王!fpassthru似乎工作得很好很多很多謝謝我也想投票贊成它但是我不能直到我有2個更多的聲望得分(新用戶在這裏..) – 2011-06-13 16:39:38

1

我假設你正在使用readfile加載遠程文件,如你所說的「從服務器」。如果這是正確的,你的問題不是安全模式,但具有普通php文件功能的開放URL不再被允許(設置allow_url_fopen禁用)。

在這種情況下,您可以使用PHP的curl functions來下載文件。另外,file_get_contents是一個有效的選擇。

+0

那麼,這是一個我使用的小插件,它使用readfile()函數從站點(服務器)下載文件到用戶的PC。直到最近託管公司啓用了safe_mode,它一切正常。這是我得到的錯誤消息 - 警告>:readfile()已被禁用出於安全原因在/home/full/path/to/my/script.php在線146 – 2011-06-13 11:03:29

+0

他一直告訴readfile被禁用 – dynamic 2011-06-13 11:21:21