file_put_contents - स्ट्रीम खोलने में विफल: अनुमति से इनकार किया


97

मैं डिबगिंग के लिए एक फ़ाइल पर एक प्रश्न लिखने की कोशिश कर रहा हूं। फ़ाइल में है database/execute.php। फ़ाइल मैं लिखना चाहता हूँ database/queries.php

मैं उपयोग करने की कोशिश कर रहा हूं file_put_contents('queries.txt', $query)

लेकिन मुझे मिल रहा है

file_put_contents (Questions.txt) [function.file-put-content]: स्ट्रीम खोलने में विफल: अनुमति अस्वीकृत

मेरे पास queries.txtफ़ाइल को 777 करने के लिए chmod'd, क्या समस्या हो सकती है?


क्या आपने php.iniफ़ाइल के माध्यम से ऐसी किसी चीज़ के लिए देखा है जो फ़ाइल एक्सेस से इनकार कर सकती है?
हैलो71

2
यह भी सुनिश्चित करें कि निर्देशिका chmod'd सही है
Crayon हिंसक

1
निरपेक्ष फ़ाइल नाम का उपयोग करने का भी प्रयास करें। यह सिर्फ यह हो सकता है कि वर्तमान फ़ोल्डर की आपकी व्याख्या PHP के
laher

1
क्या आप उस chmod स्टेटस की दोबारा जांच कर सकते हैं?
योना

1
इस तरह की समस्याओं के लिए एक समस्या निवारण चेकलिस्ट है: stackoverflow.com/questions/36577020/…
Vic Seedoubleyew

जवाबों:


73

निर्देशिका अनुमतियों को समायोजित करने का प्रयास करें।

किसी टर्मिनल से, रन chmod 777 database(निर्देशिका से जिसमें डेटाबेस फ़ोल्डर होता है)

अगर यह सही ढंग से chmodd'ed है तो अपाचे और किसी के पास इस निर्देशिका तक पहुंच नहीं होगी।

दूसरी बात करने के लिए गूंज है "getcwd ()"। यह आपको वर्तमान निर्देशिका दिखाएगा, और यदि यह '/something.../database/' नहीं है, तो आपको अपने सर्वर के लिए 'query.txt' को पूर्ण पथ में बदलना होगा।


104
क्या 777 सुरक्षा जोखिम नहीं है?
हितुटोडेस्ट्रक्ट

12
मुझे दृढ़ता से संदेह है कि न केवल लक्ष्य निर्देशिका को सर्वर खाते द्वारा लिखा जाना चाहिए, बल्कि लक्ष्य निर्देशिका की प्रत्येक मूल निर्देशिका को सर्वर खाते को इसमें नेविगेट करने की अनुमति देनी चाहिए; मुझे लगता है कि यह अनुमतियों के लिए + x होगा।
एरहानिस

2
मैंने Erhannis के सिद्धांतों को एक नए LAMP स्टैक पर प्रयोग किया और सिद्धांत सही है।
थोथाथोल

4
@MajidFouladpour मुझे लगता है chmod +x /parent/directory, लक्ष्य के हर माता-पिता के लिए। chmod +x /parent/directory, chmod +x /parentइत्यादि
एर्हानीस

1
इस तरह की समस्याओं के लिए अब एक समस्या निवारण चेकलिस्ट है: stackoverflow.com/questions/36577020/…
विक सीडड्यूल्यूव

18

दूसरा विकल्प

वह है जो आप बना सकते हैं Apache (www-data), फ़ोल्डर का स्वामी

sudo chown -R www-data:www-data /var/www

कि file_put_contentsअब काम करना चाहिए । लेकिन अधिक सुरक्षा के लिए आप नीचे दिए गए अनुमतियों को बेहतर तरीके से सेट करते हैं

find /var/www -type d -print0 | xargs -0 chmod 0755 # folder
find /var/www -type f -print0 | xargs -0 chmod 0644 # files
  • /var/wwwआपकी php फ़ाइलों के रूट फ़ोल्डर में परिवर्तन

7

