2010-05-24 72 views
53

我想用PHP來創建一個文件,但它不工作。我假設這是因爲它沒有寫權限(以前一直是問題)。我試圖通過製作文件夾chmod 0777來測試這是否是問題,但是最終導致該目錄中的每個腳本都返回500錯誤消息,直到我將其更改回來。 如何給我的文件系統PHP寫入權限,以便創建一個文件?如何讓PHP可以寫入目錄?

編輯:它使用Apache託管在Hostgator共享主機上。

編輯2:有人問代碼: 該代碼是GD圖像腳本。我知道其餘的工作,因爲以前我每次ime被稱爲創建圖像。現在我試圖在添加新文本時創建它們並將它們保存到文件夾中。我寫的代碼是: imagejpeg(null,$ file,85);

我還創建了一個測試文件,以檢查它是否只是一個破碎的腳本(主要來自tizag複製): http://gearboxshow.info/rkr/lesig.jpg/testfile.txt(我不知道是否/如何正確地在這裏發佈的代碼這裏的內容。 PHP腳本,減去PHP標籤。)

它返回13,13,1(單獨的行),所以它看起來好像它認爲它寫了東西,但testfile.txt是空白的(我上傳了一個空白的),或不存在(如果我刪除它)。

編輯3:服務器運行CentOS。

+0

這是你控制或者你是一個共享的服務器上的服務器? – webbiedave 2010-05-24 22:13:51

+0

你使用的是Apache嗎? – Elijah 2010-05-24 22:16:44

+0

Hostgator共享主機。 Apache的。 – 2010-05-24 22:20:19

回答

43

一個非常簡單的方法是讓PHP首先創建目錄本身。

<?php 
$dir = 'myDir'; 

// create new directory with 744 permissions if it does not exist yet 
// owner will be the user/group the PHP script is run under 
if (!file_exists($dir)) { 
    $oldmask = umask(0); // helpful when used in linux server 
    mkdir ($dir, 0744); 
} 

file_put_contents ($dir.'/test.txt', 'Hello File'); 

這可以爲您節省麻煩的權限。

+2

那就對了。您可以修改權限以滿足您的需求。 – favo 2010-05-24 23:52:23

+6

這是最簡單的解決方案,雖然你不應該在apache上使用777,因爲它被配置爲阻止這些文件。 – vdbuilder 2011-12-02 19:04:57

+3

製作目錄時,我獲得了拒絕權限! – maxisme 2016-05-13 17:36:42

3

您可以使用PHP的chmod()更改文件夾的權限。有關如何使用命令的更多信息如下:http://php.net/manual/en/function.chmod.php

如果在將權限設置爲777(世界可寫)時出現500錯誤,則表示您的服務器已設置爲阻止執行此類文件。這是出於安全原因而完成的。在這種情況下,您將需要使用755作爲文件的最高權限。

如果在執行PHP文檔的文件夾中生成了error_log文件,則需要查看最後幾個條目。這會讓你知道腳本失敗的地方。

有關PHP文件操作的幫助,我使用http://www.tizag.com/phpT/filewrite.php作爲資源。

+0

默認情況下,該文件夾當前已設置爲0755。 我從來沒有想過檢查error_log,但我只是做了,它沒有包含任何關於它無法生成文件的原因。 – 2010-05-24 22:30:22

+0

發佈您遇到問題的代碼可能是個好主意。有時我使用一個很好的資源來處理文件處理程序語法幫助,它是http://www.tizag.com/phpT/filewrite.php。 – 2010-05-24 22:37:02

+0

用編碼編輯主文章。 – 2010-05-24 22:50:38

29

將目錄的所有者設置爲運行apache的用戶。通常在Linux上

chown nobody:nobody <dirname> 

沒有人這樣你的文件夾將不被世界可寫的,但還是可寫的Apache :)

+4

如果您使用Ubuntu,則此用戶和組不存在。任何建議,以完成你在這裏做什麼呢? – 2011-11-09 07:55:30

+13

@BrandonMinton'chown www-data:www-data '應該這樣做。 www-data是基於debian的系統上的apache用戶 – 2011-11-14 04:56:48

+0

你好,你說需要'chown nobody:nobody '我在哪裏編碼? – guitarlass 2012-05-17 07:50:06

2

我發現,與HostGator的你要的文件CMOD 644和文件夾設置爲755 。由於我是基於他們的技術支持,所以它與HostGator配合使用

1

chmod不允許您設置文件的所有權。要設置文件的所有權,您必須使用chown命令。

1

我有同樣的問題:

因爲我是不願意給0777到我的PHP目錄,我創建權0777,在那裏我創建我需要寫文件tmp目錄。

我的php目錄繼續受到保護。如果有人篡改tmp目錄,該網站將繼續照常運作。

1

您可以將selinux設置爲允許以便分析。

# setenforce 0 

Selinux會記錄但允許進入。所以你可以檢查/var/log/audit/audit.log的細節。也許你會需要改變selinux上下文。請記住,您將使用chcon命令。如果您需要,請告訴我們您的audit.log以獲得更詳細的答案。

不要忘記在解決問題後啓用selinux。它最好保持selinux的執行。

# setenforce 1 
1
在給予一個目錄的寫訪問

最佳方式..

$dst = "path/to/directory"; 
mkdir($dst); 
chown($dst, "ownername"); 
chgrp($dst, "groupname"); 
exec ("find ".$dst." -type d -exec chmod 0777 {} +"); 
6

1找出哪些用戶正在使用下面的命令

ps aux | grep httpd 

你會得到一個擁有幾個httpd進程線路響應如下:

phpuser 17121 0.0 0.2 414060 7928 ?  SN 03:49 0:00 /usr/sbin/httpd 

第1列顯示用戶名。所以,現在你知道是誰試圖寫入文件的用戶,這是在這種情況下phpuser 現在,您可以繼續設置權限的目錄,你的PHP腳本正在嘗試寫一些東西:

sudo chown phpuser:phpuser PhpCanWriteHere 
sudo chmod 755 PhpCanWriteHere 
0

我運行Ubuntu,如上所述沒有人:沒有人不在Ubuntu上工作。你的錯誤:

chown: invalid group: 'nobody:nobody' 

相反,你應該使用「nogroup」,如:

chown nobody:nogroup <dirname>