टेक्स्ट फ़ाइल में बनाएँ या लिखें / लिखें


170

मेरे पास एक वेबसाइट है जो हर बार जब कोई उपयोगकर्ता लॉग करता है या लॉग आउट करता है तो मैं इसे एक टेक्स्ट फ़ाइल में सहेजता हूं।

मेरा कोड डेटा को जोड़ने या पाठ फ़ाइल बनाने में काम नहीं करता है यदि यह मौजूद नहीं है .. यहाँ नमूना कोड है

$myfile = fopen("logs.txt", "wr") or die("Unable to open file!");
$txt = "user id date";
fwrite($myfile, $txt);
fclose($myfile);

ऐसा लगता है कि मैं इसे फिर से खोलने के बाद अगली पंक्ति में नहीं जाता।

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

जवाबों:


337

कुछ इस तरह की कोशिश करो:

 $txt = "user id date";
 $myfile = file_put_contents('logs.txt', $txt.PHP_EOL , FILE_APPEND | LOCK_EX);

5
यदि यह मौजूद नहीं है तो क्या यह एक पाठ फ़ाइल बनाता है?
येरहमील ऐसबुचे जुले

5
हाँ, यह पाठ फ़ाइल बनाएँ logs.txtऔर इसमें सामग्री संलग्न करें
स्पेंसरएक्स

5
मेरा एक सवाल है। LOCK_EX का उपयोग करना। मुझे पता है कि यह किसी और को उसी समय फ़ाइल को लिखने से रोकेगा। लेकिन दूसरे का क्या होगा?
जेरहमील ऐसबुचे जुले

13
php.net/manual/en/function.file-put-contents.php यह फ़ंक्शन फ़ाइल पर लिखे गए बाइट्स की संख्या, या विफलता पर FALSE लौटाता है। बस अगर किसी की सोच है।
मास्टर जेम्स

7
@JerahmeelAcebuche ताला प्राप्त करने का प्रयास करने की दूसरी प्रक्रिया "तब तक अवरुद्ध होगी जब तक कि अनुरोधित ताला का अधिग्रहण नहीं किया जाता है" ( स्रोत )। दूसरे शब्दों में, दूसरी प्रक्रिया तब तक प्रतीक्षा करेगी जब तक कि पहले वाले ने फ़ाइल को बंद नहीं किया हो और लॉक को जारी नहीं किया हो।
रिनोगो

102

aमोड का उपयोग करें । इसके लिए खड़ा है append

$myfile = fopen("logs.txt", "a") or die("Unable to open file!");
$txt = "user id date";
fwrite($myfile, "\n". $txt);
fclose($myfile);

मैं भी इस मुद्दे को \ n है। यह काम नहीं करता। क्या यह आपके लिए काम करता है?
येरहमील ऐसबुचे जुले

1
क्या यह काम करता है यदि स्थिति जैसा कि मैंने कहा है?
यरहमील ऐसबुचे जुले

1
aझंडा यदि वह मौजूद नहीं है और क्या है कि तुम सच सुनिश्चित करें कोई फर्क नहीं पड़ता होगा फ़ाइल बनाएगा appendनया पाठ। इसके लिए \nयह काम करता है लेकिन केवल अगर दोहरे उद्धरण चिह्नों के अंदर "नहीं है'
वैलेंटाइन मर्सियर

मेरा मतलब है कि अगर दोनों उपयोगकर्ता अलग-अलग ब्राउज़र में लॉगिन करते हैं तो क्या होगा। फिर php एक ही समय पर दो ब्राउज़र पर फ़ाइल को खोलेगा और उसी समय इसे अपडेट भी करेगा। क्या कोई समस्या होगी? \
_

1
ओह, हाँ, वहाँ होगा, इस मामले में एक SQL डेटाबेस का उपयोग करें, इसमें एक अंतर्निहित इंजन है जो दौड़-स्थितियों से बचने के लिए है। लेकिन यह एक नया सवाल है।
वैलेंटाइन मर्सियर

10

आप इसे OO तरीके से कर सकते हैं, बस एक वैकल्पिक और लचीला:

class Logger {

    private
        $file,
        $timestamp;

    public function __construct($filename) {
        $this->file = $filename;
    }

    public function setTimestamp($format) {
        $this->timestamp = date($format)." » ";
    }

    public function putLog($insert) {
        if (isset($this->timestamp)) {
            file_put_contents($this->file, $this->timestamp.$insert."<br>", FILE_APPEND);
        } else {
            trigger_error("Timestamp not set", E_USER_ERROR);
        }
    }

    public function getLog() {
        $content = @file_get_contents($this->file);
        return $content;
    }

}

फिर इसे इस तरह से उपयोग करें .. मान लें कि आपने user_nameएक सत्र (अर्ध छद्म कोड) में संग्रहीत किया है:

$log = new Logger("log.txt");
$log->setTimestamp("D M d 'y h.i A");

if (user logs in) {
    $log->putLog("Successful Login: ".$_SESSION["user_name"]);
}
if (user logs out) {
    $log->putLog("Logout: ".$_SESSION["user_name"]);
}

इसके साथ अपना लॉग चेक करें:

$log->getLog();

परिणाम इस प्रकार है:

Sun Jul 02 '17 05.45 PM » Successful Login: JohnDoe
Sun Jul 02 '17 05.46 PM » Logout: JohnDoe


github.com/thielicious/Logger


1
इस लकड़हारे वर्ग के लिए बहुत धन्यवाद! मैं यह जानने की उम्मीद नहीं कर रहा था कि जब मुझे यह पृष्ठ मिला है ... लेकिन यह वास्तव में मैं जो लागू करने की योजना बना रहा था, उससे कहीं अधिक बेहतर समाधान की नींव है।
मायके कार्टर

4

यह मेरे लिए काम कर रहा है, लेखन (साथ ही निर्माण) और / या एक ही मोड में सामग्री जोड़ रहा है।

$fp = fopen("MyFile.txt", "a+") 

3

इस कोड को आज़माएं:

function logErr($data){
  $logPath = __DIR__. "/../logs/logs.txt";
  $mode = (!file_exists($logPath)) ? 'w':'a';
  $logfile = fopen($logPath, $mode);
  fwrite($logfile, "\r\n". $data);
  fclose($logfile);
}

मैं हमेशा इसे इस तरह से उपयोग करता हूं, और यह काम करता है ...


1
ऐसा करने का कोई कारण नहीं है (!file_exists($logPath)) ? 'w':'a'- aविकल्प में पहले से ही सही व्यवहार है जब फ़ाइल मौजूद नहीं है। तो लाइन को हटाकर $mode = ...;, और अगली लाइन को बदलकर इस उत्तर को सरल बना सकते हैं $logfile = fopen($logPath, 'a');
टूलमेकरसैट

2

आपके कोड में "wr" जैसी कोई फ़ाइल ओपन मोड नहीं है:

fopen("logs.txt", "wr") 

PHP में फ़ाइल के खुले मोड http://php.net/manual/en/function.fopen.php C: http://www.cplusplus.com/reference/cstdio/fopen/ के समान है

पढ़ने के लिए निम्नलिखित मुख्य खुले मोड "आर" हैं, लिखने के लिए "डब्ल्यू" और एपेंड के लिए "ए", और आप उन्हें जोड़ नहीं सकते हैं। आप अद्यतन के लिए "+" जैसे अन्य संशोधक जोड़ सकते हैं, बाइनरी के लिए "बी"। नया C मानक PHP द्वारा समर्थित एक नया मानक उप-प्रेषण ("x") जोड़ता है, जिसे किसी भी "डब्ल्यू" स्पेसिफायर ("डब्ल्यूएक्स", "डब्ल्यूबीएक्स", "डब्ल्यू + एक्स" या "डब्ल्यू बीएक्स" के रूप में जोड़ा जा सकता है) "/" पश्चिम बंगाल + x ")। यह उपप्रकारक फ़ंक्शन को विफल करता है यदि फ़ाइल मौजूद है, तो इसे अधिलेखित करने के बजाय।

इसके अलावा, PHP 5.2.6 में, 'c' मेन ओपन मोड जोड़ा गया था। आप 'c' को 'a', 'r', 'w' के साथ नहीं जोड़ सकते। 'C' केवल लिखने के लिए फ़ाइल खोलता है। यदि फ़ाइल मौजूद नहीं है, तो यह बनाई गई है। यदि यह मौजूद है, तो इसे न तो काट दिया जाता है (जैसा कि 'w' के विपरीत), और न ही इस फ़ंक्शन का कॉल विफल होता है (जैसा कि 'x' के साथ होता है)। 'c +' पढ़ने और लिखने के लिए फ़ाइल खोलें; अन्यथा इसका व्यवहार 'ग' जैसा है।

इसके अतिरिक्त, और PHP 7.1.2 में 'ई' विकल्प जोड़ा गया था जिसे अन्य मोड के साथ जोड़ा जा सकता है। यह खोले हुए फ़ाइल डिस्क्रिप्टर पर क्लोज़-ऑन-एक्ज़िक फ़्लैग सेट करता है। केवल PHP में उपलब्ध POSIX.1-2008 अनुरूप सिस्टम पर संकलित।

इसलिए, कार्य के लिए जैसा कि आपने इसे वर्णित किया है, सबसे अच्छा फ़ाइल ओपन मोड 'ए' होगा। यह केवल लिखने के लिए फ़ाइल खोलता है। यह फ़ाइल के अंत में फ़ाइल पॉइंटर को रखता है। यदि फ़ाइल मौजूद नहीं है, तो इसे बनाने का प्रयास करता है। इस विधा में, fseek () का कोई प्रभाव नहीं होता है, लिखते हैं हमेशा संलग्न होते हैं।

यहाँ आपको वही चाहिए, जो पहले ही ऊपर बताया जा चुका है:

fopen("logs.txt", "a") 

0

हालांकि ऐसा करने के कई तरीके हैं। लेकिन अगर आप इसे आसान तरीके से करना चाहते हैं और लॉग फाइल में लिखने से पहले टेक्स्ट को फॉर्मेट करना चाहते हैं। आप इसके लिए एक सहायक फ़ंक्शन बना सकते हैं।

if (!function_exists('logIt')) {
    function logIt($logMe)
    {
        $logFilePath = storage_path('logs/cron.log.'.date('Y-m-d').'.log');
        $cronLogFile = fopen($logFilePath, "a");
        fwrite($cronLogFile, date('Y-m-d H:i:s'). ' : ' .$logMe. PHP_EOL);
        fclose($cronLogFile);
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.