2012-03-16 7 views
18

में अनुमति अस्वीकार है मैं एक केकेपीएचपी 2 प्रोजेक्ट पर काम कर रहा हूं। यह मूल रूप से 2.0.x में शुरू हुआ और फिर हाल ही में 2.1.0 पर माइग्रेट हो गया। पूरे विकास प्रक्रिया के दौरान, मुझे नीचे त्रुटि संदेश प्राप्त हो रहा है।SplFileInfo :: openFile (/ app/tmp/cache/persistent/cake_core_cake_console _): स्ट्रीम खोलने में विफल: अनुमति /lib/.../FileEngine.php लाइन 293

यह पृष्ठ के शीर्ष पर अप्रत्याशित रूप से पॉप अप करता है। यह तब हो सकता है जब मैं अलग-अलग पेज देख रहा हूं, या डेटाबेस में रिकॉर्ड जोड़ने के बाद भी (अभी तक रिकॉर्ड ठीक से बचाता है)।

Warning: 
SplFileInfo::openFile(/var/www/cake_prj/app/tmp/cache/persistent/cake_core_cake_console_): 
failed to open stream: 
Permission denied in 
    /var/www/cake_prj/lib/Cake/Cache/Engine/FileEngine.php on line 293 

मैंने फिर से tmp फ़ोल्डर के मालिक और समूह को अपाचे में सेट किया, और अभी भी संदेश प्राप्त हुआ। इसके अलावा, मैं फिर सभी के लिए पढ़ने, लिखने और निष्पादित करने के लिए अनुमतियों को दोबारा सेट करता हूं (chmod 777)। त्रुटि संदेश अभी भी पॉप अप है।

यहां तक ​​कि प्रश्न में दोनों स्वामी, समूह, और अनुमतियाँ, फ़ाइल बदलने के बाद:

cake_prj/app/tmp/cache/persistent/cake_core_cake_console_ 

उसके मालिक और समूह वापस जड़ करने के लिए सेट है, और इसकी अनुमतियों वापस डिफ़ॉल्ट पर सेट करना होगा।

इस समस्या का कारण क्या हो सकता है? यह सुनिश्चित करने का कोई तरीका है कि हर बार जब यह फ़ाइल जेनरेट की जाती है, तो यह हमेशा अपाचे होगा: पढ़ने/लिखने/निष्पादित अनुमतियों के साथ अपाचे?

उत्तर

13

वहां एक बग रिपोर्ट थी http://cakephp.lighthouseapp.com/projects/42648/tickets/2172 लेकिन इसे एक बग नहीं माना जाता था।

जो मैंने व्यक्तिगत रूप से देखा है वह है कि जब आप कंसोल में cake स्क्रिप्ट का उपयोग करते हैं तो कुछ फ़ाइल स्वामी को संशोधित किया जा सकता है (उदाहरण के लिए bake बनाने के लिए)। संशोधित फ़ाइलें तब उस उपयोगकर्ता से संबंधित होती हैं जिसका आप कंसोल में उपयोग करते हैं।

क्या इसका मतलब यह होगा कि आप रूट होने के दौरान cake पर कॉल करेंगे? या क्या आपके पास कोई रूट क्रॉन जॉब है जो केक खोल स्क्रिप्ट को कॉल करता है?

व्यक्तिगत रूप से अब chmod स्क्रिप्ट का उपयोग करने के बाद पूरी टीएमपी फ़ोल्डर सामग्री अपाचे उपयोगकर्ता पर आदत है और ऐसा लगता है कि चेतावनी प्रकट होने से रोका जा सकता है।

+0

एनआईसीओओ पर प्रतिक्रिया के लिए धन्यवाद। रूट के रूप में लॉग इन करते समय मैं केक कॉल करता हूं। हालांकि मैंने अपने पूरे टीएमपी फ़ोल्डर को अपने मालिक और समूह को 'अपाचे: अपाचे' के रूप में सेट करने के लिए सेट किया है, और उसके बाद पूरे फ़ोल्डर को फिर से chmod 777' सेट किया है। और फिर मैं केक सेंकना चला गया लेकिन बाद में, अनुमतियां अभी भी सही ढंग से सेट की गई थीं। तो 'केक' स्क्रिप्ट ऐसा नहीं प्रतीत होता है। –

+0

मुझे यकीन नहीं है कि जब भी आप 'केक' स्क्रिप्ट का उपयोग करते हैं तो यह फ़ाइलों को पुन: उत्पन्न करता है। इसलिए यह हमेशा रूट से संबंधित फाइलों को फिर से नहीं बना सकता है, भले ही यह उपयोगकर्ता आप उपयोग करते हैं। वैसे, आपको शायद 'केक' कॉल करने के लिए 'रूट' का उपयोग नहीं करना चाहिए। – nIcO

+0

हाल ही में नहीं हुआ है और मैंने हाल ही में 'केक' नहीं चला है इसलिए मुझे आश्चर्य है कि क्या यह समस्या थी। मैं इसका पालन करता हूं और देखता हूं कि यह फिर से होता है या नहीं। –

24

आप CakePHP2 में SplFileInfo त्रुटि सामना कर रहे हैं core.php

Cache::config('default', array(
    'engine' => 'File', 
    'mask' => 0666, 
)); 
+0

