2012-05-25 20 views
13

मैं php fopen फ़ंक्शन के साथ मेरी/tmp निर्देशिका (अपाचे सर्वर पर) फ़ाइल लिखने की कोशिश कर रहा हूं, लेकिन यह विफल रहता है:777 अनुमतियों के बावजूद php के साथ/tmp पर नहीं लिख सकता है और कोई open_basedir मान

<?php 
$handle = fopen("/tmp/test.txt", "x"); 
if ($handle) echo "Success!"; 
else print_r(error_get_last()); 
?> 

यह त्रुटि संदेश देता है "स्ट्रीम खोलने में विफल: ऐसी कोई फ़ाइल या निर्देशिका नहीं"।/Tmp निर्देशिका में अनुमतियां drwxrwxrwt पर सेट हैं और मैं देख सकता हूं कि वेब उपयोगकर्ता अन्य फाइलें लिख रहा है। रहस्यमय रूप से, अगर मैं अनुमति 777 के साथ स्क्रिप्ट को किसी अन्य फ़ोल्डर में इंगित करता हूं, तो यह सफलता देता है। लेकिन मेरे open_basedir के पास "कोई मूल्य नहीं है"। मेरे पास safe_mode = चालू है और allow_url_fopen = off है, लेकिन मुझे नहीं लगता कि इसे समझाया जाना चाहिए?

यह apache 2.0 पर php 5.3.10 है।

+2

'test.txt' मौजूद है? – maialithar

+0

नहीं, उपरोक्त स्क्रिप्ट का बिंदु यह जांचना है कि क्या मैं अपने/tmp फ़ोल्डर में फाइलें बना सकता हूं। मैंने स्क्रिप्ट को 'एक्स' और 'डब्ल्यू' झंडे दोनों के साथ करने की कोशिश की है। –

+1

शायद chrooted? – Robus

उत्तर

0

प्रदर्शित त्रुटि संदेश के अनुसार, कोई फ़ोल्डर /tmp/ नहीं है। शायद टीएमपी फ़ोल्डर रूट से कहीं और है?

यह त्रुटि तब दिखाई नहीं देगी जब फ़ाइल वास्तव में मौजूद नहीं है, क्योंकि यह इसे बनाने का प्रयास करेगी।

विधि x फ़ाइल पहले से मौजूद होने पर भी चेतावनी देता है। (Doc: http://www.php.net/manual/en/function.fopen.php)

मैं यह भी एक और कारण यह गलत हो सकता है के लिए चला जाता है लगता है, उपयोगकर्ता जो कार्यान्वित पीएचपी /tmp/ फ़ोल्डर में लिखने के लिए अधिकार नहीं है।

+0

जैसा कि मैंने इस प्रश्न में लिखा था, मेरे सर्वर पर/tmp नामक एक फ़ोल्डर है, हां यह रूट पर रहता है, और जो मैं उपयोगकर्ता को बता सकता हूं कि php निष्पादित करता है, वह फ़ाइलों को लगातार/tmp फ़ोल्डर में लिखता है। –

0

/tmpopen_basedir जोड़ने का प्रयास करें। उदाहरण के लिए:

php_admin_value open_basedir /some/path:/another/path:/tmp 

मुझे यकीन है कि इस समस्या को आप वास्तव में सामना करना पड़ा है नहीं कर रहा हूँ, लेकिन इतना मुझे लगता है कि किसी और मदद कर सकता है मैं आपके सवाल का पाया, जबकि इस समाधान की तलाश में।

17

मुझे बिल्कुल वही समस्या मिली है। PHP ने /tmp/myoutputfile में फ़ाइल खोलने में कोई समस्या नहीं दी, लेकिन उस पथ में कोई फ़ाइल नहीं। तब मैंने find/-name "myoutputfile" किया और इसे /tmp/systemd-.../myoutputfile में मिला। Google को http://blog.oddbit.com/2012/11/05/fedora-private-tmp/ मिला। तो मेरी स्थिति में यह systemd + apache संयोजन है। उम्मीद है कि इससे किसी की मदद मिलेगी।

+1

मैं CentOS का उपयोग कर रहा हूं और फ़ाइलों को '/ tmp' पर लिखकर एक स्क्रिप्ट का परीक्षण कर रहा था। मैं कमांड लाइन से '/ tmp' ब्राउज़ कर रहा था और उन्हें नहीं मिला। वे एक 'systemd- निजी ...' फ़ोल्डर में थे! –

+2

यह व्यवहार क्यों है? –

+0

PHP से इस "निजी फ़ोल्डर" के पूरे पथ से प्राप्त करने का कोई तरीका है? (मेरा मतलब है "/tmp/systemd-private-b6fcf4393484blahblah87c822516fdfb-plesk-php70-fpm.service-OWpvrW/") – OMA