एक फ़ंक्शन के गतिशील आउटपुट के आकार को किसी गंतव्य फ़ाइल में तुलना करें, और फिर से लिखें

मेरे पास फॉर्म सेटिंग्स, एक बड़े आकार के आधार पर एक टेक्स्ट फ़ाइल लिखने के लिए एक फ़ंक्शन है।

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

क्या यह करने योग्य है, बीटीडब्ल्यू?

प्रक्रिया है, मैं कुछ रूपों को भरता हूं:

  1. कुछ "विशिष्ट" चयनित विकल्पों

  2. को रखने के लिए एक एकल फ़ाइल लिखा गया है
  3. कुछ "गैर-विशिष्ट" विकल्प फ़ाइल में कुछ भी जरूरी नहीं लिखते हैं।

फॉर्म किसी भी समय अद्यतन करने योग्य है, इसलिए फ़ाइल की सामग्री विभिन्न विकल्पों के आधार पर बढ़ सकती है या घट सकती है।

अगर मैं बिंदु # 1 पर हूं तो इसे केवल फ़ाइल को फिर से लिखना होगा। जब बिंदु # 2 पर, कुछ भी लिखा जाना चाहिए।

मैंने यही कोशिश की:

if ($output != file_get_contents($filepath)) {
 //save the data
}

लेकिन मुझे इसमें निष्पादन में इतनी देरी हुई।

मुझे यहां लगभग एक समान समस्या मिली: क्या मैं file_get_contents का उपयोग कर सकता हूं() दो फाइलों की तुलना करने के लिए? , लेकिन मेरी समस्या अलग है। मेरा प्रक्रिया पहले से मौजूद फाइल में परिणाम की तुलना कर रहा है जो कि पहले प्रक्रिया का परिणाम था। और अगर वे अलग हैं तो फ़ाइल को फिर से लिखें।

फॉर्म पर कोई संवेदनशील डेटा नहीं, बीटीडब्ल्यू। किसी भी संकेत की बहुत सराहना की है।

धन्यवाद

0
जोड़ा संपादित
विचारों: 1

3 उत्तर

पूरी फ़ाइल को मेमोरी में लोड करने के बजाय, इसे लाइन-बाय-लाइन ( fgets ) पढ़ने के लिए तेज़ हो सकता है और इनपुट स्ट्रिंग को लाइन-बाय-लाइन से तुलना करें। आप चरित्र-दर-चरित्र के रूप में भी छोटे हो सकते हैं, लेकिन मुझे लगता है कि यह अधिक है।

0
जोड़ा
वे हैं, लेकिन यदि filepath बहुत बड़ा है, तो इसमें काफी समय लगेगा।
जोड़ा लेखक Explosion Pills, स्रोत
धन्यवाद, लगता है कि दोनों अतुलनीय हैं, है ना?
जोड़ा लेखक swan, स्रोत
हां, आपका मतलब फाइलपैथ की सामग्री है। यह बहुत बड़ा हो सकता है, क्योंकि इसमें वहां लिखे गए फाइलों का एकत्रीकरण होता है। फॉर्म विकल्प ज्यादातर टेक्स्ट फ़ाइलों की कुछ सामग्री कॉपी करने और वहां रखने के लिए ट्रिगर्स करते हैं।
जोड़ा लेखक swan, स्रोत

एक स्ट्रिंग के साथ एक पूरी फ़ाइल की तुलना करने के लिए (मुझे लगता है कि यह एक स्ट्रिंग है, है ना?) एकमात्र तरीका पूरी फाइल को पढ़ने और तुलना करने का एकमात्र तरीका है। प्रदर्शन में सुधार करने के लिए आप लाइन लाइन को लाइन से पढ़ सकते हैं और पहली अलग पंक्ति पर रुक सकते हैं, क्योंकि विस्फोट गोलियाँ ने मेरे सामने कहा था।

यदि आपकी फ़ाइल वास्तव में बड़ी है, और आप प्रदर्शन को बेहतर बनाना चाहते हैं, तो आप कुछ हैशिंग सामग्री कर सकते हैं:

  • Generate the output, let's say $output.
  • Calculate md5($output) and store in $output_md5.
  • Compare $output_md5 with a stored one, let's say in file output.md5.
  • Are they equal?
    • If yes, do nothing.
    • If not, save $output into output.txt and $output_md5 in output.md5.
0
जोड़ा
धन्यवाद, यह लिंक पर सुझाए गए sha1_file() की तरह उचित लगता है।
जोड़ा लेखक swan, स्रोत
विस्तृत चरणों के लिए धन्यवाद।
जोड़ा लेखक swan, स्रोत
किसी भी समय जब आप इसे देखना चाहते हैं तो sha1_file() का उपयोग करके PHP को पूरी फ़ाइल को पढ़ने का कारण बनता है। SHA1 या MD5 (जैसा आप चाहें) और store की गणना करें, इसलिए आपको इसे हर बार फिर से गणना करने की आवश्यकता नहीं है।
जोड़ा लेखक lorenzo-s, स्रोत

sha1 ($ string) फ़ंक्शन के साथ, sha1_file ($ file) फ़ंक्शन, अन्य पोस्ट में जो भी था, उसके संयोजन का हमेशा प्रयास कर सकते हैं, और समानता की जांच करें उस।

0
जोड़ा
मिट्टी को स्पष्ट करने के लिए धन्यवाद।
जोड़ा लेखक swan, स्रोत
किसी भी समय जब आप इसे देखना चाहते हैं तो sha1_file() का उपयोग करके PHP को पूरी फ़ाइल को पढ़ने का कारण बनता है, क्योंकि हैश की गणना की आवश्यकता होती है। यह फ़ाइल सामग्री की जांच करने से बेहतर नहीं है। यदि आप स्टोर हैश फ़ाइल के साथ हैं, और फिर तुलना करने के लिए संग्रहीत हैश का उपयोग करें (जैसा कि मैंने अपने उत्तर में कहा था), तो ठीक है, आप सही तरीके से हैं।
जोड़ा लेखक lorenzo-s, स्रोत