首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP flock 文件锁机制详解与高并发写入实战

     編輯:PHP 綜合知識

flock() 提供跨平台的文件级建议性锁,是 PHP 处理多进程并发读写文件的核心工具。本文深入解析锁模式、阻塞与非阻塞策略,并给出生产级「重试写入」封装函数。

基础语法与模式

bool flock ( resource $handle , int $operation [, int &$wouldblock ] )
  • LOCK_SH(共享锁/读锁):多进程可同时持有,写锁会被阻塞。
  • LOCK_EX(独占锁/写锁):同一时间仅一个进程持有,读写锁均阻塞。
  • LOCK_UN:释放锁。
  • LOCK_NB:非阻塞模式(与上述按位或),无法获取锁立即返回 false,不等待。

简单示例

生产级封装:带重试机制的安全写入

 0) {
            usleep(rand(1, 10000)); // 随机微秒延迟,降低冲突概率
        }
        $retries++;
    } while (!flock($fp, LOCK_EX) && $retries <= $max_retries);

    if ($retries > $max_retries) {
        fclose($fp);
        return false;
    }

    fwrite($fp, "$data\n");
    flock($fp, LOCK_UN);
    fclose($fp);
    return true;
}
?>

关键点提示

  • fclose() 会自动释放锁,脚本结束也会自动释放,但显式 flock($fp, LOCK_UN) 更规范。
  • 建议性锁依赖所有进程协作遵守;若有进程不加锁直接读写,锁机制失效。
  • Windows 下 flock 仅支持 LOCK_EX,不区分共享/独占。
  • NFS 等网络文件系统对 flock 支持不一,高并发场景建议改用 Redis 分布式锁或数据库行锁。

合理使用文件锁,可有效解决定时任务、爬虫、日志写入等场景的并发冲突问题。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved