2010-10-31 23 views
5

Tập lệnh PHP sau không thể tạo thư mục. Nó cũng sẽ không tạo được tệp (khi thư mục đã tồn tại).PHP mkdir() và fopen() không hoạt động - vấn đề quyền? umask vấn đề?

ini_set('error_reporting', E_ALL); 

define('ABSPATH', $_SERVER['DOCUMENT_ROOT']); 
echo ABSPATH . '<br /><br />'; 

$dir_to_make = ABSPATH . '/aaatest'; 
$file_to_make = ABSPATH . '/aaatest/aaatest.txt'; 

echo umask() . '<br />'; 

mkdir($dir_to_make) or die('could not create directory'); 
fopen($file_to_make) or die('could not open/create file'); 

umask() trả về giá trị là 18. Gốc tài liệu có dấu chấm (/var/www/blah/websitename.com/httpdocs).

Tôi không hoàn toàn hiểu umask(), cũng như tôi không chắc chắn về cách sử dụng đúng cách. Tôi không biết đó có phải là vấn đề hay không, nhưng dường như nó có khả năng xảy ra. Tôi có nên thay đổi umask, tạo tệp/thư mục, sau đó thay đổi lại không? Umask nên thay đổi/tạo/chỉnh sửa tập tin/thư mục là gì? Máy chủ có nên được định cấu hình khác không?

+0

thông báo lỗi mà php đang tạo là gì? nếu nó không in ra dòng html, thì nó sẽ nằm trong nhật ký máy chủ. – Lee

+0

PHP Cảnh báo: mkdir() [function.mkdir]: Quyền bị từ chối trong /var/www/blah/websitename.com/httpdocs/aaa.php trên dòng 13 – matthewpavkov

+0

Tôi cũng nên thêm điều đó trên máy chủ này, trong cùng một tài khoản, tôi có cài đặt đầy đủ Wordpress, đang chạy tốt (tải lên tệp, cập nhật plugin, v.v.). – matthewpavkov

Trả lời

6

Để tạo một tập tin trong thư mục gốc tài liệu, quy trình PHP của bạn phải có quyền ghi vào thư mục. Thông thường (nhưng không phải lúc nào) PHP chạy như cùng một người dùng mà máy chủ web chạy như. Tên của người dùng này sẽ khác nhau với các hệ thống khác nhau. Trên Ubuntu và Debian, người dùng được gọi là www-data, trên các hệ thống khác có thể chỉ là www hoặc apache hoặc apache2. Trên một số hệ thống, có thể là root.

Bạn có thể tìm hiểu xem người dùng của bạn chạy PHP bằng cách kiểm tra giá trị của máy chủ superglobal: $_SERVER['USER']. phpinfo() cung cấp một cách dễ dàng để xem các nội dung như thế này. Thông thường, người dùng PHP giống với người dùng máy chủ web (nhưng không phải lúc nào).

quyền sở hữu và quyền của thư mục cài đặt là một chủ đề khác hoàn toàn - phụ thuộc vào hệ điều hành bạn đang truy cập, quyền truy cập và quyền bạn có đối với máy chủ và nhiều nội dung khác. Nếu bạn cần các gợi ý về điều này, bạn có thể start at serverfault.com.

chúc may mắn.


[sửa] OK, nếu bạn đang runing như apache, và bạn đang cố gắng để tạo thư mục mới trong /var/www/blah/mydomain.com/htdocs/ ... sau đó khi bạn chạy:

> ls -splad /var/www/blah/mydomain.com/htdocs 

bạn muốn mong đợi để xem một cái gì đó như:

4 drwxr-xr-x 2 apache apache 4096 2010-07-22 20:54 /var/www/blah/mydomain.com/htdocs/ 

có hai phần thú vị:

drwxr-xr-x có nghĩa là: d = thư mục; rwx = người dùng đã đọc, viết, eXecute; r-x = nhóm chỉ đọc và eXecute; r-x = mọi người chỉ đọc và eXecute.

apache apache - tên đầu tiên là tên của người dùng sở hữu tệp/thư mục, tên thứ hai là tên của nhóm sở hữu tệp/thư mục.

vì vậy nếu bạn thấy một cái gì đó như thế này:

4 drwxr-xr-x 2 root apache 4096 2010-07-22 20:54 /var/www/blah/mydomain.com/htdocs/ 

nó sẽ không làm việc vì mục được sở hữu bởi root (không apache), và mặc dù nó được phân nhóm theo apache, thư mục không phải là nhóm có thể ghi để không cắt nó. Trong trường hợp này, bạn có thể chỉ cần thêm nhóm viết perms (chmod g+w /var/www/blah/mydomain.com/htdocs), và bạn tốt để đi.

Cái gì khác bạn có thể thấy là:

4 drw-r-xr-x 2 apache apache 4096 2010-07-22 20:54 /var/www/blah/mydomain.com/htdocs/ 

Trong trường hợp này, quyền sở hữu là ok, nhưng thư mục không ghi được bởi chủ nhân của nó. Bạn có thể sửa lỗi này bằng cách thêm quyền ghi cho chủ sở hữu chmod u+w /var/www/blah/mydomain.com/htdocs.

có rất nhiều biến thể khác, nhưng có thể điều này sẽ hữu ích.

+0

Vâng, nó đang chạy như apache. – matthewpavkov

+0

ok, hãy xem bản chỉnh sửa gần đây của tôi để biết thông tin cụ thể cho người dùng 'apache' – Lee

+0

oh và umask không quan trọng - nó kiểm soát các quyền sẽ được cung cấp theo mặc định cho các thư mục bạn tạo. Nhưng nó không kiểm soát hay không bạn có thể tạo một thư mục hoặc tập tin. Tập trung vào việc tạo tập lệnh của bạn để tạo thư mục bên trong doc-root. một khi bạn đã làm việc, sau đó thêm việc tạo ra các tập tin. Nếu bạn có thể tạo thư mục, nhưng sau đó bạn không thể tạo tệp, sau đó chúng ta sẽ nói về umask. ;-) – Lee

2

Bạn cần cung cấp 2 đối số để fopen. Hãy thử thay đổi

fopen($file_to_make) or die('could not open/create file'); 

để

fopen($file_to_make,'w') or die('could not open/create file'); 
+0

Không, tính năng này không hoạt động. – matthewpavkov

+0

Kiểm tra các quyền trên thư mục. – lbedogni

Các vấn đề liên quan