Hindi (हिंदी) translation by Ashish Rampal (you can also view the original English article)
इस ट्यूटोरियल में, आप PHP में कई महत्वपूर्ण फ़ंक्शंस सीखेंगे जो आपकी सभी बेसिक फ़ाइल पढ़ने और लिखने की ज़रूरतों के लिए पर्याप्त हैं। आप सीखेंगे कि फाइल को कैसे पढ़ा जाए, फ़ाइल में लिखा जाए, टेक्स्ट फ़ाइल में कैसे लिखा जाए, और जांचें कि फाइल मौजूद है या नहीं।
सौभाग्य से, PHP फ़ाइलों को डेटा पढ़ने और लिखने के लिए बहुत सारे फंक्शन प्रदान करता है। इस ट्यूटोरियल में, मैं आपको लोकल या रिमोट फ़ाइल से डेटा पढ़ने और फ़ाइलों को लिखने के लिए फ्लैग का उपयोग करने का सबसे आसान तरीका दिखाऊंगा जो हम चाहते हैं।
यह जांचना कि कोई फ़ाइल मौजूद है या नहीं
फ़ाइल से डेटा पढ़ने या इसे लिखने का प्रयास करते समय आपका पहला कदम यह जांचना होना चाहिए कि फ़ाइल पहले से मौजूद है या नहीं। एक फ़ाइल से डेटा पढ़ने की कोशिश करना जो अस्तित्व में नहीं है जिसके परिणामस्वरूप PHP से वार्निंग मिलेगी और शायद आपके कोड को क्रैश कर देगा।
फाइल फ़ाइल मौजूद है या नहीं, यह जांचने का सबसे आसान तरीका पहप के file_exists($filename)
फ़ंक्शन का उपयोग करना है। यह true
होगा यदि दिए गए $filename
के साथ कोई फ़ाइल या डायरेक्टरी मौजूद है और अन्यथा false
होगा। यह स्पष्ट हो सकता है, लेकिन मैं यह पॉइंट आउट करना चाहता हूं कि $filename
को केवल फ़ाइल का नाम नहीं होना चाहिए। यह एक अब्सोल्युट या रिलेटिव पाथ भी हो सकता है। उदाहरण के लिए, हम prim_numbers.txt या science/project/periodic_table.txt का उपयोग कर सकते हैं।
यह भी याद रखना महत्वपूर्ण है कि यह फ़ंक्शन उन फ़ाइलों के लिए भी false
रीटर्न करेगा जो सेफ मोड की रेस्ट्रिक्शन के कारण एक्सेस नहीं किया जा सकता हैं।
फ़ाइल का एक्सिस्टेंस जांचने के लिए आप एक अन्य फ़ंक्शन का उपयोग कर सकते हैं is_file()
। file_exists()
के विपरीत, यह फ़ंक्शन केवल तभी true
होगा जब बताया गया पाथ किसी फ़ाइल को पॉइंट करता है न कि डायरेक्टरी को।
यह सुनिश्चित करना कि फ़ाइल वास्तव में मौजूद है
यदि आप जो कोड लिख रहे हैं, वह किसी विशेष फ़ाइल पर बहुत से फ़ाइल ऑपरेशन करता है, तो आपको ऊपर दिए गए फंक्शन का उपयोग करके गलत परिणाम मिल सकते हैं। ऐसा इसलिए है क्योंकि परफॉरमेंस को सुधारने के लिए file_exists()
और is_file()
दोनों के एक्सेक्यूशन के परिणाम कैश किए गए हैं। PHP filesize()
, filemtime()
इत्यादि जैसे अन्य फाइलसिस्टम फंक्शन द्वारा रीटर्न की गयी वैल्यूज को भी कैश करता है।
आप यह सुनिश्चित करने के लिए clearstatcache()
को कॉल कर सकते हैं कि फ़ाइल के लिए आप जिस भी जानकारी तक पहुंच रहे हैं वह अप टू डेट है।
यह आमतौर पर केवल एक समस्या है यदि एक ही स्क्रिप्ट में एक ही फ़ाइल को कई बार एक्सेस किया जा रहा है ताकि उसके स्टेटस को जान सकें। साथ ही, यदि आप unlink()
फ़ंक्शन का उपयोग करके स्क्रिप्ट के अंदर फ़ाइल को हटाते हैं तो कैश किए गए डेटा को साफ़ कर दिया जाता है। इसका मूल रूप से मतलब है कि आपको शायद किसी भी कैशिंग से संबंधित समस्याओं का सामना नहीं करना पड़ेगा, लेकिन यह जानना अभी भी अच्छा है कि जानकारी के बावजूद आप कैश को साफ़ कर सकते हैं या फ़ाइल के बारे में जानकारी तक पहुंचने का प्रयास करते समय आपको अप्रत्याशित परिणाम मिल रहे हैं।
PHP में एक फ़ाइल से डेटा पढ़ना
PHP में फ़ाइल से डेटा पढ़ने के सबसे आसान तरीकों में से एक file_get_contents($filename, $use_include_path, $context, $offset, $maxlen)
फ़ंक्शन की सहायता से है। यह बस पूरी फाइल को पढ़ेगा और इसे स्ट्रिंग के रूप में आपको देगा। पहले को छोड़कर सभी पैरामीटर ऑप्शनल हैं।
दूसरा पैरामीटर यह निर्धारित करने के लिए एक बूलियन वैल्यू स्वीकार करता है कि क्या उसे इंक्लूड पाथ द्वारा बतायी गयी लोकेशन में फ़ाइल की तलाश करना चाहिए, जिसे set_include_path()
फ़ंक्शन का उपयोग करके सेट किया जा सकता है।
फ़ाइलों को एक्सेस करने के तरीके को रीफाइन करने के लिए ऑप्शंस का एक ग्रुप निर्दिष्ट करने के लिए आप तीसरे पैरामीटर का उपयोग कर सकते हैं। आप इसे हेडर वैल्यू जैसे कुकीज
और होस्ट
के साथ-साथ HTTP मेथड निर्दिष्ट करने के लिए भी उपयोग कर सकते हैं।
$offset
पैरामीटर उस पॉइंट को निर्धारित करता है जहां ओरिजिनल फ़ाइल पर पढ़ना शुरू होता है। नेगेटिव वैल्यू प्रदान करने पर यह अंत से गिनना शुरू कर देगा। नेगेटिव ऑफसेट के लिए सपोर्ट केवल PHP 7.1.0 में जोड़ा गया था। यह ध्यान देने योग्य है कि ऑफ़सेट केवल लोकल फ़ाइलों के साथ काम करता है और रिमोट फ़ाइलों के लिए सपोर्टेड नहीं है।
file_get_contents()
फ़ंक्शन पूरी फ़ाइल को डिफ़ॉल्ट रूप से एक बार में पढ़ता है। आप $maxlen
पैरामीटर के लिए वैल्यू प्रदान करके इस व्यवहार को बदल सकते हैं। पढ़ने के लिए करैक्टर की लेंथ ऑफसेट वैल्यू से गिनी जाती है।
यह फ़ंक्शन false
रीटर्न करेगा अगर यह आपके द्वारा बताई गयी फ़ाइल से डेटा पढ़ने में विफल रहा। हालांकि, यह उन वैल्यूज को भी रीटर्न कर सकता है जो false
का मूल्यांकन करते हैं, इसलिए सुनिश्चित करें कि यह वास्तव में ===
ऑपरेटर का उपयोग करके false रीटर्न कर रहा है या नहीं।
आप रिमोट फाइलों को खोलने के लिए इस फ़ंक्शन का उपयोग कर सकते हैं, लेकिन यह तभी संभव होगा जब php.ini में allow-url-fopen
ऑप्शन की वैल्यू true
है या 1
।
PHP में एक फ़ाइल में डेटा लिखना
PHP में फ़ाइल में डेटा लिखने का सबसे आसान तरीका file_put_contents($filename, $data, $flags, $context)
फ़ंक्शन की सहायता से है।
$filename
पैरामीटर उस फ़ाइल को निर्धारित करता है जिसमें डेटा लिखा जाएगा। दूसरा पैरामीटर वह डेटा है जिसे आप फ़ाइल में लिखना चाहते हैं। अधिकांश समय यह एक स्ट्रिंग होगा, लेकिन यह एक ऐरे या स्ट्रीम रिसोर्स भी हो सकता है।
याद रखें कि PHP आटोमेटिक रूप से आपके लिए दिए गए नाम के साथ एक फ़ाइल बना देगा यदि यह पहले से मौजूद नहीं है। हालांकि, यह आपके लिए कोई डायरेक्टरी नहीं बनाएगा। इसका मतलब यह है कि आप बिना किसी एरर के On the Origin of Species [Charles Darwin].txt नाम से फाइल को स्टोर कर सकते हैं। हालांकि, Biology/Evolution/On the Origin of Species [Charles Darwin].txt पर $filename
सेट करना, यदि Biology/Evolution/ पहले से मौजूद नहीं है, तो परिणामस्वरूप एक एरर होगा।
$flags
पैरामीटर निर्धारित करता है कि कंटेंट को फ़ाइल में कैसे लिखा जाएगा। इसमें निम्न तीन वैल्यूज में से कोई भी या सभी हो सकती हैं:
-
FILE_USE_INCLUDE_PATH
— यह इंक्लूड डायरेक्टरी में दिए गए फ़ाइल नाम की खोज करने के लिए PHP को बताता है। -
FILE_APPEND
—यह PHP में आपके द्वारा फ़ंक्शन में मौजूद डेटा को फ़ाइल में मौजूदा डेटा में जोड़ने के लिए बताएगा। यह उपयोगी हो सकता है यदि आप लॉग या पर्सनल डायरी जैसी फ़ाइल में डेटा स्टोर कर रहे हैं। आपके द्वारा किए गए टेम्प्रेचर या इवेंट्स जैसे नए डेटा को रिकॉर्ड करना आज आपके द्वारा रिकॉर्ड की गई कुछ चीज़ों को ओवरराइट नहीं करेगा। -
LOCK_EX
—यह कंटेंट को लिखने से पहले फ़ाइल पर लॉक प्राप्त करने के लिए PHP को बताएगा। यह अप्रत्याशित चीजों को तब रोक सकता है जब दो अलग-अलग स्क्रिप्ट पढ़ रहे हों या उसी फ़ाइल में डेटा लिख रहे हों। इस विशेष वैल्यू के साथ, आपको फ़ाइल पर एक विशेष लॉक मिलेगा। आपflock()
फ़ंक्शन के PHP डॉक्यूमेंटेशन में इन तालो के बारे में अधिक पढ़ सकते हैं।
यह फ़ंक्शन बाइट्स की संख्या रीटर्न करता है जो सफलता पर फ़ाइल में लिखा गया था और विफलता पर false
था। हालांकि, आपको अभी भी सख्त इक्वलिटी ऑपरेटर का उपयोग यह जांचने के लिए करना चाहिए कि क्या यह फ़ाइल में कंटेंट लिखने में सफल रहा है या नहीं। ऐसा इसलिए है क्योंकि फ़ाइल में 0 बाइट्स लिखने वाला कोड अभी भी false मूल्यांकन करेगा।
फ़ाइलों में डेटा को पढ़ना और लिखना
आप Project Gutenberg वेबसाइट पर जा सकते हैं और file_get_contents()
फ़ंक्शन का उपयोग कर फ़ाइलों को डाउनलोड करने का प्रयास कर सकते हैं। एक बार आपके पास स्ट्रिंग में डेटा हो जाने के बाद, आप file_put_contents()
फ़ंक्शन का उपयोग करके इसे लोकल फ़ाइल में भी स्टोर कर सकते हैं। निम्नलिखित उदाहरण यह स्पष्ट करेगा:
<?php $filename = 'http://www.gutenberg.org/cache/epub/1228/pg1228.txt'; $book_content = file_get_contents($filename); file_put_contents('Biology/Evolution/On the Origin of Species [Charles Darwin].txt', $book_content, LOCK_EX); ?>
आप Wikipedia जैसी वेबसाइटों से वेबपेजेज या कंटेंट को इसी तरह से सेव कर सकते हैं। यदि आपको HTML की समझ बनाने की आवश्यकता है या HTML कंटेंट को पार्स करना है जिसे आपने अभी लोकल रूप से सेव किया है, तो आप Parsing HTML With PHP Using DiDOM जैसे ट्यूटोरियल को फॉलो कर सकते हैं, जो आपको लिंक, इमेज फाइल या किसी अन्य ऐसी जानकारी को आटोमेटिक रूप से प्राप्त करने में सहायता करेगा वेबपेज से।
चलिए अब लोकल फाइलों पर वापस आते हैं। ऐसी स्थिति पर विचार करें जहां आपके पास टेक्स्ट फाइलों का बंच है और आप उनके कंटेंट का विश्लेषण उन चीज़ों को देखने के लिए करना चाहते हैं जो उनमें सबसे आम शब्दों की तरह हैं। यह बिल्ट-इन PHP फंक्शन्स का एक बंच का उपयोग करके आसानी से हासिल किया जा सकता है।
<?php $filename = 'On the Origin of Species [Charles Darwin].txt'; $book_content = file_get_contents($filename); $book_content_lowercase = strtolower($book_content); $individual_words = explode(' ', $book_content_lowercase); echo "There are about ".count($individual_words)." words in the book: ".substr($filename, 0, -4).".\n"; $word_frequency = array_count_values($individual_words); echo "Total number of unique words in the book are ".count($word_frequency).".\n"; echo "The word 'Elephant' occurs ".$word_frequency["elephant"]." times in the book.\n"; echo "The word 'Ant' occurs ".$word_frequency["ant"]." times in the book.\n"; if(isset($word_frequency["evolution"])) { echo "The word 'Evolution' occurs ".$word_frequency["evolution"]." times in the book.\n"; } else { echo "The word 'Evolution' does not occur even once in the book.\n"; } arsort($word_frequency); echo "The most used word in the book is: '".key($word_frequency)."'.\n"; /* Output of all the code above There are about 147520 words in the book: On the Origin of Species [Charles Darwin]. Total number of unique words in the book are 22758. The word 'Elephant' occurs 3 times in the book. The word 'Ant' occurs 6 times in the book. The word 'Evolution' does not occur even once in the book. The most used word in the book is: 'the'. ?>
हमने सभी टेक्स्ट को लोअरकेस में परिवर्तित कर दिया और यह धारणा बनाना की हर एक शब्द स्पेस के साथ टूट जाता है। टेक्स्ट को अलग-अलग शब्दों का विश्लेषण करना आसान बनाने के लिए explode()
का उपयोग कर ऐरे में परिवर्तित किया जाता है। हैरानी की बात है कि, "evolution" शब्द का उपयोग पूरी किताब में एक बार भी नहीं किया जाता है जिसने एवोलुशन के सिद्धांत को ओरिजिन बना दिया है।
यह बड़ी मात्रा में टेक्स्ट का आटोमेटिक रूप से विश्लेषण करने का एक उदाहरण था। आप फ़ाइल में स्टोर्ड किसी भी प्रकार के टेक्स्ट के साथ कुछ ऐसा कर सकते हैं।
FILE_APPEND
के साथ डेटा लॉगिंग
एक और उपयोगी उदाहरण छोटी अवधि के दौरान जानकारी लॉगिंग करेगा। यह आपका एक्सरसाइज दिनचर्या, मौसम डेटा, या बी कॉलोनी हो सकता है जिसे आप देख रहे हैं। एक बार आपके पास स्ट्रिंग में डेटा हो जाने के बाद, आप इसे फ़ाइल में आसानी से स्टोर कर सकते हैं और file_put_contents()
के साथ FILE_APPEND
फ्लैग का उपयोग करके इसे मौजूदा डेटा में जोड़ सकते हैं।
<?php $filename = "bee-colony.txt"; $present = date('l | jS \of F Y h:i:s A', time()); $entry = $present."\n"; // A pseudo function which could be replaced with something real. $bee_information = gather_bee_data(); $entry .= "$bee_information.\n\n"; file_put_contents($filename, $entry, FILE_APPEND|LOCK_EX); ?>
इसी तरह के कोड का इस्तेमाल प्रति दिन फ़ाइल में Wikipedia के विशेष रुप से प्रदर्शित आर्टिकल को स्टोर करने या हफ्तों या महीनों के दौरान न्यूज़ आर्टिकल और हैडलाइन का ट्रैक रखने जैसे कुछ के लिए किया जा सकता है। आपको केवल डेटा को स्क्रैप करने के लिए कोड लिखना है और फिर उपरोक्त कोड स्निपेट के सामान कुछ का उपयोग करके इसे स्टोर करना है। Parsing HTML With PHP Using DiDOM जैसा एक ट्यूटोरियल आपको स्क्रैपिंग हिस्से में मदद कर सकता है।
पलाइन फॉर्मेट में टेक्स्ट लिखने के बजाय, आप ब्राउज़र में इसे पढ़ने में आसान बनाने के लिए इसे कुछ HTML में लपेट सकते हैं। संभावनाएं अनंत हैं।
अंतिम विचार
PHP में फ़ाइलों को डेटा पढ़ने और लिखने के कई अन्य तरीके हैं। हालांकि, file_get_contents()
और file_put_contents()
अनावश्यक जटिलताओं को जोड़ने के बिना लगभग आपकी सभी मूलभूत आवश्यकताओं को एड्रेस करेंगे।
file_get_contents()
के साथ आपको एक समस्या का सामना करने का एकमात्र समय यह है कि जब आप जो फ़ाइल पढ़ रहे हैं वह आकार में 2GB या उससे अधिक की तरह है। ऐसा इसलिए है क्योंकि file_get_contents()
पूरी फ़ाइल को मेमोरी में एक बार में लोड करता है, और ऐसी बड़ी फ़ाइलों के साथ मेमोरी से बाहर निकलने का एक अच्छा मौका है। उस स्थिति में, आपको फ़ाइल के एक छोटे से हिस्से को एक बार में पढ़ने के लिए fgets()
और fread()
जैसे फ़ंक्शंस पर भरोसा करना होगा।