请写一段 PHP 代码 ,确保多个进程同时写入同一个文件成功
方案一:
function writeData($filepath, $data) { $fp = fopen($filepath,'a'); do{ usleep(100); }while (!flock($fp, LOCK_EX)); $res = fwrite($fp, $data."\n"); flock($fp, LOCK_UN); fclose($fp); return $res; }
本文出自 “我知” 博客,请务必保留此出处http://iknow.blog.51cto.com/6209466/1058876
方案二:
function writeData($path, $mode,$data,$max_retries = 10) { $fp = fopen($path, $mode); $retries = 0; do{ if ($retries > 0) { usleep(rand(1, 10000)); } $retries += 1;}while (!flock($fp, LOCK_EX) and $retries<= $max_retries); //判断是否等于最大重试次数,是则返回falseif ($retries == $max_retries) { return false; } fwrite($fp, "$data "); flock($fp, LOCK_UN); fclose($fp); return true; }
来自http://www.xuejiehome.com/blread-1670.html
方案三:
function write_file($filename, $content) {$lock = $filename . '.lck';$write_length = 0;while(true) {if( file_exists($lock) ) {usleep(100);} else {touch($lock);$write_length = file_put_contents($filename, $content, FILE_APPEND);break;}}if( file_exists($lock) ) {unlink($lock);}return $write_length; }
flock
(PHP 4, PHP 5, PHP 7)
flock — 轻便的咨询文件锁定
bool flock ( resource $handle , int $operation [, int &$wouldblock ] )
flock() 允许执行一个简单的可以在任何平台中使用的读取/写入模型(包括大部分的 Unix 派生版和甚至是 Windows)。
在 PHP 5.3.2版本之前,锁也会被 fclose() 释放(在脚本结束后会自动调用)。
PHP 支持以咨询方式(也就是说所有访问程序必须使用同一方式锁定, 否则它不会工作)锁定全部文件的一种轻便方法。 默认情况下,这个函数会阻塞到获取锁;这可以通过下面文档中 LOCK_NB
选项来控制(在非 Windows 平台上)。
参数
-
handle
-
文件系统指针,是典型地由 fopen() 创建的 resource(资源)。
-
operation
-
operation
可以是以下值之一:LOCK_SH
取得共享锁定(读取的程序)。LOCK_EX
取得独占锁定(写入的程序。LOCK_UN
释放锁定(无论共享或独占)。
如果不希望 flock() 在锁定时堵塞,则是
LOCK_NB
(Windows 上还不支持)。 -
wouldblock
-
如果锁定会堵塞的话(EWOULDBLOCK 错误码情况下),可选的第三个参数会被设置为
TRUE
。(Windows 上不支持)
返回值
成功时返回 TRUE
, 或者在失败时返回 FALSE
。
Example #1 flock() 例子
<?php$fp = fopen("/tmp/lock.txt", "r+");if (flock($fp, LOCK_EX)) { // 进行排它型锁定ftruncate($fp, 0); // truncate filefwrite($fp, "Write something here\n");fflush($fp); // flush output before releasing the lockflock($fp, LOCK_UN); // 释放锁定 } else {echo "Couldn't get the lock!"; }fclose($fp);?>
Example #2 flock() 使用 LOCK_NB
选项
<?php $fp = fopen('/tmp/lock.txt', 'r+');/* Activate the LOCK_NB option on an LOCK_EX operation */ if(!flock($fp, LOCK_EX | LOCK_NB)) {echo 'Unable to obtain lock';exit(-1); }/* ... */fclose($fp); ?>
Note:
由于 flock() 需要一个文件指针, 因此可能不得不用一个特殊的锁定文件来保护打算通过写模式打开的文件的访问(在 fopen() 函数中加入 "w" 或 "w+")。
Warning:
在部分操作系统中 flock() 以进程级实现。当用一个多线程服务器 API(比如 ISAPI)时,可能不可以依靠 flock() 来保护文件,因为运行于同一服务器实例中其它并行线程的 PHP 脚本可以对该文件进行处理。
flock() 不支持旧的文件系统,如 FAT 以及它的派生系统。因此,此环境下总是返回 FALSE
(尤其是对 Windows 98 用户来说)。
http://php.net/manual/zh/function.flock.php
来源:http://www.cnblogs.com/gengyi/p/6399206.html
请写一段 PHP 代码 ,确保多个进程同时写入同一个文件成功相关推荐
- JavaScript学习(八十)—请写一段JS程序提取URL中的各个get参数(参数名和参数个数不确定),将其按key-value形式返回到一个json结构中
JavaScript学习(八十)-请写一段JS程序提取URL中的各个get参数(参数名和参数个数不确定),将其按key-value形式返回到一个json结构中 题目: 代码:
- 题目:请写一段将正整数转化为四进制字符串的函数(十进制正整数转四进制字符串)
题目: 请写一段将正整数转化为四进制字符串的函数,函数原型和参看说明如下:Stringchange_to_4(long a) 输入:a,这是long类型的正整数 输出:是一个由'0'.'1'.'2'. ...
- 用HTML写一段表白代码
你好! 如果你想用 HTML 写一段表白代码,可以这样写: <div><p>亲爱的,</p><p>我一直都在你身边,看着你成长,看着你变得越来越美.我想 ...
- 请写一段代码 把cv2 imshow窗口可以保存为动图
可以使用 OpenCV 中的 VideoWriter 类来实现把 cv2 imshow 窗口保存为动画.以下是一段 Python 代码: import cv2 import numpy as np# ...
- 写一段vba代码,实现excel里数值升序排序
您可以使用以下代码来实现excel中数值升序排序: Sub sortAscending() Dim rng As Range Set rng = Selection rng.Sort Key1:=rn ...
- python写一段脚本代码自动完成输入(目录下的所有)文件的数据替换(修改数据和替换数据都是输入的)【转】...
转自:http://blog.csdn.net/lixiaojie1012/article/details/23628129 初次尝试python语言,感觉用着真舒服,简单明了,库函数一调用就OK ...
- 用python写一段表白代码
您好!以下是用 Python 写的表白代码: print("亲爱的,我一直在想念你.") print("你是我生命中最重要的人,你是我一直以来的支持者,我的朋友,我的爱人 ...
- 用matlab写一段烟花代码
下面是一段用 Matlab 编写的烟花代码: ```matlab % 设置画布大小 figure('Position', [100 100 800 600]) % 设置视角 view(3) % 设置坐 ...
- 写一段vba代码,把excel中所有工作簿中的图片删除
以下是 VBA 代码,可用于删除 Excel 中所有工作簿中的图片: Sub DeleteAllImages()Dim ws As WorksheetDim shp As ShapeFor Each ...
最新文章
- 数据分析的 8 种思维
- 小波的秘密8_图像处理应用:图像降噪
- ubuntu 安装kde桌面_在Ubuntu 20.04系统上安装KDE Plasma Desktop的方法
- php invalid access,PHP出错消息PHP has encountered an Access Violation at XXXXXXXX 如何解决?...
- Java并发编程实战~volatile
- 置顶信息[置顶] 常用日常英语缩写
- DHCP之二 DHCP的中继代理
- 周小川:数字人民币不会取代美元 也不会威胁全球货币体系
- Nginx 代理设置
- 数字图像处理冈萨雷斯版学习(一)
- visio画箭头、画点线,各种连接头
- Dell PowerEdge R740xd解析:服务器只看参数那就错了
- flutter: Provider的坑 --- 退出页面时,StatefulWidget又会build一遍?
- html 筛选车型框,展厅对应车型.html
- matlab学习之旅1——钢琴音频
- 缺少编解码器,错误代码0xc00d5212 WIN10中AVI格式文件无法播放
- Autodesk全系列下载,Autodesk全版本下载
- android启动页背景设置,Android APP启动页白(黑)屏问题及解决方法
- FPGA中的时钟设计1
- 杨辉三角 C语言实现【一维数组】
热门文章
- java sum_java math.sum
- python有几种模式_python的设计模式都有哪些?
- 16_非监督学习、k-means 4阶段、kmeans API、Kmeans性能评估指标、案例
- Docker快速安装与快速入门
- 3.QT中的debug相关的函数,以及文件锁的使用
- Oracle单行函数
- 【tensorflow】tf.reshape函数说明:重塑张量
- yolov3/tiny-yolov3训练和测试 python2/3
- Lib详解--如何判断lib文件是静态库还是导入库
- C与C++中struct及C++中struct与class的区别