Tôi cố gắng để tạo ra một thư mục có chức năng mkdir PHP nhưng tôi nhận được một lỗi như sau: Warning: mkdir() [function.mkdir]: Permission denied in ...
. Làm thế nào để giải quyết vấn đề?
Tôi cố gắng để tạo ra một thư mục có chức năng mkdir PHP nhưng tôi nhận được một lỗi như sau: Warning: mkdir() [function.mkdir]: Permission denied in ...
. Làm thế nào để giải quyết vấn đề?
Câu trả lời:
Tôi biết đây là một chủ đề cũ, nhưng nó cần một câu trả lời tốt hơn. Bạn không cần phải đặt quyền thành 777, đó là một vấn đề bảo mật vì nó cấp quyền truy cập đọc và ghi cho thế giới. Có thể người dùng apache của bạn không có quyền đọc / ghi trên thư mục.
Đây là những gì bạn làm trong Ubuntu
Đảm bảo rằng tất cả các tệp đều thuộc sở hữu của nhóm Apache và người dùng. Trong Ubuntu, nó là nhóm dữ liệu www và người dùng
chown -R www-data:www-data /path/to/webserver/www
Tiếp theo, cho phép tất cả các thành viên của nhóm dữ liệu www đọc và ghi tệp
chmod -R g+rw /path/to/webserver/www
Hàm php mkdir()
bây giờ sẽ hoạt động mà không trả về lỗi
/opt/lampp/htdocs/www/my-app/public/uploads
.. Về cơ bản những gì tôi đang cố gắng làm là mọi người dùng đã đăng nhập tải lên tệp bên trong thư mục tải lên và cũng tạo thư mục album (điều này sẽ được thực hiện với php) để lưu trữ ảnh ..
Câu trả lời muộn cho những người tìm thấy điều này qua google trong tương lai. Tôi đã gặp phải vấn đề tương tự.
LƯU Ý: TÔI ĐANG TRÊN MAC OSX LION
Điều xảy ra là apache đang được chạy với tư cách người dùng "_www" và không có quyền chỉnh sửa bất kỳ tệp nào. Bạn sẽ nhận thấy KHÔNG có chức năng hệ thống tệp nào hoạt động thông qua php.
Làm thế nào để khắc phục:
Mở cửa sổ công cụ tìm kiếm và từ thanh menu, chọn Đi> Đi tới Thư mục> / private / etc / apache2
bây giờ hãy mở httpd.conf
tìm thấy:
User _www
Group _www
thay đổi tên người dùng:
User <YOUR LOGIN USERNAME>
Bây giờ khởi động lại apache bằng cách chạy thiết bị đầu cuối biểu mẫu này:
sudo apachectl -k restart
Nếu nó vẫn không hoạt động, tôi tình cờ làm như sau trước khi tôi làm ở trên. Có thể liên quan.
Mở terminal và chạy các lệnh sau: (lưu ý, tệp máy chủ web của tôi được đặt tại / Library / WebServer / www. Thay đổi theo vị trí trang web của bạn)
sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*
_www
và tạo một nhóm cho bạn và Apache. Tạo một nhóm mới, giả sử được gọi trusted
, và đặt bạn và _www
tham gia. Sau đó đặt đáng tin cậy làm chủ sở hữu nhóm của tất cả các tệp trong thư mục tài liệu máy chủ của bạn. Cuối cùng, chỉ làm những việc chmod g+rwx
cần thiết đối với các tệp mà Apache cần quyền truy cập để trusted
nhóm có quyền chỉnh sửa tệp.
Các câu trả lời chỉ liên kết không được coi là phương pháp hay trên StackOverflow, nhưng lời khuyên được đưa ra ở đây thường KHÔNG nên theo dõi.
Tôi muốn quay lại câu trả lời tuyệt vời này cho một câu hỏi tương tự . Tôi trích dẫn:
Vui lòng ngừng đề xuất sử dụng 777. Bạn đang làm cho mọi người có thể ghi tệp của mình, điều này có nghĩa là bạn mất tất cả bảo mật mà hệ thống cấp phép được thiết kế. Nếu bạn đề xuất điều này, hãy nghĩ về những hậu quả mà nó có thể gây ra trên một máy chủ web được cấu hình kém: nó sẽ trở nên cực kỳ dễ dàng để "hack" trang web, bằng cách ghi đè các tệp. Vì vậy, đừng.
Sửa các quyền của thư mục mà bạn cố gắng tạo một thư mục trong đó .
Tôi biết rằng chủ đề này đã cũ, nhưng có lẽ điều này sẽ giúp ích cho ai đó, một ngày nào đó.
Vấn đề tại sao PHP nói "Quyền bị từ chối" cho mkdir () - đường dẫn url sai. Vì vậy, để sửa nó, tất cả những gì bạn cần là có được đường dẫn chính xác. Tôi đã làm theo cách này:
<?php
$root = $_SERVER["DOCUMENT_ROOT"];
$dir = $root . '/somefolder/';
if( !file_exists($dir) ) {
mkdir($dir, 0755, true);
}
?>
Bạn cần có quyền hệ thống tệp để tạo thư mục.
Ví dụ: Trong Ubuntu 10.04, apache (php) chạy với tư cách người dùng: www-data trong nhóm: www-data
Có nghĩa là người dùng www-data cần quyền truy cập để tạo thư mục.
Bạn có thể tự mình thử điều này bằng cách sử dụng: 'su www-data' để trở thành người dùng www-data.
Để khắc phục nhanh chóng, bạn có thể thực hiện: sudo chmod 777 my_parent_dir
chmod 0777
sẽ cho phép đọc và ghi quyền truy cập vào thế giới! Bạn không nên khuyên những điều như thế. Tuy nhiên, lời khuyên với nhóm người dùng hiện là tốt nhất ở đây :)
Điều khác bạn có thể làm là truy cập: / etc / sudoers
Có thêm dòng sau để cấp quyền cho người dùng đó www-data ALL = (ALL: TẤT CẢ) TẤT CẢ Tại sao lại có www-data? điều này là do apache đang chạy bởi tên người dùng này.
Trong trường hợp nếu người dùng của bạn khác thì hãy thử tên người dùng ALL = (ALL: TẤT CẢ) TẤT CẢ
Điều này đã làm việc cho tôi.
sudoers
trực tiếp, nhưng đăng nhập với quyền root và sử dụng visudo
lệnh te : kiểm tra bất kỳ thay đổi nào để tránh các chỉnh sửa bị lỗi, có thể gây ra lỗi phân tích cú pháp khi tệp sudoers được tải, điều này có thể khiến bạn bất lực (vì không có quyền thay đổi bất cứ điều gì)
Vì bạn đang sử dụng mac, bạn có thể thêm mình vào nhóm _www (nhóm người dùng apache) trên mac của mình:
sudo dseditgroup -o edit -a $USER -t user _www
và thêm người dùng _www vào nhóm bánh xe, đây dường như là thứ mà mac tạo tệp dưới dạng:
sudo dseditgroup -o edit -a _www -t user wheel
Tôi gặp sự cố này ngay bây giờ, giải pháp tốt nhất của tôi mà tôi có thể cung cấp cho bạn ngay bây giờ (mặc dù bạn không bao gồm bất kỳ mã nào của mình) sẽ là:
Nếu bạn đang sử dụng lệnh đệ quy để tạo các thư mục con, đừng quên đặt 0755 (nhớ thêm 0 ở đầu) vào lệnh mkdir, ví dụ:
if(!file_exists($output)){
if (!mkdir($output, 0755, true)) {//0755
die('Failed to create folders...');
}
}
Điều này cũng làm việc cho tôi vừa rồi.
Nếu bạn đang sử dụng LINUX, trước tiên hãy kiểm tra người dùng của apache, vì trong một số bản phân phối, nó có thể khác:
egrep -i '^user|^group' /etc/httpd/conf/httpd.conf
Giả sử kết quả là "http". Thực hiện thao tác folowwing, chỉ cần nhớ thay đổi path_to_folder thành đường dẫn thư mục:
chown -R http:http path_to_folder
chmod -R g+rw path_to_folder
kiểm tra xem nó không phải là vấn đề với umask
if (!function_exists('mkdir_r')) {
/**
* create directory recursively
* @param $dirName
* @param int $rights
* @param string $dir_separator
* @return bool
*/
function mkdir_r($dirName, $rights = 0744, $dir_separator = DIRECTORY_SEPARATOR) {
$dirs = explode($dir_separator, $dirName);
$dir = '';
$created = false;
foreach ($dirs as $part) {
$dir .= $part . $dir_separator;
if (!is_dir($dir) && strlen($dir) > 0) {
$created = mkdir($dir, $rights);
}
}
return $created;
}
}
if (!function_exists('ensure_dir')) {
/**
* ensure directory exist if not create
* @param $dir_path
* @param int $mode
* @param bool $use_mask
* @param int $mask
* @return bool
*/
function ensure_dir($dir_path, $mode = 0744, $use_mask = true, $mask = 0002) {
// set mask
$old_mask = $use_mask && $mask != null
? umask($mask)
: null;
try {
return is_dir($dir_path) || mkdir_r($dir_path, $mode);
} finally {
if ($use_mask && $old_mask != null) {
// restore original
umask($old_mask);
}
}
}
}
Sau khi cài đặt máy chủ ftp, sudo apt-get install vsftpd
bạn sẽ phải cấu hình nó. Để kích hoạt quyền ghi, bạn phải chỉnh sửa /etc/vsftpd.conf
tệp và bỏ ghi chú
#write_enable=YES
dòng, vì vậy nó nên đọc
write_enable=YES
Lưu tệp và khởi động lại vsftpd
với sudo service vsftpd restart
.
Đối với các tùy chọn cấu hình khác, hãy tham khảo tài liệu này hoặcman vsftpd.conf
Lỗi này xảy ra nếu bạn đang sử dụng đường dẫn sai.
Ví dụ:
Tôi đang sử dụng hệ thống ubuntu và tên thư mục dự án của tôi là 'myproject'
Giả sử tôi có thư mục myproject / public / report tồn tại và muốn tạo một thư mục mới có tên là đơn đặt hàng
Sau đó, tôi cần một con đường toàn bộ nơi dự án của tôi tồn tại. Bạn có thể lấy đường dẫn bằng lệnh PWD
Vì vậy, đường dẫn gốc của tôi sẽ là = '/ home / htdocs / myproject /'
$ dir = '/ home / htdocs / myproject / public / report / Order';
if (!is_dir($dir)) {
mkdir($dir, 0775, true);
}
Nó sẽ làm việc cho bạn !! Thưởng thức !!