PHP的锁大致是两种用法,一个是在WEB并发比较高的情况下的一些写操作可能需要加锁,这可能也是php锁最原始的使用方法。另外一种就是非阻塞的一种用法,比如已经有其它进程取得了这个锁本进程直接退出。
本文其实就是对PHP函数flock的一个调用实验。
步骤1: 创建一个lock.php文件, 写入代码如下,测试不加锁的情况下的输出。
class PHPLock
{
protected $_lockfile = "lock";
protected $_handler = null;
function __construct()
{
$this->_handler = fopen($this->_lockfile, "w");
}
function getLock()
{
return flock($this->_handler, LOCK_EX);
}
function freeLock()
{
return flock($this->_handler, LOCK_UN);
}
}
$groupNum = 10;
$groupSize = 10;
$groupName = $argv[1];
$lock = new PHPLock();
for($group_i = 0; $group_i < $groupNum; $group_i ++) {
//$lock->getLock();
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++\n";
for($i = 0; $i < $groupSize; $i++) {
echo $groupName, ":", $group_i * $groupSize + $i, "\n";
usleep(100000 * rand(0, 100) / 100);
}
echo "--------------------------------------------------\n";
//$lock->freeLock();
}
步骤2: 创建一个start.sh的shell脚本,写入如下代码
php lock.php http://www.zeroplace.cn/#g1 &
php lock.php http://www.zeroplace.cn/#g2 &
执行这个start.sh脚本,查看输出,发现有这样的情况(分组被破坏)。
步骤3: 把lock.php的30和37行的注释去掉,再执行start.sh脚本,发现分组全部没有被破坏。