2013-02-15 17 views
7

मेरे पास वर्तमान में एक php स्क्रिप्ट है जो ब्राउज़र ब्राउज़र वेबपृष्ठ पर ब्राउज़ करने पर चल रहा है। मैं जो करने की कोशिश कर रहा हूं वह एक टेक्स्ट फ़ाइल लिखता है जब स्क्रिप्ट चलाता है जो एक चर को स्टोर करता है। फ़ोल्डर का मालिक अपाचे है, लेकिन सभी ने परीक्षण उद्देश्यों के लिए सख्ती से लिखा है। (मैंने सोचा कि यह एक अनुमति समस्या हो सकती है) सर्वर पर SELINUX सक्षम है, और जब मैं कंसोल से स्क्रिप्ट चलाता हूं तो यह टेक्स्ट फ़ाइल को ठीक ठीक करता है, और सही निर्देशिका में बनाता है।file_put_contents txt फ़ाइल नहीं बना रहे

file_put_contents("My working file location", $myString); 

मैं लिखने और पाठ फ़ाइल बनाने के लिए प्रयास करने के लिए इस लाइन का उपयोग कर रहा, मैं जानता हूँ कि मेरी फाइल स्थान से काम करता है कि becaus मैं इसे चलाने के लिए और ऑफ़लाइन मोड, अर्थात् में यह बना सकते हैं इसे कंसोल के माध्यम से चल रहा है। समस्या यह है कि मैं जिस चर को लिखने की कोशिश कर रहा हूं वह HTTP पोस्ट के माध्यम से पॉप्युलेट किया गया है, और जब मैं ब्राउज़र के माध्यम से स्क्रिप्ट चलाता हूं, या जब अपाचे स्क्रिप्ट चलाता है, तो यह फ़ाइल नहीं लिखता या बनाता है। इस स्क्रिप्ट को इस पाठ फ़ाइल को लिखने के लिए मुझे लिखने/सिंटैक्स के रूप में बदलने की अनुमति देने के लिए मुझे क्या करने की आवश्यकता है?

+1

आपके अपाचे उपयोगकर्ता को निर्देशिका के अधिकार होना चाहिए - बस स्क्रिप्ट लाइन से apache उपयोगकर्ता के रूप में स्क्रिप्ट निष्पादित करने का प्रयास करें यह देखने के लिए कि – user1914292

+2

आपके अपाचे त्रुटि लॉग की जांच करें, यह आपको कुछ विवरण दे सकता है कि यह कहां विफल हुआ। –

+0

$ myString मान क्या है? क्या वो सही है ? – Cooper

उत्तर

9

आपकी समस्या आपके द्वारा निर्दिष्ट फ़ाइल स्थान पर लिखने की अनुमति नहीं होने के कारण अपाचे के कारण होने की संभावना है। उस निर्देशिका में जाओ और ls कमांड के साथ अनुमतियाँ और समूह स्वामित्व की जाँच करें:

cd "My working file location" 
ls -l . 

उत्पादन अनुमति, स्वामी, और निर्देशिका के लिए समूह बताते हैं कि तीन स्तंभ हैं। सबसे अधिक संभावना है कि वे रूट के स्वामित्व में हैं और निर्देशिका में लिखने के लिए apache के लिए अनुमति नहीं है।

यदि ऐसा है, तो आपको फ़ाइल बनाने की कोशिश करते समय आपके अपाचे लॉग में एक त्रुटि दिखाई देगी।

tail -f /var/log/apache2/error.log 
+0

मैं तय मुद्दा यह एक परिणति थी सेलिनक्स अनुमतियां और अपाचे अनुमतियां। – choppyfireballs

+2

अपना उत्तर साझा करना ठीक हो सकता है। Google ने मुझे यहां रीडायरेक्ट किया और मैं अभी भी अवरुद्ध हूं। –

+1

@VenderAeloth लगता choppyfireballs की तरह यहाँ बहुत सक्रिय नहीं है, लेकिन वह अगर वह जवाब नहीं है तो जब आप इसे पाते हैं कि आप हमारे साथ अपने जवाब का हिस्सा सुनिश्चित करें! निर्देशिका में सच है जब मैं फ़ाइलों को लिखने की ज़रूरत setsebool -पी allow_httpd_anon_write: –

-2

आप 777 के लिए निर्देशिका chmodding की कोशिश की है: अपने लॉग पीछा आपके ब्राउज़र में स्क्रिप्ट चलाने का प्रयास करें?

इस प्रयास करें:

if(file_put_contents('file.txt', 'text')){ 
    die('yes'); 
} else { 
    die('no'); 
} 

