পাঠ্য ফাইলে তৈরি বা লিখুন / সংযোজন করুন


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
@ জেরাহ্মেলএসেবুচে লকটি অর্জনের চেষ্টা করার দ্বিতীয় প্রক্রিয়া "অনুরোধ করা লকটি অর্জন না করা অবধি" বন্ধ হয়ে যাবে "( উত্স )। অন্য কথায়, দ্বিতীয় প্রক্রিয়াটি প্রথমটি ফাইলটি বন্ধ না করে এবং লকটি প্রকাশ না হওয়া পর্যন্ত অপেক্ষা করবে।
রিনোগো

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 have এটা কাজ করে না. এটা কি আপনার কাজ করে?
জেরাহিমেল এসবুচে

1
আমি যেমন বলেছি পরিস্থিতি যদি ঘটে তবে কি এই কাজ করবে?
জেরাহমিল আছবুচে

1
aপতাকা যদি থাকে তাহলে হবে না এবং কি যে আপনি কি সত্যিই নিশ্চিত কোন ব্যাপার হবে ফাইল তৈরি করবে appendনতুন পাঠ্য। জন্য \nএটি কাজ করে কিন্তু শুধুমাত্র যদি ভিতরে উদ্ধৃতি চিহ্ন "না একক উদ্ধৃতি'
ভ্যালেন্টিন মার্সিয়ারের

আমি যদি উভয় ব্যবহারকারী বিভিন্ন ব্রাউজারে লগইন করে তবে তার পরিস্থিতি বলতে চাই। তারপরে পিএইচপি একই সাথে দুটি ব্রাউজারে ফাইলটি খুলবে এবং একই সাথে এটি আপডেটও করবে। কোনও সমস্যা হবে? \
জেরাহমিল এসবুচে

1
ওহ, হ্যাঁ থাকবে, এক্ষেত্রে এসকিউএল ডাটাবেস ব্যবহার করুন, রেস-কন্ডিশনগুলি এড়ানোর জন্য এটির অন্তর্নির্মিত ইঞ্জিন রয়েছে। তবে এটি সম্পূর্ণ নতুন প্রশ্ন।
ভ্যালেন্টিন মার্সিয়ার

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

আপনার কোডটিতে "সিগ্রি" এর মতো কোনও ফাইল ওপেন মোড নেই:

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

পিএইচপি http://php.net/manual/en/function.fopen.php এ ফাইলটি ওপেন মোডগুলি সি: http://www.cplsplus.com/references/cstdio/fopen/ তে একই রকম

পড়ার জন্য নীচের প্রধান উন্মুক্ত মোডগুলি রয়েছে "র", লেখার জন্য "ডাব্লু" এবং অ্যাপেন্ডের জন্য "ক", এবং আপনি সেগুলি একত্রিত করতে পারবেন না। আপনি আপডেটের জন্য "+", বাইনারিটির জন্য "বি" এর মতো অন্যান্য সংশোধক যুক্ত করতে পারেন। নতুন সি স্ট্যান্ডার্ড পিএইচপি দ্বারা সমর্থিত একটি নতুন স্ট্যান্ডার্ড সাবসিসিফায়ার ("এক্স") যুক্ত করে, এটি যে কোনও "ডাব্লু" স্পেসিফায়ারের সাথে যুক্ত হতে পারে ("ডাব্লুএক্সএক্স", "ডাব্লুবিএক্স", "ডাব্লু + এক্স" বা "ডাব্লু + বিএক্স গঠন করতে পারে) "/" WB + X ")। এই সাবসিসিফায়ার ওভাররাইট করার পরিবর্তে ফাইলটি উপস্থিত থাকলে ফাংশনটিকে ব্যর্থ করতে বাধ্য করে।

তদতিরিক্ত, পিএইচপি 5.2.6 এ, 'সি' প্রধান উন্মুক্ত মোড যুক্ত করা হয়েছিল। আপনি 'সি' কে 'ক', 'আর', 'ডাব্লু' এর সাথে একত্রিত করতে পারবেন না। 'সি' ফাইলটি কেবল লেখার জন্য খোলে। ফাইল উপস্থিত না থাকলে, এটি তৈরি করা হয়। যদি এটি বিদ্যমান থাকে, এটি না কেটে যায় ('ডাব্লু' এর বিপরীতে), না এই ফাংশনটির কলটি ব্যর্থ হয় (যেমন 'এক্স' এর ক্ষেত্রে)। 'সি +' পড়া এবং লেখার জন্য ফাইলটি খুলুন; অন্যথায় এটি 'গ' এর মতোই আচরণ করে।

অতিরিক্ত হিসাবে, এবং পিএইচপি 7.1.2 এ 'ই' বিকল্পটি যুক্ত করা হয়েছিল যা অন্যান্য মোডের সাথে একত্রিত হতে পারে। এটি খোলার ফাইল বর্ণনাকারীতে ঘনিষ্ঠ-অন-এক্সিকিউট পতাকা সেট করে। কেবলমাত্র পসআইএক্স .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);
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.