2013-08-20 5 views
6

मेरी फ़ार स्क्रिप्ट fwrite के साथ एक नई फ़ाइल बनाता है, जो ठीक काम करता है, यह फ़ार फ़ाइल के समान निर्देशिका में फ़ार के बाहर नई फ़ाइल बनाता है।PHP फ़ार - file_exists() समस्या

लेकिन फिर जब मैं उपयोग करता हूं (file_exists ('file.php')) यह इसे नहीं उठाता है।

लेकिन फिर इसमें शामिल हैं और इसे लेने की आवश्यकता है।

कोई भी इस समस्या के बारे में जानता है? थोड़ी देर के लिए परीक्षण और शोध किया गया था, एक समाधान खोजने के लिए प्रतीत नहीं होता है।

+0

PHP का संस्करण क्या है? "ध्यान दें:: यूआरएल रैपर केवल verions पर => पीएचपी 5.0.0 –

+0

आप के लिए [' file_exists() '] (http://php.net/file_exists) प्रलेखन से निम्नलिखित सिफारिश करने की कोशिश की हो सकता है इस समारोह के परिणाम कैश किए गए हैं। अधिक जानकारी के लिए clearstatcache() देखें। " –

+0

हां, मैं clearstatcache की कोशिश की है() - लेकिन कैश में संग्रहीत हैं 'के रूप में मौजूद है' और मेरी समस्या यह है कि इसकी यह नहीं मिल रहा है - तो वह निश्चित रूप से दोषी नहीं है। – Lan

उत्तर

4

फ़ाइल पथ और फर अभिलेखागार

फ़ाइल पथ और PHP में फर अभिलेखागार के साथ कार्य करना के साथ कार्य करना मुश्किल हो सकता है। एक फ़ार फ़ाइल के अंदर PHP कोड वर्तमान कार्य निर्देशिका के सापेक्ष फारस संग्रह, से संबंधित रिश्तेदार पथों का इलाज करेगा। यहाँ एक छोटी उदाहरण है:

आपको निम्न फ़ाइलों है कहते हैं:

phar/index.php 
test.php 
my.phar 

index.php फ़ाइल phar निर्देशिका के अंदर स्थित है।

function does_it_exist($file){ 
    return file_exists($file) ? "true" : "false"; 
} 

बूटस्ट्रैप फ़ाइल जब phar फ़ाइल एक PHP स्क्रिप्ट से शामिल किया गया है निष्पादित किया जाता है: यह phar संग्रह के लिए बूटस्ट्रैप फ़ाइल है। हमारी बूटस्ट्रैप फ़ाइल केवल "does_it_exist" फ़ंक्शन घोषित करने का कारण बन जाएगी।

के test.php के अंदर अलग कोड चलाने की कोशिश करें और देखें कि क्या परिणाम प्रत्येक रन के लिए कर रहे हैं: भागो 4. पर

//Run 1: 
require_once 'phar/index.php'; //PHP file 
$file = __DIR__ . "/index.php"; //absolute path 
echo does_it_exist($file);  //prints "false" 

//Run 2: 
require_once 'phar/index.php'; //PHP file 
$file = "index.php";   //relative path 
echo does_it_exist($file);  //prints "false" 

//Run 3: 
require_once 'my.phar';   //phar file 
$file = __DIR__ . "/index.php"; //absolute path 
echo does_it_exist($file);  //prints "false" 

//Run 4: 
require_once 'my.phar';   //phar file 
$file = "index.php";   //relative path 
echo does_it_exist($file);  //prints "true" 

देखो इस कोड phar फ़ाइल भी शामिल है और समारोह एक रिश्तेदार पथ से गुजरता है। वर्तमान कार्यशील निर्देशिका से संबंधित, index.php मौजूद नहीं है। लेकिन फार संग्रह की सामग्री के सापेक्ष, यह अस्तित्व में है, यही कारण है कि यह "सच" प्रिंट करता है!

+0

मुझे पता है, मुझे पता है। सवाल नहीं है। मेरा फ़ार पैकेज fwrite का उपयोग कर फ़ार स्क्रिप्ट के बाहर एक नई फ़ाइल बनाता है। यह पूरी तरह से काम करता है, एक नई फाइल बनाई गई है। और इस नए बाद में पढ़ा जा सकता है द्वारा शामिल या आवश्यकता होती है, लेकिन यह नहीं कर सकते "देखा" जा file_exists द्वारा - जो मेरी समस्या है - मुझे लगता है कि यह phar – Lan

+0

में एक बग @Lan जवाब दिया आप – Vineet1982

+0

धन्यवाद क्वेरी हो सकता है, लेकिन अगर ('लॉगिन शामिल .php लॉगिन ') या (की आवश्यकता होती है'।php ') दोनों फ़ाइल को ढूंढ और पढ़ते हैं, निश्चित रूप से अगर (file_exists (' login.php ')) सत्य वापस आ जाएगा - निश्चित रूप से इस तथ्य से कि इसमें शामिल/आवश्यकताएं शामिल हैं, फ़ाइल पथ/स्थान सही है, और इसलिए मुद्दा नहीं है? – Lan

1

सुनिश्चित नहीं हैं कि file_exists() विफल कर रही है, लेकिन आप इस

function fileExists($path){ 
    //try to open the file, if it can be read the file exist 
    return (@fopen($path,"r") == true); 
} 
+1

आह अच्छा विचार। धन्यवाद। क्या मुझे इसे और अधिक वैध रखने के लिए बाद में इसे फ्लेक्स करना होगा? – Lan

+1

हां संभोग! यदि फॉपेन फ़ंक्शन सफल होता है तो आप इसे बाद में बंद कर सकते हैं। फ़ाइल खोलें, अगर यह फ़ाइल बंद हो जाती है और सत्य लौटती है, तो झूठी वापसी करें। – Konsole

2

php में file_exists की तरह कुछ कोशिश कर सकते हैं कई मुद्दों, विशेष रूप से मामलों में है।

मैं तुम्हें stat() बजाय का उपयोग करने के, जो आमतौर पर है कि जानकारी,
न सिर्फ php में प्राप्त करने के लिए जिस तरह से preffered है सलाह देते हैं। clearstatcache() पर कॉल करके कैश को साफ़ करना भी न भूलें।

function FileExists($filename) 
{ 
    clearstatcache(false, $filename); 

    return false !== @stat($filename); 
} 

नोट: मैं के रूप में ज्यादा के रूप में मैं कर सकते हैं दबाने ऑपरेटर @ से बचने की कोशिश, लेकिन मैं इस विशेष मामले को देखने के रूप में आवश्यक यह PHAR के ठूंठ पर उपयोग करने के लिए :)

7

, आप __DIR__ जादू का उपयोग कर सकते PHAR फ़ाइल के फ़ोल्डर को प्राप्त करने के लिए निरंतर।

इसी के साथ

मन में, आप बस

is_file(__DIR__ . DIRECTORY_SEPARATOR . $path); 

का उपयोग PHAR बाहर एक फ़ाइल के अस्तित्व के लिए जाँच करने के लिए कर सकते हैं।

आप केवल स्टब से ऐसा कर सकते हैं, और केवल अगर यह कस्टम स्टब है, तो फ़ार :: setDefaultStub() द्वारा उत्पन्न एक के विपरीत। यदि आपको लाइन के नीचे फ़ाइलों की जांच करने की आवश्यकता है, तो आपको उस स्थिरता के मूल्य को किसी भी तरह उपलब्ध करना होगा, जैसे वैश्विक वैरिएबल, एक कस्टम गैर-जादुई स्थिर या स्थैतिक संपत्ति या कुछ, जो अन्य फाइलें तब परामर्श लेती हैं।

संपादित करें: दरअसल, आप PHAR के फ़ोल्डर को PHAR में कहीं से भी प्राप्त करने के लिए dirname(Phar::running(false)) का उपयोग भी कर सकते हैं। यदि आप PHAR के भीतर नहीं हैं, तो यह फ़ंक्शन एक खाली स्ट्रिंग देता है, इसलिए क्या आपका एप्लिकेशन PHAR या सीधे के रूप में निष्पादित किया गया है, इसे ठीक काम करना चाहिए, उदा।

$pharFile = Phar::running(false); 
is_file(('' === $pharFile ? '' : dirname($pharFile) . DIRECTORY_SEPARATOR) . $path) 
2

मैं Phar::interceptFileFuncs() पर कॉल करके इस व्यवहार को पुन: उत्पन्न कर सकता हूं। ऐसा लगता है कि fopen कॉल मोड में कॉल अवरुद्ध नहीं हैं, जबकि स्टेट-संबंधित फ़ंक्शन हैं।

के बाद से पूर्ण फ़ाइल नाम फर अभिलेखागार में भी फाइल सिस्टम से संबंधित के रूप में इलाज कर रहे हैं कि अवरोधन फ़ाइल कार्य:

[...] निरपेक्ष पथ फाइल सिस्टम से बाहरी फ़ाइलें लोड करने का प्रयास माना जाता है। समस्या से निपटने के

... एक तरह से realpath() उपयोग करने के लिए है:

if (file_exists(realpath($filename)) { /* file exists on filesystem */ } 
4

मैं आज एक ही मुद्दे को पूरा। कई घंटों खोदने के बाद ... मुझे जवाब मिला।

क्या आप पहले निम्न स्क्रिप्ट का प्रयास कर सकते हैं?

if(file_exists(realpath('file.php'))); 

फ़ाइल मौजूद है, तो इस मुद्दे को

यदि आप पथ जानकारी, php इलाज फ़ाइल phar ठूंठ से संबंधित है के बिना केवल फ़ाइल नाम का उपयोग है। उदाहरण के लिए:

phar:///a/b/c/file.php

तो, आप निरपेक्ष पथ का उपयोग करने के उदाहरण के लिए फ़ाइल में हेरफेर करने, है:

/home/www/d/e/f/file.php

आशा इस मदद करते हैं।

मार्क

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