手记

php多进程读写同一个文件锁的问题

PHP是原生支持多进程编程的,可以利用pcntl_fork()在当前位置产生一个子进程,那么就可能存在多个进程读写同一个文件的问题,比如多进程程序读写同一个日志文件,这样就有必要解决读写同一个文件时加锁的问题,php已经内置了一个读写的文件锁方法flock,,官方的解释是轻便的文件咨询锁定,这很官方。

还是先看一个栗子吧:

[php] view plain copy 在CODE上查看代码片派生到我的代码片

  1. <?php  

  2.   

  3. $fp = fopen("logs/app.log""a+");  

  4.   

  5. if (flock($fp, LOCK_EX)) {  // 进行排它型锁定  

  6.     fwrite($fp"Write something here\n");  

  7.     fflush($fp);            // flush output before releasing the lock  

  8.     flock($fp, LOCK_UN);    // 释放锁定  

  9. else {  

  10.     echo "文件正在被其他程序占用";  

  11. }  

  12.   

  13. fclose($fp);  

  14.   

  15. ?>   


flock的第一个参数是一个文件句柄,第二个参数可以设置锁定方式,有几个常量可以设置,下面一一介绍。


LOCK_SH : 取得共享锁定(读取的程序)也就是常说的共享锁,该进程只能读不能写,其他进程还是能读取该文件的。

LOCK_EX:取得独占锁定(写入的程序)常说的独占锁,该进程能读写该文件,其他进程则不能读写。

LOCK_UN:释放锁定(无论共享或独占)也就是释放上述两种锁。

LOCK_NB:配合LOCK_SH和LOCK_EX使用,使得在加锁时程序非阻塞。


0人推荐
随时随地看视频
慕课网APP