2012-02-01 3 views
35

मैंatomically एक फाइल करने के लिए एक लाइन जोड़कर और इसे बनाने अगर यह

append($path, $data) 

कि

  1. $ फ़ाइल बनाता है (प्रवेश के प्रयोजनों के लिए) एक समारोह बनाने के लिए कोशिश कर रहा हूँ मौजूद नहीं है यदि यह अस्तित्व में नहीं है और
  2. परमाणु रूप से $ डेटा जोड़ता है।

यह है

  • समर्थन उच्च संगामिति,
  • समर्थन लंबे तार और
  • संभव के रूप में performant किया जाना है।

अब तक सबसे अच्छा प्रयास है:

function append($file, $data) 
{ 
    // Ensure $file exists. Just opening it with 'w' or 'a' might cause 
    // 1 process to clobber another's. 
    $fp = @fopen($file, 'x'); 
    if ($fp) 
     fclose($fp); 

    // Append 
    $lock = strlen($data) > 4096; // assume PIPE_BUF is 4096 (Linux) 

    $fp = fopen($file, 'a'); 
    if ($lock && !flock($fp, LOCK_EX)) 
     throw new Exception('Cannot lock file: '.$file); 
    fwrite($fp, $data); 
    if ($lock) 
     flock($fp, LOCK_UN); 
    fclose($fp); 
} 

यह ठीक काम करता है, लेकिन यह एक काफी जटिल हो रहा है। क्या ऐसा करने के लिए एक क्लीनर (अंतर्निहित?) तरीका है?

उत्तर

75

PHP में पहले से ही एक अंतर्निहित फ़ंक्शन है, file_put_contents()। वाक्य रचना है:

file_put_contents($filename, $data, FILE_APPEND); 

ध्यान दें कि file_put_contents() फ़ाइल यदि वह पहले से मौजूद नहीं है (जब तक आप ऐसा करने के लिए फाइल सिस्टम अनुमतियाँ के रूप में) का निर्माण करेगा।

+0

क्या मैं पूछ सकता हूं कि डाउनवोट क्या था? – FtDRbwLXw6

+3

मेरा मानना ​​है कि यह फ़ाइल खोलने के लिए मोड 'एक्स' का उपयोग नहीं करेगा (ओ_एक्ससीएल सी-लैंड में), इसलिए यदि कोई फ़ाइल मौजूद नहीं है तो आपके पास रेस स्थिति हो सकती है। Https://github.com/php/php-src/blob/master/ext/standard/file.c देखें (ऐसा लगता है कि यह केवल 'c' का उपयोग करता है) –

+9

30 अप और सर्वोत्तम उत्तर नहीं। गरीब दुनिया! ': (' –

57

पीएचपी के आंतरिक समारोह http://php.net/manual/en/function.file-put-contents.php

file_put_contents($file, $data, FILE_APPEND | LOCK_EX); 

FILE_APPEND का उपयोग कर => झंडा फ़ाइल के अंत करने के लिए सामग्री संलग्न करने के लिए

LOCK_EX => झंडा एक ही समय में किसी और को फ़ाइल के लिए लिख को रोकने के लिए (PHP 5.1 के बाद से उपलब्ध)

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