بکندباز

تابع ‎flock()‎‎ در PHP

 

مثال

قفل کردن و دوباره باز کردن یک فایل:

<?php
$file = fopen("test.txt","w+");

// exclusive lock
if (flock($file,LOCK_EX)) {
  fwrite($file,"Add some text to the file.");
   fflush($file);
  // release lock
  flock($file,LOCK_UN);
} else {
  echo "Error locking file!";
}
fclose($file);
?>

 

توضیحات

تابع ‎flock()‎ یک فایل را قفل و یا قفل یک فایل را باز می کند.

سینتکس

flock(file, lock, block)

مقادیر پارامتر ها

پارامتر توضیح
file اجباری. آدرس فایل
lock اجباری. نوع قفل مقادیر احتمالی

  • LOCK_SH – قفل اشتراکی (reader). به فرایند های دیگر اجازه ی دسترسی می دهد
  • LOCK_EX – قفل انحصاری (writer). به فرایند های دیگر اجازه ی دسترسی به فایل نمی دهد
  • LOCK_UN – باز کردن قفل
  • LOCK_NB – جلوگیری از بلاک شدن فرایند های دیگر
block اختیاری. اگر 1 باشد فرایند های دیگر را بلاک می کند

backendbaz

مدیر وب سایت بکندباز

دیدگاه‌ها

*
*

    علی پاسخ

    سلام
    من یه کران جاب دارم که هر سک دقیقه اجرا می شه
    می خوام توی هر بار اجرا ببینم دور قبلی تموم شده یا نه
     
    چطور می تونم این کار رو بکنم و از کدوم نوع lock باید استفاده کنم؟ 

      zohreh پاسخ

      سلام. طبق این لینک پاسختون رو میدم، چندین راه حل ارائه شده:

      https://stackoverflow.com/questions/32456985/check-if-a-php-file-command-is-already-running-on-cron

      پاسخ 1 - در شروع اجرای کرون یک فایل lock بسازید. هر بار که اسکریپت اجرا می شود، بررسی کنید که آیا فایل وجود دارد یا نه. اگر وجود داشت از اسکریپت خارج شوید، و اگر نه اسکریپت می تواند اجرا شود. البته روش بهتر استفاده از flock در دستور cron است. لینک پاسخ

      <?php
          $filename = "myscript.lock";
          $lifelimit = 120; // in Second lifetime to prevent errors
          /* check lifetime of file if exist */
          if(file_exists($filename)){
             $lifetime = time() - filemtime($filename);
          }else{
             $lifetime = 0;
          }
          /* check if file exist or if file is too old */
          if(!file_exists($filename) ||  $lifetime > $lifelimit){
              if($lifetime > $lifelimit){
                  unlink($filename); //Suppress if exist and too old
              }
              $file=fopen($filename, "w+"); // Create lockfile
              if($file == false){
                  die("file didn't create, check permissions");
              }
              /* Your process */
              unlink($filename); //Suppress lock file after your process 
          }else{
              exit(); // Process already in progress
          }

      پاسخ 2- چند روش برای اینکار وجود دارد. 1-می توانید در پایان اجرای اسکریپت، مقداری را در دیتابیس ست کنید و در شروع اجرای اسکریپت آن مقدار را در دیتابیس چک کنید که وجود دارد یا نه. 2- می توانید در شروع اجرا فایلی ایجاد کرده و آن را قفل کنید. و در هر اجرا چک کنید که آیا می توانید فایل را قفل کنید یا نه. لینک پاسخ

      <?php
      $filename = 'path/to/file.txt';
      $handle = fopen($filename, 'r');
      
      if (flock($handle, LOCK_SH | LOCK_NB)) {
          // فایل قفل نیست، یعنی اجرای قبلی فایل تمام شده است
          // ...
      
          // باز کردن قفل فایل در انتهای اجرا
          flock($handle, LOCK_UN);
      } else {
          // فایل قفل است یعنی هنوز اجرای قبلی تمام نشده است
          echo "File is locked by another process.";
      }
      
      fclose($handle);

      3- می تونید از دستور flock در خود دستور cron استفاده کنید:

      * 0 * * * flock -n /some/lockfile command_to_run_every_minute