एहसास यह अब बहुत पुराना है, लेकिन इस तरह से फ़ाइल को मैन्युअल रूप से क्वेरी लिखने की आवश्यकता नहीं है। MySQL में लॉगिंग सपोर्ट है, जिसे आपको अपने देव वातावरण में सक्षम करने की आवश्यकता है।

'सामान्य क्वेरी लॉग' के दस्तावेज़ीकरण पर एक नज़र डालें:

http://dev.mysql.com/doc/refman/5.1/en/query-log.html


3

दोस्तों मैं 1 महीने के लिए यह समस्या थी और सब कुछ किया लेकिन इसे ठीक नहीं कर सका, लेकिन अब मुझे इसका समाधान पता है।

मैं एक साझा लिनक्स होस्टिंग का उपयोग करता हूं, जब मेरे व्यवस्थापक ने php को 5.3 में बदल दिया, मुझे "file_put_contents" कोड के लिए कई त्रुटि मिलीं। मेरी योजना का परीक्षण करने का प्रयास करें:

अपने होस्ट में mytest.php जैसी फ़ाइल बनाएँ, और इस कोड को डालें और सहेजें:

<?php        mail('Your-EMail','Email-Title','Email-Message');        ?>

एक बार "www.your-domain.com/mytest.php" URL खोलें और फिर अपना ईमेल देखें। आपके पास mytest.php में दर्ज जानकारी के साथ आपके मेजबान से एक ईमेल होना चाहिए, प्रेषक का नाम जांचें। अगर इसकी किसी से आपको "अनुमति अस्वीकृत" के बारे में समस्या है क्योंकि कुछ परिभाषित नहीं है और यदि प्रेषक का नाम मेरी आईडी की तरह है: iietj8qy@hostname5.netly.net आपके पास प्रोब नहीं है।

मेरे व्यवस्थापक ने सर्वर को बदल दिया और मेजबान को फिर से स्थापित किया जो मुझे लगता है और समस्या हल हो गई है, अपने मेजबान प्रशासन को बताएं कि मैंने आपको क्या बताया और शायद वे इसका जवाब ढूंढते हैं।

आशा है कि यह आपकी मदद करता है!


मैं पूरी तरह से खो गया हूँ !! तुम क्या कहना चाहते हो? यदि आप कह रहे हैं कि अपाचे उपयोगकर्ता होस्टनाम को सर्वर पर साझा करने में असमर्थ था (साझा या जो भी हो), तो यह उच्च समय है जब आप अपनी होस्टिंग सेवा की पसंद पर पुनर्विचार करते हैं।
Fr0zenFyr

3

मुझे पता है कि यह एक बहुत पुराना प्रश्न है, लेकिन मैं गहराई से स्पष्टीकरण के साथ अच्छा समाधान जोड़ना चाहता था। आपको उबंटू जैसे सिस्टम पर दो कथनों को निष्पादित करना होगा और फिर यह एक आकर्षण की तरह काम करता है।

लिनक्स में अनुमतियों को तीन अंकों के साथ दर्शाया जा सकता है। पहला अंक फाइलों के मालिक की अनुमति को परिभाषित करता है। उपयोगकर्ताओं के विशिष्ट समूह की अनुमतियों का दूसरा अंक। तीसरा अंक उन सभी उपयोगकर्ताओं के लिए अनुमतियों को परिभाषित करता है जो मालिक नहीं हैं और न ही समूह के सदस्य हैं।

वेबसर्वर को एक आईडी के साथ निष्पादित करना चाहिए जो समूह का सदस्य है। वेबसर्वर को कभी भी उसी आईडी से नहीं चलना चाहिए जो फाइलों और निर्देशिकाओं के मालिक के रूप में है। उबंटू में आईडी www-डेटा के तहत अपाचे चलता है। वह आईडी उस समूह का सदस्य होना चाहिए जिसके लिए अनुमतियाँ निर्दिष्ट हैं।

उस निर्देशिका को देने के लिए जिसमें आप फाइलों के कंटेंट को उचित अधिकार बदलना चाहते हैं, स्टेटमेंट निष्पादित करें:

find %DIR% -type d -exec chmod 770 {} \;

.यह ओपी के सवाल में निहित होगा कि निर्देशिका% ROOT% / डेटाबेस की अनुमतियों को तदनुसार बदला जाना चाहिए। यह महत्वपूर्ण है कि उस निर्देशिका के भीतर ऐसी फाइलें न हों, जिन्हें कभी बदला नहीं जाए, या हटाया न जाए। यह उन फ़ाइलों के लिए एक अलग निर्देशिका बनाने के लिए सबसे अच्छा अभ्यास है जिनकी सामग्री को बदलना होगा।

डायरेक्टरी के लिए रीडिंग परमिशन (4) का मतलब है डायरेक्टरी के भीतर सभी फाइल और डायरेक्टरी को अपने मेटाडेटा के साथ कलेक्ट करना। लिखने की अनुमति (2) निर्देशिका की सामग्री को बदलने की अनुमति देती है। फ़ाइलों को जोड़ना और हटाना, अनुमतियाँ बदलना आदि .. निष्पादन की अनुमति (1) का मतलब है कि आपको उस निर्देशिका में जाने का अधिकार है। बाद के बिना निर्देशिका में गहराई तक जाना असंभव है। वेबसर्वर को फ़ाइल की सामग्री को बदलते समय अनुमतियों को पढ़ने, लिखने और निष्पादित करने की आवश्यकता होती है। इसके लिए समूह को अंक 7 की आवश्यकता है।

दूसरा कथन ओपी के प्रश्न में है:

find %DOCUMENT_ROOT%/database -type f -exec chmod 760 {} \;

दस्तावेज़ को पढ़ने और लिखने में सक्षम होने के लिए आवश्यक है, लेकिन फ़ाइल को निष्पादित करना आवश्यक नहीं है। 7 फाइलों के मालिक को, 6 को समूह को दिया जाता है। वेबसर्वर को अपनी सामग्री को बदलने के लिए फ़ाइल को निष्पादित करने की अनुमति की आवश्यकता नहीं है। उन लिखने की अनुमति केवल उस निर्देशिका में फ़ाइलों को दी जानी चाहिए।

अन्य सभी उपयोगकर्ताओं को कोई अनुमति नहीं दी जानी चाहिए।

उन निर्देशिकाओं के लिए जिन्हें इसकी फ़ाइलों को बदलने की आवश्यकता नहीं है, वे 5 पर्याप्त की समूह अनुमतियाँ हैं। अनुमतियों और कुछ उदाहरणों के बारे में प्रलेखन:

https://wiki.debian.org/Permissions

https://www.linux.com/learn/tutorials/309527-understanding-linux-file-permissions

http://www.linux.org/threads/file-permissions-chmod.4094/


3

इस लिंक से जानकारी इकट्ठा करना stackoverflow- छवि को बचाने के लिए 777 chmod के साथ और उपयोगकर्ता azerafati और ​​Loek बर्गमैन से काम नहीं करता है

अगर आपको नीचे देखना था / etc / apache / envvars फाइल तो आपको कुछ इस तरह दिखाई देगा:

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

Apache उपयोगकर्ता नाम 'www-data' के तहत चलाया जाता है

'0755' का अर्थ है कि फ़ाइल स्वामी पढ़ / लिख / निष्पादित कर सकता है लेकिन समूह और अन्य उपयोगकर्ता नहीं लिख सकते हैं। इसलिए उर टर्मिनल में, अपने 'चित्र' फ़ोल्डर वाले फ़ोल्डर में सीडी। फिर टाइप करें:

find images -type d -exec chmod 0755 {} \;
find images -type f -exec chmod 0755 {} \;
sudo chown -R www-data:www-data images

मालिक को बदलने से पहले आपको पहले बदलाव करना होगा। संकेत मिलने पर अपना पासवर्ड दर्ज करें। यह छवियों के फ़ोल्डर का 'www-data' स्वामी बना देगा।

