预览加载中,请您耐心等待几秒...
1/6
2/6
3/6
4/6
5/6
6/6

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

PHP文件锁与进程锁 PHP文件锁与进程锁PHP具有非常强大的功能,所有的CGI的功能PHP都能实现。下面是小编分享的PHP文件锁与进程锁,一起来看一下吧。借用swoole的服务器/客户端与多进程机制对锁进行说明.这里只针对PHP的锁机制进行说明,由于SQL的锁与其作用方式和应用场景不同,将作另行说明.1.文件锁flock()fclose()swoole_lock()文件锁的可能应用场景为:1.限制并发多进程或多台服务器需要对同一文件进行访问和修改;2.对参与文件I/O的进程队列化和人为阻塞;3.在业务逻辑中对文件内容进行守护;下面是文件锁C/S通讯机制下的使用,已经省略了具体的通讯过程,如有需要请移步swoole异步任务队列Server(服务器通讯过程已略)://监听数据发送事件$serv->on('receive',function($serv,$fd,$from_id,$data){$serv->send($fd,"ServerEnd");$p_file="locktest.txt";var_dump(file_get_contents($p_file));});Client1(服务器通讯过程已略):$s_recv="ww";$p_file="locktest.txt";$o_file=fopen($p_file,'w+');//flock()加锁方式:flock($o_file,LOCK_EX);////swoole加锁方式://$lock=newswoole_lock(SWOOLE_FILELOCK,$p_file);//$lock->lock();fwrite($o_file,'ss'.$s_recv);sleep(30);//两种解锁方式//flock($o_file,LOCK_UN);//$lock->unlock();Client2(服务器通讯过程已略):$s_recv="xx";$p_file="locktest.txt";$o_file=fopen($p_file,'w+');//flock()加锁方式:flock($o_file,LOCK_EX);////swoole加锁方式://$lock=newswoole_lock(SWOOLE_FILELOCK,$p_file);//$lock->lock();fwrite($o_file,'ss'.$s_recv);//两种解锁方式//flock($o_file,LOCK_UN);//$lock->unlock();结果:Client2被阻塞了30s,直到Client1执行结束才对文件进行了一次写入;[l0.16@4m29.5%c30s04]$phpswoole_client2.php需要注意的是:1.无论是flock()还是swoole提供的swoole_lock(),都有在进程结束时自动解锁的'机制,所以在demo中即使不进行手动解锁也能正常运行,因此这里在第一个Client中执行了sleep()暂停函数来观察文件锁的效果;2.flock()的标准释放方式为flock($file,LOCK_UN);,但是个人喜欢fclose(),永绝后患;2.进程锁与文件锁不同的是,进程锁并不用于阻止对文件的I/O,而是用于防止多进程并发造成的预期之外的后果.所以需要在多进程并发时将其队列化,即在某进程的关键逻辑执行结束前阻塞其他并发进程的逻辑执行.实现思路有几种:1.利用flock()文件锁,创建一个临时lock文件,使用LOCK_NB模拟阻塞或非阻塞流,再在进程内部使用判定条件控制逻辑执行;非阻塞模型demo:$p_file="locktest.txt";$o_file=fopen($p_file,'w+');//如果临时文件被锁定,这里的flock()将返回falseif(!flock($o_file,LOCK_EX+LOCK_NB)){var_dump('ProcessLocked');}else{  //非阻塞模型必须在flock()中增加LOCK_NB参数//当然,这里取消LOCK_NB参数就是阻塞模型了flock($o_file,LOCK_EX+LOCK_NB);var_dump('ProcessLocking');  //模拟长时间的执行操作sleep(10);}2.利用swoole提供的共享内存,缓存方法或通信方法