2013-03-15 11 views
6

मुझे एक ऐसा फॉर्म मिला है जो टेक्स्टफाइल में अपना इनपुट लिखता है। संपादन के लिए टेक्स्ट फ़ाइल को लॉक करना संभव होगा, और शायद एक दोस्ताना संदेश दें "फ़ाइल किसी अन्य उपयोगकर्ता द्वारा संपादित की जाती है, कृपया बाद में पुनः प्रयास करें।"PHP लॉक पाठ फ़ाइल?

यदि फ़ाइल में एक ही समय में एकाधिक संपादक हैं तो मैं संघर्ष से बचना चाहता हूं।

यहां बताया गया है कि प्रविष्टि वर्तमान में कैसे जोड़ा गया है।

$content = file_get_contents("./file.csv"); 
$fh = fopen("./file.csv", "w"); 
fwrite($fh, $date_yy . '-' . $date_mm . '-' . $date_dd . '|' . $address . '|' . $person . '|' . $time_hh . ':' . $time_mm); 
fwrite($fh, "\n" . $content); 
fclose($fh);

कोई विचार?

+0

मुझे ऐसा करने के तरीके की जानकारी नहीं है, हालांकि आप उस फ़ंक्शन से अवगत नहीं हैं, तो आप इसे 'फ़्लॉक' कर सकते हैं। PHP.net मैन्युअल से परामर्श लें> http://php.net/manual/en/function.flock.php –

उत्तर

4

आप फ़ाइल को लॉक करने के लिए flock() फ़ंक्शन का उपयोग कर सकते हैं। और अधिक देखने this

कुछ तरह के लिए:

<?php 

     $content = file_get_contents("./file.csv"); 
     $fp = fopen("./file.csv", "w"); // open it for WRITING ("w") 
     if (flock($fp, LOCK_EX)) 
     { 
     // do your file writes here 
     fwrite($fh, $date_yy . '-' . $date_mm . '-' . $date_dd . '|' . $address . '|' . $person . '|' . $time_hh . ':' . $time_mm); 
     fwrite($fh, "\n" . $content); 
     fclose($fh); 
     flock($fh, LOCK_UN); // unlock the file 
     } 
    ?> 
+2

* fopen * और * झुंड * के बीच फ़ाइल शून्य हो जाएगी ('w' पहुंच के कारण), उम्मीद है कि यह है ओपी क्या चाहता है ... फ़ाइल बंद होने से पहले भी अनलॉक होना चाहिए ... –

+0

लक्ष्य फ़ाइल में नई लाइनें जोड़ने, सामग्री को रीसेट या प्रतिस्थापित नहीं करना है। – Janne

+1

@ जेन ताकि आप 'ए' पहुंच का बेहतर उपयोग कर सकें, न कि 'डब्ल्यू'। –

-1

मैं बस एक साधारण पूर्णांक या ऐसा ही कुछ प्रयोग करेंगे।

$content = file_get_contents("./file.csv"); 
    $fh = fopen("./file.csv", "w"); 
    $status = 1; 

...  

if($status == 1){ 
    fwrite($fh, $date_yy . '-' . $date_mm . '-' . $date_dd . '|' . $address . '|' . $person . '|' . $time_hh . ':' . $time_mm); 
    fwrite($fh, "\n" . $content); 
    fclose($fh); 
    $status = 0; 
    } 
else 
    echo "the file is edited by another user, please try again later."; 

क्या आपका मतलब है?

+0

'$ स्थिति = 1; अगर ($ स्थिति == 1) {'काश मैं समझने में सक्षम था कि एल्गोरिदम –

+0

@ ring0 lol मैं समझता हूं कि यह वही करने के लिए व्यवहार्य नहीं है जैसा मैंने वहां रखा है। शायद पहले या चेकस्टैटस() फ़ंक्शन हो। कहीं भी यह पता चलता है कि उपयोगकर्ता ने संपादन पर क्लिक किया है, और सबमिट करते समय 0 पर वापस रीसेट करता है। मुझे एहसास हुआ कि उपरोक्त तकनीकी रूप से गलत है। माफी – shanehoban

2

वांछनीयता के आदेश में:

  1. एक डेटाबेस का उपयोग करें।
  2. एक से अधिक टेक्स्ट फ़ाइल का उपयोग करें।
  3. उपयोग locks:

जैसे:

$lockwait = 2;  // seconds to wait for lock 
$waittime = 250000; // microseconds to wait between lock attempts 
// 2s/250000us = 8 attempts. 
$myfile = '/path/to/file.txt'; 

if($fh = fopen($myfile, 'a')) { 
    $waitsum = 0; 
    // attempt to get exclusive, non-blocking lock 
    $locked = flock($fh, LOCK_EX | LOCK_NB); 
    while(!$locked && ($waitsum <= $lockwait)) { 
    $waitsum += $waittime/1000000; // microseconds to seconds 
    usleep($waittime); 
    $locked = flock($fh, LOCK_EX | LOCK_NB); 
    } 
    if(!$locked) { 
    echo "Could not lock $myfile for write within $lockwait seconds."; 
    } else { 
    // write out your data here 
    flock($fh, LOCK_UN); // ALWAYS unlock 
    } 
    fclose($fh);   // ALWAYS close your file handle 
} else { 
    echo "Could not open $myfile"; 
    exit 1; 
} 
1

आप PHP's flock function उपयोग कर सकते हैं लिखने के लिए एक फ़ाइल लॉक करने के लिए, लेकिन वह ताला वेब अनुरोध पर मौजूद नहीं होगा और एनएफएस माउंट पर काम नहीं करता (कम से कम मेरे अनुभव में)।

आपकी निर्देशिका एक ही निर्देशिका में टोकन फ़ाइल बनाने के लिए हो सकती है, इसके अस्तित्व की जांच करें और यदि यह मौजूद है तो त्रुटि की रिपोर्ट करें।

किसी भी लॉकिंग योजना के साथ, आप दौड़ की स्थिति और ताले के लिए जा रहे हैं जो ऑपरेशन पूरा होने के बाद बने रहेंगे, इसलिए आपको उनको कम करने के लिए एक तरीका चाहिए।

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

यदि वे अलग हैं, तो एक त्रुटि दिखाएं।

+0

लॉक वेब अनुरोधों पर क्यों नहीं टिकेगा? ताले फाइलों पर हैं, वर्णनकर्ता नहीं (कम से कम लिनक्स पर) –

+0

मैंने पढ़ा है कि फ्लेक्स ताले को हटा देता है, इसलिए आपका लॉक उस समय के लिए होगा जब फ़ाइल हैंडल खुला था। मुझे झुकाव के साथ बहुत भाग्य नहीं मिला है, इसलिए मैं इससे बचने के लिए उत्सुक हूं। मुझे लगता है कि इस मामले में सेमफोर फ़ाइल का उपयोग करना एक बेहतर समाधान है, क्योंकि लॉक प्राप्त किया जाना चाहिए जब संपादन शुरू हो जाता है और इसे पूरा होने पर जारी किया जाता है, जो बाद में कई सबमिट/सत्यापन/पुनः सबमिट कर सकता है। मैं आपके प्रश्न से बचने की कोशिश नहीं कर रहा हूं, मेरे पास अभी कोई अच्छा जवाब नहीं है। –

+0

नहीं, झुंड सी समारोह (जो php के झुंड उपकरण) वर्णनकर्ताओं पर काम करता है। http://linux.die.net/man/2/flock – symcbean

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