अब आपका अपलोड काम करना चाहिए


1

उबंटू का उपयोग करने वाले और स्थानीय रूप से पृष्ठ लोड करते समय यह त्रुटि प्राप्त करने वाले किसी व्यक्ति के लिए, लेकिन वेब होस्टिंग सेवा पर नहीं,

मैंने इसे केवल nautilus ( sudo nautilus) और उस फ़ाइल पर राइट क्लिक करके तय किया है जिसे आप खोलने की कोशिश कर रहे हैं, गुण> सेटिंग> पर क्लिक करें और 'हर किसी को' पढ़ने के लिए लिख दें


0

एक ही समस्या थी; मेरा मुद्दा selinux लागू करने के लिए सेट किया गया था।

मैं "ओपन स्ट्रीम के लिए असफल रहा: अनुमति अस्वीकार कर दिया" 777 के लिए chmoding के बाद भी त्रुटि हो रही है और सुनिश्चित करें कि सभी मूल फ़ोल्डर Apache उपयोगकर्ता के लिए अनुमतियाँ निष्पादित किया था। मेरा मुद्दा यह था कि सेलिनक्स को लागू करने के लिए सेट किया गया था (मैं सेंटोस 7 पर हूं), यह एक डेबॉक्स है इसलिए मैंने इसे बंद कर दिया।


0

इसे निम्नलिखित चरणों के साथ हल किया जा सकता है:

1. $ php artisan cache:clear

2. $ sudo chmod -R 777 storage

3. $ composer dump-autoload

आशा करता हूँ की ये काम करेगा


0

यदि आप लोकल से सर्वर पर git से खींच रहे हैं, तो आपको कभी-कभी कैश को क्लियर करने की आवश्यकता होगी क्योंकि व्यू फाइल्स इसे / या अन्य कैश्ड फाइल्स के साथ अपलोड हो जाती हैं।

php artisan cache:clear

कभी-कभी यह सिर्फ चाल के लिए हो सकता है यदि आपका एप्लिकेशन गिट पुल से पहले काम कर रहा था


0

यह मदद कर सकता है। इसने मेरे लिए काम किया। इसे टर्मिनल में आज़माएं

setenforce 0


-2

इस मुद्दे को हल करने के 2 तरीके हैं
1. उपयोग chmod 777 path-to-your-directory
अगर यह काम नहीं करता है तो
2. बस अपनी फ़ाइल का पूरा पथ प्रदान करें query.txt


2
यह बहुत ही असुरक्षित है और बहुत बुरा अभ्यास है। कस्टम एप्लिकेशन विकसित करते समय इसका पता लगाना और सही करना मुश्किल है और इसे आसानी से अनदेखा किया जा सकता है। कृपया वास्तव में सही अनुमतियों का पता लगाएं।
फुटट्रेटर

-3

यहाँ समाधान है। URL से एक img कॉपी करने के लिए। यह URL:http://url/img.jpg

$image_Url=file_get_contents('http://url/img.jpg');

वांछित पथ बनाने के साथ नाम समाप्त करें .jpg

$file_destino_path="imagenes/my_image.jpg";

file_put_contents($file_destino_path, $image_Url)

-11

इसके अलावा, जैसा कि कहा गया file_put_contents man pageहै php.net, नामकरण के मुद्दों से सावधान रहें।

file_put_contents($dir."/file.txt", "hello");

काम नहीं कर सकता (भले ही यह वाक्य रचना पर सही हो), लेकिन

file_put_contents("$dir/file.txt", "hello");

काम करता है। मैंने इसे अलग-अलग php स्थापित सर्वरों पर अनुभव किया।


17
यह सही नहीं है। सभी मामलों में $dir."/file.txt"कार्यात्मक रूप से समकक्ष है "$dir/file.txt", यह मानते हुए कि $dirयह एक स्ट्रिंग है। इसके अलावा, इस व्यवहार को php.net पर प्रलेखित नहीं किया गया है, जैसा कि किवंक का दावा है।
मत्तबस्ता
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.