php作为一个单线程的语言,是的,他自己本身是无法开机多线程的。但是php是有需要考虑互斥与同步问题呢。
其实,答案是需要的。为什么,因为php的逻辑是每个用户访问网站都会产生一个进程去处理这个事务。但是有很多时候,用户所访问的事务需要占用一些独占的资源。这样就必须保证当有一个用户访问了某个独占资源时,其他用户无法访问这个资源。
下面,我就来介绍一下php如何写互斥锁。
一、了解核心函数
我们要使用的是flock函数。将 lock 设为 LOCK_SH,设置的将是共享锁。将 lock 设为LOCK_EX,设置的将是独占锁。至于独占锁与共享锁的区别,不是我们这节的重点。
二、互斥模式
目前有两种,一种是阻塞模式,一种是非阻塞模式。所谓阻塞模式就是当遇到互斥锁。程序会阻塞在那里,不往下执行。所谓非阻塞方式,则是会继续向前进。所以非阻塞方式的开发,需要注意做一个判断处理。是否设置非阻塞,关键看是否有添加LOCK_NB。
三、解锁方式
解锁主要需要使用LOCK_UN参数。
下面,小沃通过流程图的方式让您这边更加容易的了解整个操作流程。
非阻塞模式 阻塞模式
下面小沃贡献一段很简单的php的互斥程序。
$lock = fopen(".test.lock", "w+"); if(flock($lock,LOCK_EX)) { echo "这里写需要互斥的代码"; flock($lock,LOCK_UN); } fclose($lock);