شرح صفوف ومحتوى الفقرة
عندما تحاول عدة طلبات ويب الكتابة في الملف نفسه في آنٍ واحد، تمنع الدالة flock() تداخل البيانات وتلف الأسطر عبر أقفال نظام التشغيل.
- مرّر الثابت
LOCK_SHللحصول على قفل مشترك للقراءة المتزامنة، أوLOCK_EXللحصول على قفل حصري قبل أي كتابة. - إذا فتحت ملفاً بالوضع
"r+"أو"c"لاستبدال محتواه بأمان تحت القفل، استدعِftruncate($fp, 0)فقط بعد نجاحflock($fp, LOCK_EX). - استدعِ دائماً
fflush($fp)قبل فك القفل عبرflock($fp, LOCK_UN)لضمان تفريغ البايتات المؤقتة للقرص أثناء سريان القفل.
الفتح بالوضع "c+" يتجنب مسح الملف قبل الحصول على القفل؛ وفور نجاح LOCK_EX يتم تصفير الملف والكتابة وتفريغ المجرى ثم فك القفل.
PHP
<?php
$tmp = sys_get_temp_dir() . '/ct_counter.txt';
$fp = fopen($tmp, 'c+');
if (flock($fp, LOCK_EX)) {
ftruncate($fp, 0);
fwrite($fp, "VISITS=42");
fflush($fp);
flock($fp, LOCK_UN);
}
fclose($fp);
echo file_get_contents($tmp) . "\n";
unlink($tmp);