ฉันพยายามสร้างไดเร็กทอรีด้วยฟังก์ชัน PHP mkdir แต่ได้รับข้อผิดพลาดดังนี้: Warning: mkdir() [function.mkdir]: Permission denied in ...
. จะยุติปัญหาได้อย่างไร?
ฉันพยายามสร้างไดเร็กทอรีด้วยฟังก์ชัน PHP mkdir แต่ได้รับข้อผิดพลาดดังนี้: Warning: mkdir() [function.mkdir]: Permission denied in ...
. จะยุติปัญหาได้อย่างไร?
คำตอบ:
ฉันรู้ว่านี่เป็นกระทู้เก่า แต่มันต้องการคำตอบที่ดีกว่านี้ คุณไม่จำเป็นต้องตั้งค่าสิทธิ์เป็น 777 นั่นเป็นปัญหาด้านความปลอดภัยเนื่องจากให้สิทธิ์การเข้าถึงแบบอ่านและเขียนไปทั่วโลก อาจเป็นไปได้ว่าผู้ใช้ apache ของคุณไม่มีสิทธิ์ในการอ่าน / เขียนบนไดเร็กทอรี
นี่คือสิ่งที่คุณทำใน Ubuntu
ตรวจสอบว่าไฟล์ทั้งหมดเป็นของกลุ่ม Apache และผู้ใช้ ใน Ubuntu เป็นกลุ่มข้อมูล wwwและผู้ใช้
chown -R www-data:www-data /path/to/webserver/www
จากนั้นเปิดใช้งานสมาชิกทั้งหมดของกลุ่ม www-data เพื่ออ่านและเขียนไฟล์
chmod -R g+rw /path/to/webserver/www
mkdir()
ขณะนี้ฟังก์ชันphp ควรทำงานได้โดยไม่ส่งคืนข้อผิดพลาด
/opt/lampp/htdocs/www/my-app/public/uploads
.. โดยพื้นฐานแล้วสิ่งที่ฉันพยายามทำคือผู้ใช้ที่ลงชื่อเข้าใช้ทุกคนเพื่ออัปโหลดไฟล์ภายในโฟลเดอร์อัปโหลดและสร้างโฟลเดอร์อัลบั้ม (ซึ่งจะทำได้ด้วย php) เพื่อจัดเก็บรูปภาพ ..
คำตอบสำหรับผู้ที่พบสิ่งนี้ผ่านทาง Google ในอนาคต ฉันพบปัญหาเดียวกัน
หมายเหตุ: ฉันใช้ MAC OSX LION
สิ่งที่เกิดขึ้นคือ apache กำลังทำงานในฐานะผู้ใช้ "_www" และไม่มีสิทธิ์แก้ไขไฟล์ใด ๆ คุณจะสังเกตเห็นว่าไม่มีฟังก์ชันระบบไฟล์ทำงานผ่าน php
วิธีแก้ไข:
เปิดหน้าต่างตัวค้นหาและจากแถบเมนูเลือก Go> Go To Folder> / private / etc / apache2
ตอนนี้เปิด httpd.conf
หา:
User _www
Group _www
เปลี่ยนชื่อผู้ใช้:
User <YOUR LOGIN USERNAME>
ตอนนี้รีสตาร์ท apache โดยเรียกใช้เทอร์มินัลแบบฟอร์มนี้:
sudo apachectl -k restart
หากยังไม่ได้ผลฉันต้องทำสิ่งต่อไปนี้ก่อนที่จะทำตามข้างต้น อาจเกี่ยวข้องกัน
เปิดเทอร์มินัลและเรียกใช้คำสั่งต่อไปนี้: (หมายเหตุไฟล์เว็บเซิร์ฟเวอร์ของฉันอยู่ที่ / Library / WebServer / www. เปลี่ยนตามตำแหน่งเว็บไซต์ของคุณ)
sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*
_www
และสร้างกลุ่มสำหรับคุณและ Apache สร้างกลุ่มใหม่พูดว่าเรียกtrusted
แล้วใส่ตัวเอง_www
เข้าไป จากนั้นสร้างความไว้วางใจให้กับเจ้าของกลุ่มของไฟล์ทั้งหมดในไดเรกทอรีเอกสารเซิร์ฟเวอร์ของคุณ สุดท้ายทำchmod g+rwx
ตามความจำเป็นเฉพาะไฟล์ที่ Apache ต้องการเข้าถึงเพื่อให้trusted
กลุ่มมีสิทธิ์แก้ไขไฟล์
คำตอบเฉพาะลิงก์ไม่ถือว่าเป็นแนวทางปฏิบัติที่ดีใน StackOverflow แต่โดยทั่วไปแล้วไม่ควรปฏิบัติตามคำแนะนำที่ให้ไว้ในที่นี้
ฉันต้องการกลับไปใช้คำตอบที่ดีสำหรับคำถามที่คล้ายกันนี้ ฉันอ้าง:
โปรดหยุดแนะนำให้ใช้ 777 คุณกำลังทำให้ไฟล์ของคุณสามารถเขียนได้โดยทุกคนซึ่งหมายความว่าคุณสูญเสียความปลอดภัยทั้งหมดที่ระบบอนุญาตออกแบบมา หากคุณแนะนำสิ่งนี้ให้นึกถึงผลที่ตามมาที่อาจเกิดขึ้นกับเว็บเซิร์ฟเวอร์ที่มีการกำหนดค่าไม่ดีนั่นคือการ "แฮ็ก" เว็บไซต์จะกลายเป็นเรื่องง่ายอย่างเหลือเชื่อโดยการเขียนทับไฟล์ ดังนั้นอย่า
แก้ไขสิทธิ์ของไดเรกทอรีที่คุณพยายามที่จะสร้างไดเรกทอรีใน
ฉันรู้ว่ากระทู้นี้เก่า แต่สักวันอาจจะช่วยใครสักคนได้
ปัญหาที่ PHP แจ้งว่า "ปฏิเสธการอนุญาต" สำหรับ mkdir () - เส้นทาง URL ไม่ถูกต้อง ดังนั้นในการแก้ไขสิ่งที่คุณต้องมีเพื่อให้ได้เส้นทางที่ถูกต้อง ฉันทำแบบนี้:
<?php
$root = $_SERVER["DOCUMENT_ROOT"];
$dir = $root . '/somefolder/';
if( !file_exists($dir) ) {
mkdir($dir, 0755, true);
}
?>
คุณต้องมีสิทธิ์ระบบไฟล์เพื่อสร้างไดเร็กทอรี
ตัวอย่าง: ใน Ubuntu 10.04 apache (php) เรียกใช้เป็นผู้ใช้: www-data ในกลุ่ม: www-data
ความหมายผู้ใช้ www-data ต้องการการเข้าถึงเพื่อสร้างไดเร็กทอรี
คุณสามารถลองด้วยตัวเองโดยใช้: 'su www-data' เพื่อเป็นผู้ใช้ www-data
ในการแก้ไขอย่างรวดเร็วคุณสามารถทำได้: sudo chmod 777 my_parent_dir
chmod 0777
จะให้การอ่านและเขียนเข้าถึงโลก! คุณไม่ควรให้คำแนะนำอะไรเช่นนั้น อย่างไรก็ตามคำแนะนำกับกลุ่มผู้ใช้ในปัจจุบันดีที่สุดที่นี่ :)
สิ่งอื่นที่คุณทำได้คือไปที่: / etc / sudoers
มีการเพิ่มบรรทัดต่อไปนี้ซึ่งให้สิทธิ์แก่ผู้ใช้ www-data ALL = (ALL: ALL) ALL ทำไมต้องเป็น www-data? เนื่องจาก apache ทำงานโดยชื่อผู้ใช้นี้
ในกรณีที่ผู้ใช้ของคุณแตกต่างกันให้ลองใช้ชื่อผู้ใช้ ALL = (ALL: ALL) ALL
สิ่งนี้ได้ผลสำหรับฉัน
sudoers
โดยตรง แต่เข้าสู่ระบบในฐานะรูทและใช้visudo
คำสั่งte : ที่ตรวจสอบการเปลี่ยนแปลงใด ๆ เพื่อหลีกเลี่ยงการแก้ไขที่ผิดพลาดซึ่งอาจทำให้เกิดข้อผิดพลาดในการแยกวิเคราะห์เมื่อโหลดไฟล์ sudoers ซึ่งอาจทำให้คุณไม่มีอำนาจ (เนื่องจากไม่มีสิทธิ์ในการ เปลี่ยนแปลงอะไรก็ได้)
เนื่องจากคุณใช้เครื่อง Mac คุณสามารถเพิ่มตัวเองในกลุ่ม _www (กลุ่มผู้ใช้ apache) บนเครื่อง Mac ของคุณได้:
sudo dseditgroup -o edit -a $USER -t user _www
และเพิ่มผู้ใช้ _www ในกลุ่มล้อซึ่งดูเหมือนจะเป็นสิ่งที่ mac สร้างไฟล์เป็น:
sudo dseditgroup -o edit -a _www -t user wheel
ฉันมีปัญหานี้ในตอนนี้ทางออกที่ดีที่สุดที่ฉันสามารถมอบให้คุณได้ในตอนนี้ (แม้ว่าคุณจะไม่ได้ใส่รหัสใด ๆ ก็ตาม) จะเป็น:
หากคุณใช้คำสั่งแบบเรียกซ้ำเพื่อสร้างโฟลเดอร์ย่อยอย่าลืมใส่ 0755 (อย่าลืมรวม 0 ที่จุดเริ่มต้น) ในคำสั่ง mkdir เช่น:
if(!file_exists($output)){
if (!mkdir($output, 0755, true)) {//0755
die('Failed to create folders...');
}
}
ตอนนี้ใช้ได้ผลกับฉันด้วย
หากคุณใช้ LINUX ขั้นแรกให้ตรวจสอบผู้ใช้ของ apache เนื่องจากในบางส่วนอาจแตกต่างกัน
egrep -i '^user|^group' /etc/httpd/conf/httpd.conf
สมมติว่าผลลัพธ์คือ "http" ทำการ folowwing เพียงจำไว้ว่าเปลี่ยน path_to_folder เป็นโฟลเดอร์ path:
chown -R http:http path_to_folder
chmod -R g+rw path_to_folder
ตรวจสอบว่าไม่ใช่ปัญหากับ 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);
}
}
}
}
หลังจากที่คุณติดตั้งเซิร์ฟเวอร์ ftp แล้วsudo apt-get install vsftpd
คุณจะต้องกำหนดค่า ในการเปิดใช้งานการเข้าถึงการเขียนคุณต้องแก้ไข/etc/vsftpd.conf
ไฟล์และยกเลิกการใส่เครื่องหมาย
#write_enable=YES
บรรทัดจึงควรอ่าน
write_enable=YES
บันทึกไฟล์และรีสตาร์ทvsftpd
ด้วยsudo service vsftpd restart
.
สำหรับตัวเลือกการกำหนดค่าอื่น ๆ โปรดดูเอกสารนี้หรือman vsftpd.conf
ข้อผิดพลาดนี้เกิดขึ้นหากคุณใช้เส้นทางที่ไม่ถูกต้อง
เช่น:
ฉันใช้ระบบอูบุนตูและชื่อโฟลเดอร์โปรเจ็กต์ของฉันคือ'myproject'
สมมติว่าฉันมีไดเร็กทอรีmyproject / public / reportและต้องการสร้างโฟลเดอร์ใหม่ที่เรียกว่าorders
จากนั้นฉันต้องการเส้นทางทั้งหมดที่มีโครงการของฉันอยู่ คุณสามารถรับเส้นทางด้วยคำสั่ง PWD
ดังนั้นเส้นทางรากของฉันจะเป็น = '/ home / htdocs / myproject /'
$ dir = '/ home / htdocs / myproject / public / report / Orders';
if (!is_dir($dir)) {
mkdir($dir, 0775, true);
}
มันจะทำงานสำหรับคุณ !! สนุก !!