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
    广告