2011-07-13 16 views
6

मैं जानता हूँ कि वहाँ काफी PHP में उपलब्ध फ़ाइल का आकार प्राप्त करने के लिए निर्मित कार्यों का एक सा, उनमें से कुछ हैं: filesize, stat, ftell , आदिसबसे तेजी से रास्ता कोड अंदर खोला (PHP)

मेरा प्रश्न ftell पर है जो काफी दिलचस्प है, यह आपको फ़ाइल से फ़ाइल-सूचक का पूर्णांक मान देता है।

क्या ftell फ़ंक्शन का उपयोग कर फ़ाइल का आकार प्राप्त करना संभव है? यदि हां, तो मुझे बताओ कैसे?

परिदृश्य:

  1. प्रणाली (कोड) मोड के साथ एक मौजूदा फ़ाइल "एक" सामग्री संलग्न करने के लिए खुलता है।
  2. फ़ाइल सूचक पॉइंट के अंत में इंगित करता है।
  3. सिस्टम फ़ाइल में सामग्री को अद्यतन करता है।
  4. सिस्टम फ़ाइल के आकार की गणना करने के लिए ftell का उपयोग करता है।

उत्तर

12

fstat किसी भी कलाबाजी के बिना फ़ाइल आकार निर्धारित करता है:

$f = fopen('file', 'r+'); 
$stat = fstat($f); 
$size = $stat['size']; 

ftell जब फ़ाइल संलग्न ("a") ध्वज के साथ खोल दिया गया है नहीं किया जा सकता। साथ ही, आपको फ़ाइल के अंत में fseek($f, 0, SEEK_END) पहले खोजना होगा।

+0

धन्यवाद, 'fseek' पर जानकारी ने चाल की है। मैंने 'ftek' के साथ संयोजन में 'fseek' का उपयोग किया और यह सबसे तेज़ था। –

2

ftell() आप बता सकते हैं कि कितने बाइट्स चाहिए फ़ाइल में हो रहे हैं, लेकिन नहीं है कि कितने वास्तव में हैं। Sparse files अंत में मांगने वाले मूल्य की तुलना में डिस्क पर कम स्थान लेता है और कहता है कि वापस आ जाएगा।

0

धन्यवाद @Phihag, ftell के साथ fseek पर अपनी जानकारी के साथ मैं एक बहुत बेहतर तरीके से आकार की गणना करने में सक्षम हूँ। यहां कोड देखें: http://pastebin.com/7XCqu0WR

<?php 
$fp = fopen("/tmp/temp.rock", "a+"); 

fwrite($fp, "This is the contents"); 

echo "Time taken to calculate the size by filesize function: "; 
$t = microtime(true); 
$ts1 = filesize("/tmp/temp.rock") . "\n"; 
echo microtime(true) - $t . "\n"; 

echo "Time taken to calculate the size by fstat function:"; 
$t = microtime(true); 
$ts1 = fstat($fp) . "\n"; 
$size = $ts1["size"]; 
echo microtime(true) - $t . "\n"; 

echo "Time taken to calculate the size by fseek and ftell function: "; 
$t = microtime(true); 
fseek($fp, 0, SEEK_END); 
$ts2 = ftell($fp) . "\n"; 
echo microtime(true) - $t . "\n"; 

fclose($fp); 

/** 
OUTPUT: 

Time taken to calculate the size by filesize function:2.4080276489258E-5 
Time taken to calculate the size by fstat function:2.9802322387695E-5 
Time taken to calculate the size by fseek and ftell function:1.2874603271484E-5 

*/ 
?> 
+0

@ एस राकेश ध्यान दें कि यह बेंचमार्क ** पूरी तरह गलत है **: सबसे पहले, आप कुछ मापने योग्य मापते हैं। यदि बिल्कुल, आपको 100 के + रनों को मापना चाहिए। 10^-5s कुछ टाइमर के संकल्प से बड़ा है। साथ ही, आप 'फॉपेन' लेने का समय नहीं मानते हैं। (वैसे, मैंने जो सुझाव दिया था वह * नहीं * 'फाइलसाइज 'था, लेकिन' fstat', जो हैंडल पर भी काम करता है), इसलिए आप संतरे से संतरे की तुलना कर रहे हैं (फाइल सिस्टम में एक हैंडल बनाम एक हैंडल तक पहुंच सकते हैं)। इसके अतिरिक्त, आप खाते में कैशिंग नहीं लेते हैं। स्वाभाविक रूप से, जब तक आप 'fseek' कहते हैं, तब तक फाइलसाइज पहले से ही निर्धारित और कैश किया गया है। – phihag

+0

@ फिहाग मैं सहमत हूं कि टाइमर लंबे हैं, लेकिन मैं खोले गए फ़ाइल आकार की गणना करने का सबसे अच्छा तरीका जानने का प्रयास कर रहा हूं। मैंने 100 रेक का बेंचमार्क चलाया। 100 समवर्ती स्तर के साथ, मुझे अभी भी 'ftell' सबसे अच्छा लगता है। –

+0

@ एस राकेश बेस्ट को सबसे तेज़ नहीं होना चाहिए (यदि आप गति के लिए बाहर थे, तो आप PHP कोड नहीं लिखेंगे)। ध्यान दें कि आप अभी भी 'फाइलसाइज' के रूप में संतरे से 'fstat'/'ftell' के रूप में सेब की तुलना कर रहे हैं। यह भी ध्यान रखें कि परिणाम सामान्य कंप्यूटर और कैशिंग सेटअप पर निर्भर करते हैं। उदाहरण के लिए, यदि आपके सीपीयू कैश पहले ही गर्म हो चुके हैं और इनोड संरचना को शामिल करते हैं, तो 'फाइलसाइज' (जिसे पहले स्थान पर इनोड ढूंढना पड़ता है) धीमा हो जाएगा। दूसरी तरफ, यदि आप एक सेटअप में हैं जहां फ़ाइल के इनोड (और संभवतः निर्देशिकाएं हैं) को एचडीडी से पढ़ना है, ... – phihag

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