मैं PHP mkdir फ़ंक्शन के साथ एक निर्देशिका बनाने की कोशिश कर रहा हूं, लेकिन मुझे निम्नानुसार एक त्रुटि मिलती है Warning: mkdir() [function.mkdir]: Permission denied in ...:। समस्या का निपटान कैसे करें?
मैं PHP mkdir फ़ंक्शन के साथ एक निर्देशिका बनाने की कोशिश कर रहा हूं, लेकिन मुझे निम्नानुसार एक त्रुटि मिलती है Warning: mkdir() [function.mkdir]: Permission denied in ...:। समस्या का निपटान कैसे करें?
जवाबों:
मैं जानता हूं कि यह एक पुराना धागा है, लेकिन इसके बेहतर जवाब की जरूरत है। आपको अनुमतियों को 777 पर सेट करने की आवश्यकता नहीं है, यह एक सुरक्षा समस्या है क्योंकि यह दुनिया को पढ़ने और लिखने की सुविधा देता है। हो सकता है कि आपके अपाचे उपयोगकर्ता के पास निर्देशिका पर अनुमतियाँ पढ़ने / लिखने की अनुमति न हो।
यहाँ आप उबंटू में क्या कर रहे हैं
सुनिश्चित करें कि सभी फ़ाइलें Apache समूह और उपयोगकर्ता के स्वामित्व में हैं। उबंटू में यह www-data group और user है
chown -R www-data:www-data /path/to/webserver/www
अगला www-data समूह के सभी सदस्यों को फ़ाइलों को पढ़ने और लिखने में सक्षम बनाता है
chmod -R g+rw /path/to/webserver/www
Php mkdir()फ़ंक्शन को अब त्रुटियों को वापस किए बिना काम करना चाहिए
/opt/lampp/htdocs/www/my-app/public/uploads.. मूल रूप से मैं जो करने की कोशिश कर रहा हूं, वह अपलोड फ़ोल्डर के अंदर फ़ाइलों को अपलोड करने के लिए उपयोगकर्ता में लॉग इन किया गया है और फ़ोटो संग्रहीत करने के लिए एल्बम-फ़ोल्डर भी बना सकते हैं (यह php के साथ किया जाएगा) ..
उन लोगों के लिए देर से उत्तर जो भविष्य में इसे Google के माध्यम से ढूंढते हैं। मैं एक समस्या मे फंस गया।
नोट: मैं मैक OSX शेर पर हूँ
क्या होता है कि अपाचे को उपयोगकर्ता "_www" के रूप में चलाया जा रहा है और किसी भी फाइल को संपादित करने की अनुमति नहीं है। आप देखेंगे कि कोई फ़ाइल सिस्टम फ़ंक्शन php के माध्यम से काम नहीं करता है।
कैसे ठीक करना है:
एक खोजक विंडो खोलें और मेनू बार से, Go> Go To Folder> / Private / etc / apache2 चुनें
अब httpd.conf खोलें
लगता है:
User _www
Group _www
उपयोगकर्ता नाम बदलें:
User <YOUR LOGIN USERNAME>
अब इस फॉर्म टर्मिनल को चलाकर अपाचे को फिर से शुरू करें:
sudo apachectl -k restart
यदि यह अभी भी काम नहीं करता है, तो मैं ऊपर किए जाने से पहले निम्न कार्य करता हूं। संबंधित हो सकता है।
टर्मिनल खोलें और निम्नलिखित कमांड चलाएं: (ध्यान दें, मेरी वेबसर्वर फाइलें / लाइब्रेरी / वेबसर्वर / www में स्थित हैं। अपनी वेबसाइट के स्थान के अनुसार बदलें)
sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*
_wwwऔर आपके और अपाचे के लिए एक समूह बनाना। एक नया समूह बनाएं, कहते हैं trusted, और अपने आप को और _wwwइसमें डाल दिया । फिर अपने सर्वर दस्तावेज़ निर्देशिका में सभी फ़ाइलों के समूह के मालिक पर भरोसा करें। अंत में, chmod g+rwxकेवल उन फाइलों पर आवश्यक करें जिन्हें अपाचे को एक्सेस करने की आवश्यकता है, ताकि trustedसमूह के पास फ़ाइलों को संपादित करने की अनुमति हो।
लिंक केवल उत्तरों को स्टैकऑवरफ्लो पर अच्छा अभ्यास नहीं माना जाता है, लेकिन यहां दी गई सलाह का आमतौर पर पालन नहीं किया जाना चाहिए।
मैं इसी तरह के सवाल पर इस महान जवाब पर वापस लौटना चाहूंगा । मैं उद्धृत करता हूं:
कृपया 777 का उपयोग करने का सुझाव देना बंद कर दें। आप अपनी फ़ाइल को सभी के द्वारा लिखने योग्य बना रहे हैं, जिसका अर्थ है कि आप सभी सुरक्षा खो देते हैं जिसके लिए अनुमति प्रणाली डिज़ाइन की गई थी। यदि आप यह सुझाव देते हैं, तो उन परिणामों के बारे में सोचें जो खराब तरीके से कॉन्फ़िगर किए गए वेबसर्वर पर हो सकते हैं: फाइलों को अधिलेखित करके वेबसाइट को "हैक" करना अविश्वसनीय रूप से आसान हो जाएगा। तो, नहीं।
निर्देशिका की अनुमतियों को ठीक करें यदि आप एक निर्देशिका बनाने की कोशिश में ।
मुझे पता है कि यह धागा पुराना है, लेकिन शायद इससे किसी को, एक दिन मदद मिलेगी।
समस्या क्यों mkdir के लिए "अनुमति अस्वीकृत" कहती है () - गलत यूआरएल पथ। तो, इसे ठीक करने के लिए, आपको सही रास्ता प्राप्त करने की आवश्यकता है। मैंने इसे इस तरह किया:
<?php
$root = $_SERVER["DOCUMENT_ROOT"];
$dir = $root . '/somefolder/';
if( !file_exists($dir) ) {
mkdir($dir, 0755, true);
}
?>
निर्देशिका बनाने के लिए आपके पास फ़ाइल सिस्टम की अनुमति होनी चाहिए।
उदाहरण: उबंटू में 10.04 अपाचे (php) उपयोगकर्ता के रूप में चलता है: www-data in group: www-data
मतलब निर्देशिका बनाने के लिए उपयोगकर्ता www-data की आवश्यकता है।
आप इसका उपयोग करके स्वयं प्रयास कर सकते हैं: www-data उपयोगकर्ता बनने के लिए 'su www-data'।
एक त्वरित सुधार के रूप में, आप यह कर सकते हैं: सुडोम चामोड 777 my_parent_dir
chmod 0777दुनिया को पढ़ने और लिखने की सुविधा देगा! आपको ऐसा कुछ करने की सलाह नहीं देनी चाहिए। हालाँकि, उपयोगकर्ता समूह के साथ सलाह वर्तमान में यहाँ सबसे अच्छी है :)
दूसरी चीज जो आप कर सकते हैं वह है: / etc / sudoers
निम्नलिखित पंक्ति जोड़ें जो उस उपयोगकर्ता को अनुमति देता है www-data ALL = (ALL: ALL) ALL Why www-data? ऐसा इसलिए है क्योंकि इस उपयोगकर्ता नाम से अपाचे चल रहा है।
यदि आपका उपयोगकर्ता अलग है, तो यह जांचें कि उपयोगकर्ता नाम = (ALL: ALL) ALL
इसने मेरे लिए काम किया।
sudoersसीधे संपादित न करें , लेकिन रूट के रूप में लॉग इन करें, और ते visudoकमांड का उपयोग करें : जो दोषपूर्ण संपादन से बचने के लिए किसी भी परिवर्तन की जांच करता है, जो सूडर्स फ़ाइल लोड होने पर पार्स-त्रुटियों का कारण बन सकता है, जो आपको शक्तिहीन छोड़ सकता है (जैसा कि कोई अधिकार नहीं है कुछ भी बदलो)
जब से आप एक मैक पर हैं, आप अपने मैक पर _www (अपाचे उपयोगकर्ता समूह) समूह में खुद को जोड़ सकते हैं:
sudo dseditgroup -o edit -a $USER -t user _www
और पहिया समूह के लिए _www उपयोगकर्ता को जोड़ें जो ऐसा प्रतीत होता है कि मैक क्या फाइल बनाता है:
sudo dseditgroup -o edit -a _www -t user wheel
मुझे अभी यह समस्या है, मेरा सबसे अच्छा समाधान मैं आपको अभी दे सकता हूं (इसके बावजूद कि आपने अपना कोई कोड शामिल नहीं किया है) होगा:
यदि आप उप-फ़ोल्डर बनाने के लिए पुनरावर्ती कमांड का उपयोग कर रहे थे, तो mkdir कमांड में 0755 (शुरू में 0 शामिल करना याद रखें) को रखना न भूलें, जैसे:
if(!file_exists($output)){
if (!mkdir($output, 0755, true)) {//0755
die('Failed to create folders...');
}
}
यह भी मेरे लिए अभी काम किया है।
यदि आप LINUX का उपयोग कर रहे हैं, तो पहले अपाचे के उपयोगकर्ता की जांच करें, क्योंकि कुछ विकृतियों में यह अलग हो सकता है:
egrep -i '^user|^group' /etc/httpd/conf/httpd.conf
मान लीजिए कि परिणाम "http" है। फोलोविंग करें, बस याद रखें path_to_folder को फ़ोल्डर पथ में बदलें:
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
यह त्रुटि तब होती है यदि आप गलत पथ का उपयोग कर रहे हैं।
उदाहरण के लिए:
मैं ubuntu प्रणाली का उपयोग कर रहा हूं और मेरे प्रोजेक्ट फ़ोल्डर का नाम 'myproject' है
मान लीजिए कि मेरे पास myproject / public / रिपोर्ट निर्देशिका मौजूद है और ऑर्डर नामक एक नया फ़ोल्डर बनाना चाहते हैं
फिर मुझे एक पूरे रास्ते की ज़रूरत है जहाँ मेरा प्रोजेक्ट मौजूद हो। आप पीडब्ल्यूडी कमांड द्वारा पथ प्राप्त कर सकते हैं
तो मेरा रूट पाथ होगा = '/ home / htdocs / myproject /'
$ dir = '/ home / htdocs / myproject / public / रिपोर्ट / आदेश';
if (!is_dir($dir)) {
mkdir($dir, 0775, true);
}
यह आपके लिए काम करेगा !! का आनंद लें !!