2010-05-27 13 views
6

मैं वहां हूं, मैं वर्तमान में एक यूनिट परीक्षण लिख रहा हूं जो दावा करता है कि एक फ़ाइल संशोधित नहीं हुई है। परीक्षण कोड निष्पादन एक सेकंड से भी कम समय लेता है और इसलिए मैं जानना चाहता हूं कि फ़ाइल संशोधन समय को मिलीसेकंड में पुनर्प्राप्त करना संभव है या नहीं। filemtime() फ़ंक्शन सेकंड में यूनिक्स टाइमस्टैम्प देता है।मिलीसेकंड में PHP फ़ाइल संशोधन समय

मेरा वर्तमान समाधान नींद (1) फ़ंक्शन का उपयोग कर रहा है जो मुझे आश्वस्त करेगा कि यह जांचने से पहले 1 सेकंड बीत चुका है या नहीं। मुझे उस समाधान को पसंद नहीं है क्योंकि यह एक बड़े सौदे से परीक्षण को धीमा कर देता है।

मैं get_file_contents() के माध्यम से सामग्री समानता पर जोर नहीं दे सकता क्योंकि डेटा को फिर से लिखा जा सकता है।

मुझे लगता है कि यह असंभव है, है ना?

उत्तर

2

AFAIK यूनिक्स टाइमस्टैम्प की परिशुद्धता सेकंड है, इसलिए यह संभावना नहीं हो सकती है।

बीटीडब्ल्यू, ध्यान दें कि PHP आंतरिक रूप से filemtime() के वापसी मूल्य को कैश करता है, इस प्रकार clearstatcache() पहले कॉल किया जाना चाहिए।

फ़ाइल की सामग्री को संशोधित करने (या हटाने) के लिए एक वैकल्पिक विधि पहले हो सकती है ताकि आप आसानी से परिवर्तनों की पहचान कर सकें। चूंकि प्रत्येक परीक्षण निष्पादित होने के बाद सिस्टम की स्थिति समान रहनी चाहिए, यूनिट परीक्षण चलाने के बाद मूल फ़ाइल सामग्री को पुनर्स्थापित करने के लिए वैसे भी यह समझ में आता है।

+0

मुझे यह विचार पसंद है, मैं 1 सेकंड के लिए सोने की तुलना में सामग्री में हेरफेर करना पसंद करता हूं, जो कि तेज़ तरीका है। पारितोषिक के लिए धन्यवाद। –

4

इस सरल कमांड का प्रयास करें:

ls --full-time 'filename' 

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

1

फाइल सिस्टम ext4 है (और अधिक हाल Unixes पर आम/Ubuntu की तरह Linuxes) या ntfs (विंडोज़), तो mtime उप दूसरा परिशुद्धता करता है।

यदि फ़ाइल सिस्टम ext3 (या शायद अन्य; यह कुछ समय पहले मानक था और अभी भी आरएचईएल द्वारा उपयोग किया जाता है), तो mtime केवल निकटतम दूसरे में संग्रहीत है। शायद वह पुराना डिफ़ॉल्ट है क्यों PHP निकटतम दूसरे स्थान पर केवल mtime का समर्थन करता है।

PHP में मान लाने के लिए, आपको बाहरी उपयोग को कॉल करने की आवश्यकता है, क्योंकि PHP स्वयं इसका समर्थन नहीं करता है।

(मैंने केवल अंग्रेजी लोकेल के साथ सिस्टम पर निम्न परीक्षण किया है; stat का "मानव पठनीय" आउटपुट भिन्न हो सकता है, या strtotime व्यवहार गैर-अंग्रेजी लोकेशंस पर भिन्न हो सकता है। इसे किसी भी समय क्षेत्र में ठीक काम करना चाहिए, stat के उत्पादन में एक समयक्षेत्र विनिर्देशक जो strtotime द्वारा सम्मानित किया है भी शामिल है के रूप में)

class FileModTimeHelper 
{ 
    /** 
    * Returns the file mtime for the specified file, in the format returned by microtime() 
    * 
    * On file systems which do not support sub-second mtime precision (such as ext3), the value 
    * will be rounded to the nearest second. 
    * 
    * There must be a posix standard "stat" on your path (e.g. on unix or Windows with Cygwin) 
    * 
    * @param $filename string the name of the file 
    * @return string like microtime() 
    */ 
    public static function getFileModMicrotime($filename) 
    { 
     $stat = `stat --format=%y $filename`; 
     $patt = '/^(\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d)\.(\d+) (.*)$/'; 
     if (!preg_match($patt, $stat, $matches)) { 
      throw new \Exception("Unrecognised output from stat. Expecting something like '$patt', found: '$stat'"); 
     } 
     $mtimeSeconds = strtotime("{$matches[1]} {$matches[3]}"); 
     $mtimeMillis = $matches[2]; 
     return "$mtimeSeconds.$mtimeMillis"; 
    } 
} 
+0

(उदाहरण के लिए ''stattimeime' कॉल से बचने के लिए सुरक्षित हो सकता है, '' stat --format = "% Y% y" $ filename'', लेकिन मैंने अब यह संस्करण लिखा है।) – Rich

3
function getTime($path){ 
    clearstatcache($path); 
    $dateUnix = shell_exec('stat --format "%y" '.$path); 
    $date = explode(".", $dateUnix); 
    return filemtime($path).".".substr($date[1], 0, 8); 
} 

getTime ("myTestTile")।;

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

  • कोई संबंधित समस्या नहीं^_^