PHP 檔案系統 flock() 函式



PHP 檔案系統flock() 函式用於鎖定或釋放檔案。此函式允許我們執行簡單的讀寫模型,該模型幾乎可以在每個平臺上使用。

可能的鎖包括 LOCK_SH:共享鎖(讀取)。允許其他程序訪問檔案,LOCK_EX:獨佔鎖。防止其他程序訪問檔案,LOCK_UN:釋放共享鎖或獨佔鎖,以及 LOCK_NB:在鎖定期間避免阻塞其他程序。

這些鎖僅在當前 PHP 程序中使用,如果許可權允許,其他程序可以修改或刪除 PHP 鎖定的檔案。此功能在 Windows 下是強制性的。

我們可以使用fclose() 函式釋放鎖定操作,該操作可以在指令碼執行完成後自動呼叫。

這是一個關於其工作原理的簡要說明:

  • 開啟檔案:要鎖定檔案,您必須首先使用 fopen() 開啟它。
  • 鎖定檔案:使用flock() 鎖定檔案。這確保了在您完成之前,沒有其他指令碼能夠訪問它。
  • 在檔案中讀取或寫入:執行檔案操作(讀取或寫入)。
  • 開啟檔案:完成後再次開啟檔案,使用flock()
  • 關閉文件:要關閉檔案,請使用 fclose()。

語法

以下是 PHP 檔案系統flock() 函式的語法:

bool flock ( resource $handle , int $operation [, int &$wouldblock ] )

引數

以下是flock() 函式的必需引數和可選引數:

序號 引數及描述
1

handle(必需)

它是檔案指標資源。

2

operation(必需)

鎖的型別。它可以是:

  • LOCK_SH 用於共享鎖(讀取)。
  • LOCK_EX 用於獨佔鎖(寫入)。
  • LOCK_UN 用於釋放鎖。
  • 3

    wouldblock(必需)

    第三個引數是可選的,如果鎖阻塞,則設定為 1。

    返回值

    成功時返回 TRUE,失敗時返回 FALSE。

    PHP 版本

    flock() 函式最初作為 PHP 4 的核心部分引入,並且與 PHP 5、PHP 7、PHP 8 相容良好。

    示例

    首先,我們將看到 PHP 檔案系統flock() 函式的基本用法,以對給定檔案進行獨佔鎖定。這是一個簡單的示例:

    <?php
       $file = fopen("/PhpProject/sample.txt", "w+");
    
       // exclusive lock
       if(flock($file, LOCK_EX)) {
          fwrite($file, "flock function");
          
       // release lock
          flock($file, LOCK_UN);
          echo $file;
       } else {
          echo "Error locking file!";
       }
       fclose($file);
    ?>
    

    輸出

    執行此指令碼時,您將看到類似於以下的結果:

    Resource id #12345
    

    示例

    現在,我們將瞭解如何在使用flock() 函式後寫入內容並讀取寫入的內容。

    <?php
       $file = fopen("/PhpProject/sample.txt", "w+"); // Open the file for reading and writing
    
       // exclusive lock
       if(flock($file, LOCK_EX)) {
          fwrite($file, "flock function");
          
          // release lock
          flock($file, LOCK_UN);
       } else {
          echo "Error locking file!";
       }
       fclose($file); // Close the file
    
       // Reopen the file to read its content
       $file = fopen("/PhpProject/sample.txt", "r");
       $content = fread($file, filesize("/PhpProject/sample.txt"));
       fclose($file);
    
       echo $content; // Outputs the content of the file
    
    ?> 
    

    輸出

    這將產生以下結果:

    flock function
    

    示例

    假設我們有一個將訊息記錄到檔案的指令碼。因此,藉助flock() 函式,我們可以確保一次只有一個程序可以寫入檔案。

    在我們的程式碼中,flock($file, LOCK_EX) 將嘗試獲取獨佔鎖,flock($file, LOCK_UN) 將在寫入過程完成後釋放鎖。

    <?php
       $logFile = "/PhpProject/log.txt";
       $message = "This is a log message.\n";
    
       // Open the log file in append mode
       $file = fopen($logFile, "a+");
    
       // Try to get an exclusive lock for writing
       if (flock($file, LOCK_EX)) {
          // Write the message to the log file
          fwrite($file, $message);
          
          // Release the lock
          flock($file, LOCK_UN);
          echo "Message logged successfully.";
       } else {
          echo "Error locking file!";
       }
    
       fclose($file); // Close the file
    ?> 
    

    輸出

    如果鎖成功且訊息已寫入,則輸出將為:

    Message logged successfully.
    

    如果在鎖定檔案時發生錯誤,則輸出將為:

    Error locking file!
    

    注意

    如果flock() 無法鎖定檔案,它將返回 false,因此您可以在程式碼中處理此情況以阻止不希望的行為。

    總結

    PHP 中的flock() 函式用於控制檔案鎖定。透過使用檔案鎖定來阻止多個指令碼同時訪問同一檔案。因此,使用它可以防止資料損壞。

    php_function_reference.htm
    廣告