गलत वर्तनी कुछ हो सकता है।^

+1

कभी-कभी यह गलत तरीका देखने का एक अच्छा तरीका है – tofutim

1

मुझे हाल ही में एक ही समस्या थी और इस सवाल पर ठोकर खाई। दुर्भाग्यवश ओपी ने चॉपलेटफायरबॉल को ओपी में एक टिप्पणी में कहा कि उसने अपना स्वयं का समाधान पाया और सिर्फ एक जवाब स्वीकार किया जो कि हम में से किसी की मदद नहीं कर रहा था ... फिर खोज के बाद और फ़ाइल_put_contents बनाने के लिए सफलता के बाद मैंने अपना समाधान साझा करने का फैसला किया।

मेरी फ़ाइलें और निर्देशिका की अनुमतियों (सुनिश्चित करें कि आपके निर्देशिका chmod 757 हैं इस स्थान में फ़ाइलों को लिखने के लिए रूट और दूसरों अनुदान दे देंगे बनाने के) किसी भी लेखन स्वीकार करने के लिए ठीक थे। यदि यह अभी भी काम नहीं करता है तो यह मेरे लिए नहीं था, ऐसा इसलिए है क्योंकि आपका सिस्टम शायद SELinux (सुरक्षा उन्नत लिनक्स) सिस्टम है।

यदि आप यह सुनिश्चित करना चाहते हैं कि setenforce 0 लिखें तो यह सेलिंक्स को अनुमोदित मोड में बदल देगा, अगर यह काम करता है तो आपकी स्क्रिप्ट फिर से चलाएं, इसका मतलब है कि समस्या अच्छी तरह से वर्णित है।

उस मामले में selinux को setenforce 1 पर चालू करें और निर्देशिका में ls -Zl को आजमाएं जहां आपकी परियोजना की निर्देशिका है।यह आप

drwx---r-x. 9 root root system_u:object_r:httpd_sys_content_t:s0 4096 Dec 8 00:25 project 

या कुछ और लेकिन httpd_sys_content_t तरह की एक पंक्ति दे अगर आप इस पर एक डायरेक्टरी से संदर्भ हस्तांतरण करने के लिए प्रयोग किया जाता है chcon होगा। लेकिन अगर आपके पास httpd_sys_content_t नहीं है तो यह ठीक है क्योंकि हमें उस निर्देशिका के संदर्भ को किसी भी तरह से बदलने की आवश्यकता है।

पहले आप फ़ाइल में लिखने के लिए किसी भी public_content_rw_t संदर्भों को स्वीकार करने की जरूरत है। टाइप

setsebool -P httpd_anon_write on 

यह (पी) को सही पर ermanently SELinux बुलियन httpd_anon_write और किसी भी संदर्भ public_content_rw_t के रूप में करार दिया अपने स्वयं के स्थान में किसी भी फाइल लिखने के अधिकार होंगे सेट हो जाएगा।

अब आप SELinux कहना है कि अपनी परियोजना निर्देशिका public_content_rw_t है या आप अभी भी नहीं फ़ाइलें लिखने में सक्षम हो जाएगा। प्रकार:

semanage fcontext --add --type public_content_rw_t "/project(/.*)?" 

और restorecon -RvF /projectSELinux बताने के लिए ऊपर विनिर्देशों लागू करने के लिए।

अब आपकी निर्देशिका public_content_rw_t है और आपको फ़ाइलों को लिखने में सक्षम होना चाहिए।

-1

मैं यकीन है कि ध्यान दें कि यदि मेरी समाधान वास्तव में स्पष्ट है, लेकिन यह काम किया:

cd /mydir/ 
setsebool -P allow_httpd_anon_write true 

सादर

0

मैं इस समस्या में भी भाग गया। मेरे मामले में, मैंने पाया कि निर्देशिका का स्वामित्व गलत था। एक विशिष्ट अपाचे स्थापना के लिए निर्देशिका www-data: www-data के स्वामित्व में होनी चाहिए, रूट नहीं: रूट।

+0

यह प्रश्न का उत्तर नहीं देता है। एक बार आपके पास पर्याप्त [प्रतिष्ठा] हो (https: // stackoverflow।कॉम/हेल्प/व्हाट्स-प्रतिष्ठा) आप [किसी भी पोस्ट पर टिप्पणी कर सकते हैं] (https://stackoverflow.com/help/privileges/comment); इसके बजाय, [उन उत्तरों को प्रदान करें जिन्हें पूछताछ से स्पष्टीकरण की आवश्यकता नहीं है] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-कर-बजाय)। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/17017422) –

संबंधित मुद्दे