क्या आपको लगता है कि आप मुझे समझा सकते हैं कि यह क्या करता है? –

+1

मैंने अभी एक ही मुद्दे में भाग लिया है और यह मेरे लिए इसे ठीक करना प्रतीत होता है। जैसा कि मार्क स्टोरी बताता है: "अनुमतियों के मुद्दों की तरह लगता है। ऐसा तब हो सकता है जब आपकी क्ली और अपाचे उपयोगकर्ता अलग हों, या आपका उमास्क पर्याप्त अनुमत नहीं है।"वर्कअराउंड ऊपर और यहां वर्णित 'मास्क' विकल्प का उपयोग करना प्रतीत होता है http://cakephp.lighthouseapp.com/projects/42648/tickets/2172 – BeesonBison

+2

मुझे लगता है कि यह bootstrap.php में जाना चाहिए core.php –

0

में अपने config करने के लिए एक मुखौटा जोड़कर इस हल कर सकते हैं और आप पूरी तरह निश्चित है कि आपकी फ़ाइल/निर्देशिका अनुमति सेट कर रहे हैं कर रहे हैं ठीक से ऊपर, फिर जांचने के लिए एक और चीज आपका PHP संस्करण है। केक 2 को PHP 5.2.8 या इससे अधिक की आवश्यकता होती है और यदि आप गलत संस्करण का उपयोग कर रहे थे तो आपको आमतौर पर डिफ़ॉल्ट पृष्ठ पर सतर्क किया जाएगा, अगर आप एक ऐप पर अपना ऐप विकसित करेंगे और फिर इसे दूसरे पर ले जाएंगे तो आपको सतर्क नहीं किया जाएगा ।

मुझे PHP5.3 सर्वर पर केक 2 ऐप के विकास के बाद और फिर इसे PHP 5.1 सर्वर पर ले जाने के बाद इस त्रुटि का अनुभव हुआ। 5.2.17 (जो 5.2.8 से ऊपर है) में अपग्रेड करने से समस्या हल हो गई।

+0

हो सकता है कि सर्वर ने कुछ बार बदल दिया हो लेकिन मेरा मानना ​​है कि जिस सर्वर पर यह चल रहा था, हमेशा न्यूनतम PHP आवश्यकताएं थीं (वर्तमान में सर्वर में 5.3.3 है)। ध्यान देने योग्य एक बात यह है कि ऐसा लगता है कि जब मैं एक संस्करण चलाता हूं एक आभासी मशीन पर ऐप। मुझे यकीन नहीं है कि यह किसी और चीज को इंगित करता है? –

0

इसका उपयोग करें ..

chgrp -R www-data app/tmp 
chmod -R g+rw app/tmp 
find app/tmp -type d -exec chmod g+s {} \; 

अपाचे उपयोगकर्ता के लिए निर्देशिका के समूह की स्थापना और उसके बाद setgid बिट की स्थापना:

cd cakephp/app/tmp/cache/persistent 

sudo chmod 666 myapp* 

cd .. 

cd models 

sudo chmod 666 myapp* 
+0

यह एक बहुत बड़ा सुरक्षा छेद जैसा लगता है यदि आप अपने कैश को पठनीय और हर किसी के द्वारा लिखने योग्य बनाते हैं। –

7
इसके बजाय tmp/कैश निर्देशिका मैं ऐसा किया पर हर किसी के लिए दे रही है/लिखने पढ़ने की पहुंच स्थापित करने की

आपको यह सुनिश्चित करने की अनुमति देगा कि उस निर्देशिका में बनाई गई फ़ाइलों को उचित समूह अनुमतियां मिलें, भले ही उपयोगकर्ता शेल स्क्रिप्ट चलाता हो। यह आपको "अन्य" उपयोगकर्ताओं को पढ़ने/लिखने की अनुमतियों को बाहर करने की अनुमति देता है।

2

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

crontab -u www-data -e 

इस जवाब How to specify in crontab by what user to run script? से लिया गया

0

आपको वेबसर्वर द्वारा ऐप/टीएमपी निर्देशिका लिखने योग्य बनाने की आवश्यकता है। पता लगाएं कि आपका वेबसर्वर किस उपयोगकर्ता (मेरे मामले में _www) चलाता है और उस उपयोगकर्ता को ऐप/टीएमपी निर्देशिका का स्वामित्व बदलता है: $ chown -R _www app/tmp

0

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

निम्नलिखित के रूप में, प्रत्येक उप कैश निर्देशिका php एपीआई हैंडलर के प्रकार से परिभाषित किया गया है:

define('CACHE', TMP . 'cache' . DS . php_sapi_name() . DS); 
  • जब ब्राउज़र वेबसाइट, सक्रिय उपयोगकर्ता अपाचे है। और उप निर्देशिका कैश/apache2handler है।
  • जब बैच चलाते हैं, तो सक्रिय उपयोगकर्ता रूट या लॉग-इन उपयोगकर्ता होता है। और उप निर्देशिका कैश/क्ली है।

अन्य पक्ष, वर्तमान उपयोगकर्ता खाते का उपयोग उप निर्देशिका नाम के लिए किया जा सकता है। How to check what user php is running as?

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

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