[英]PHP: fopen() Permission denied
我對這段代碼感到困惑:
測試.php:
fopen('test.txt','a+');
當我執行它時,我得到一個錯誤:
Warning: fopen(test.txt): failed to open stream:
Permission denied in /var/www/html/yuelu3/mobile/text.php on line 2
測試.txt:
-rwxrwxrwx. 1 jt jt 87 10月 7 20:58 test.txt
問題出在哪里?
非常感謝!我找到了問題,我用FC13,因為SELinux的保護,一些動作被拒絕了。所以,我只需要擺脫保護。
此問題也可能是啟用 SELinux 的結果。 這可以使用以下方法解決:
chown -R apache:apache /var/www/html/directory_to_write
chcon -R -t httpd_sys_content_t /var/www/html/directory_to_write
chcon -R -t httpd_sys_rw_content_t /var/www/html/directory_to_write
編輯:
您可以在https://web.archive.org/web/20150927091100/https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Managing_Confined_Services/sect-Managing_Confined_Services-The_Apache_HTTP_Server找到舊的解釋-Types.html或https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/managing_confined_services/sect-managing_confined_services-the_apache_http_server-types
嘗試
fopen('/path/to/file/test.txt','a+');
作為
fopen('test.txt','a+');
很可能在另一個目錄中查找
嘗試使用 PHP 在服務器上寫入文件時,我收到了相同的錯誤“無法打開流。權限被拒絕”。 我嘗試了互聯網上的所有方法來修復錯誤。 我將服務器上的文件、目錄和子目錄的所有權更改為“apache”,我對所有文件、目錄、子目錄執行了chmod 777
,我運行了restorecon -R
,我運行了chcon unconfined_u:object_r:httpd_user_content_t:s0
在所有文件上,但似乎唯一有效的方法是完全關閉 SELinux。
我終於解決了這個問題。 問題在於 SELinux 使用的布爾參數。 我執行了以下命令來獲取與 httpd 相關的所有布爾值的列表。
$ getsebool -a | grep httpd
這給出了大約 36 個參數的列表。
我痛苦地使用 setsebool 命令打開了每個布爾值,直到“無法打開流。權限被拒絕”錯誤消失。
當我“打開” httpd_unified 布爾值時,錯誤消失了!! 當我將其“關閉”時,錯誤又回來了!
使用fopen($_SERVER['DOCUMENT_ROOT'].'test.txt','a+');
嘗試打開文件時,路徑總是會導致問題。 當您嘗試打開文件時,避免出現任何問題的一種簡單方法是檢查您所在的目錄以及調用的位置。
echo getcwd();
創建一個簡單的 PHP 頁面並調用打印當前目錄。 將 PHP 頁面拖放到與文件相同的目錄中,它會告訴您文件夾的正確路徑,然后只需添加 /filename.xxx。
檢查文件的 SELinux 上下文模式以確保將其設置為:httpd_user_content_t
...如果不是,請使用:
chcon httpd_user_content_t test.txt
...糾正問題。
我正在使用 Apache HTTP 服務器 v2.4,我認為以下方法適用於 linux 上的大多數人:
首先檢查誰是運行“httpd”的用戶。
在我的情況下它是daemon
,我不確定是否每個人都是這樣。 你可以這樣做:
ps -ef | grep 'httpd'
一旦您確定用戶daemon
是進程httpd
的所有者,請更改您希望寫入權限的文件夾的所有者deamon
sudo chown daemon /path/to/folder
這只會改變用戶,該目錄的組保持不變。 如果您希望該組也能夠寫入,請確保它具有寫入權限
sudo chmod g+w /path/to/folder
就我而言,這些步驟幫助了我:
ps -ef
驗證進程用戶UID PID PPID C STIME TTY TIME CMD
www-data 18 1 0 15:43 pts/0 00:00:00 apache2 -DFOREGROUND
chown -R www-data:www-data /var/www/html/
在運行某些版本的 PHP 的 Docker 中完美運行,但是當我切換到 Xampp 進行快速測試時(因為 MySQL 實際上在 Xampp 中開箱即用運行得更快)它停止工作。 所以這解決了任務,只包括文件的實際路徑。 這很可能只是由於不同的環境變量在不同的版本和設置中有所不同。
$filepath = __DIR__ . DIRECTORY_SEPARATOR;
$in = fopen($filepath . 'test.txt','a+');
在我的情況下,原因是:文件的“0644”權限而不是“0777”(從另一個主機移動后)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.