makdir php 并发报错_PHP并发读写文件如何解决 - microtime
关于microtime()函数的问题我分别在程序的开头和结尾用microtime()函数取得当前时间,然后相减得到程序运行时间,在5.2版本的php上没问题,但是在5.3、5.4和5.5三个版本的php相减结果不是0就是0.0156,跟5.2.6版本的完全不同,这是...
在并发高的情况下,操作同一个文件会导致数据错乱,所以需要在操作文件时进行一些特殊处理,下面总结一下几种解决方案。希望能帮助到大家。
方案一:使用flock函数对文件加锁/*
* flock(file,lock,block)
* file 必需,规定要锁定或释放的已打开的文件
* lock 必需。规定要使用哪种锁定类型。
* block 可选。若设置为 1 或 true,则当进行锁定时阻挡其他进程。
* lock
* LOCK_SH 要取得共享锁定(读取的程序)
* LOCK_EX 要取得独占锁定(写入的程序)
* LOCK_UN 要释放锁定(无论共享或独占)
* LOCK_NB 如果不希望 flock() 在锁定时堵塞
/*
// 获取锁if (flock($file,LOCK_EX)) { // 操作文件
fwrite($file,'write more words');
// 操作完毕后释放锁
flock($file,LOCK_UN);
} else {
//处理错误逻辑
}
fclose($file);
flock函数在多并发情况下,似乎会经常独占资源,不即时释放,或者是根本不释放,造成死锁,从而使服务器的cpu占用很高,甚至有时候会让服务器彻底死掉。所以单纯的使用flock加锁并不能完全解决问题。
方案二:限定加锁时间,超时则退出if($fp = fopen($fileName,'a')) { $startTime = microtime(); do{ $canWrite = flock($fp, LOCK_EX); if(!$canWrite) {
usleep(round(rand(0, 100) * 1000)); // 释放cpu,将cpu资源先让给其他进程
} // 如果未获取到锁,且未超时,则继续获取锁
} while((!$canWrite) && ((microtime() - $startTime) < 1000)); if($canWrite) { fwrite($fp, $dataToSave);
flock($file,LOCK_UN);
} fclose($fp);
}
方案三:使用临时文件$dir_fileopen='tmp';function cfopen($filename,$mode){
global $dir_fileopen;
clearstatcache(); // 创建一个临时文件
do{ $id=uniqid(); $tempfilename=$dir_fileopen.'/'.$id.md5($filename);
} while(file_exists($tempfilename)); // 将要操作的文件内容拷贝到临时文件中
copy($filename,$tempfilename); $fp = fopen($tempfilename, $mode); return $fp ? [$fp, $filename, $id, @filemtime($filename)] : false;
}function cfwrite($fp,$string){
// 将新增内容写入到临时文件中
return fwrite($fp[0], $string);
}function cfclose($fp){
global $dir_fileopen; $success = fclose($fp[0]);
clearstatcache(); $tempfilename = $dir_fileopen.'/'.$fp[2].md5($fp[1]); // 如果要操作的文件在操作期间没有被修改过,则说明没有人操作过该文件,那么将临时文件改名为真正的文件
if((@filemtime($fp[1]) == $fp[3])){
rename($tempfilename,$fp[1]);
}else{ //说明有其它进程在操作目标文件,当前进程被拒绝,删除临时文件
unlink($tempfilename); $success = false;
} return $success;
}$startTime = microtime();do{ $fp=cfopen('lock.txt','a+');
cfwrite($fp,"welcome to beijing.\n"); $success = cfclose($fp, 'on'); if(!$success) {
usleep(round(rand(0, 100) * 1000)); // 释放cpu,将cpu资源先让给其他进程
}
}while(!$success && ((microtime() - $startTime) < 1000)); // 如果为false,说明操作失败,则重新进行一次操作
方案四:使用队列
创建一个文件操作的队列,然后写一个脚本从队列中依次读取文件操作的信息再对文件进行相应的操作,这样每次就只有一个进程在操作文件,就解决了并发的问题。
以上内容参考自:http://blog.csdn.net/daiyan_csdn/article/details/51524781
在并发高的情况下,操作同一个文件会导致数据错乱,所以需要在操作文件时进行一些特殊处理,下面总结一下几种解决方案。
方案一:使用flock函数对文件加锁/*
* flock(file,lock,block)
* file 必需,规定要锁定或释放的已打开的文件
* lock 必需。规定要使用哪种锁定类型。
* block 可选。若设置为 1 或 true,则当进行锁定时阻挡其他进程。
* lock
* LOCK_SH 要取得共享锁定(读取的程序)
* LOCK_EX 要取得独占锁定(写入的程序)
* LOCK_UN 要释放锁定(无论共享或独占)
* LOCK_NB 如果不希望 flock() 在锁定时堵塞
/*
// 获取锁if (flock($file,LOCK_EX)) { // 操作文件
fwrite($file,'write more words');
// 操作完毕后释放锁
flock($file,LOCK_UN);
} else {
//处理错误逻辑
}
fclose($file);
flock函数在多并发情况下,似乎会经常独占资源,不即时释放,或者是根本不释放,造成死锁,从而使服务器的cpu占用很高,甚至有时候会让服务器彻底死掉。所以单纯的使用flock加锁并不能完全解决问题。
方案二:限定加锁时间,超时则退出if($fp = fopen($fileName,'a')) { $startTime = microtime(); do{ $canWrite = flock($fp, LOCK_EX); if(!$canWrite) {
usleep(round(rand(0, 100) * 1000)); // 释放cpu,将cpu资源先让给其他进程
} // 如果未获取到锁,且未超时,则继续获取锁
} while((!$canWrite) && ((microtime() - $startTime) < 1000)); if($canWrite) { fwrite($fp, $dataToSave);
flock($file,LOCK_UN);
} fclose($fp);
}
方案三:使用临时文件$dir_fileopen='tmp';function cfopen($filename,$mode){
global $dir_fileopen;
clearstatcache(); // 创建一个临时文件
do{ $id=uniqid(); $tempfilename=$dir_fileopen.'/'.$id.md5($filename);
} while(file_exists($tempfilename)); // 将要操作的文件内容拷贝到临时文件中
copy($filename,$tempfilename); $fp = fopen($tempfilename, $mode); return $fp ? [$fp, $filename, $id, @filemtime($filename)] : false;
}function cfwrite($fp,$string){
// 将新增内容写入到临时文件中
return fwrite($fp[0], $string);
}function cfclose($fp){
global $dir_fileopen; $success = fclose($fp[0]);
clearstatcache(); $tempfilename = $dir_fileopen.'/'.$fp[2].md5($fp[1]); // 如果要操作的文件在操作期间没有被修改过,则说明没有人操作过该文件,那么将临时文件改名为真正的文件
if((@filemtime($fp[1]) == $fp[3])){
rename($tempfilename,$fp[1]);
}else{ //说明有其它进程在操作目标文件,当前进程被拒绝,删除临时文件
unlink($tempfilename); $success = false;
} return $success;
}$startTime = microtime();do{ $fp=cfopen('lock.txt','a+');
cfwrite($fp,"welcome to beijing.\n"); $success = cfclose($fp, 'on'); if(!$success) {
usleep(round(rand(0, 100) * 1000)); // 释放cpu,将cpu资源先让给其他进程
}
}while(!$success && ((microtime() - $startTime) < 1000)); // 如果为false,说明操作失败,则重新进行一次操作
方案四:使用队列
创建一个文件操作的队列,然后写一个脚本从队列中依次读取文件操作的信息再对文件进行相应的操作,这样每次就只有一个进程在操作文件,就解决了并发的问题。
相关推荐:
解决php并发读写文件冲突的问题
makdir php 并发报错_PHP并发读写文件如何解决 - microtime相关推荐
- php中并发读写文件冲突的解决方案(文件锁应用示例)
php中并发读写文件冲突的解决方案(文件锁应用示例) 参考文章: (1)php中并发读写文件冲突的解决方案(文件锁应用示例) (2)https://www.cnblogs.com/wellsoho/p ...
- golang中map并发读写问题及解决方法
这是一个创建于 2017-03-05 06:02:54 的文章,其中的信息可能已经有所发展或是发生改变. 一.map并发读写问题 如果map由多协程同时读和写就会出现 fatal error:conc ...
- php写入文本 记事本打开换行_php如何读写文件换行的源代码
在PHP中读写文件,可以用到一下内置函数: 1.fopen(创建文件和打开文件) 语法: 复制代码 代码如下:fopen(filename,mode) filename,规定要打开的文件.mode,打 ...
- Java高并发读写文件
在实际的项目中我们经常会与遇到操作文件的情况,这是很常见的,但是我们在实际中用传统的I/O操作不能满足我们项目的需要并且对文件的写特别慢,操作比较麻烦.那么我们怎么样实现呢?最近在项目中我们遇到了高并 ...
- STM32F4 HAL 库开发报错:Hal_StatusTypeDef is undefined的解决办法
1.直接在头文件出添加#include "stm32f4xx_hal.h"即可.
- Java 按行读写文件(解决中文乱码)
import java.io.*;public class EmployeeTest{EmployeeTest(){}// 按行读取文件public void readFile01(){try {Fi ...
- Android中SlidingDrawer开发报错You need to use a Theme.AppCompat theme (or descendant) with this activity.
Android抽屉开发报错You need to use a Theme.AppCompat theme (or descendant) with this activity. 方法1: 创建的act ...
- Go开发报错 -- Golang strings.Builder type undefined
Go开发报错 -- Golang strings.Builder type undefined 在Go开发中,Go语言版本 go 1.10 以下版本,使用strings.Builder报错 I was ...
- 【重难点】【Redis 03】缓存雪崩、缓存穿透、缓存击穿、Redis 的内存过期策略、并发读写和双写
[重难点][Redis 03]缓存雪崩.缓存穿透.缓存击穿.Redis 的内存过期策略.并发读写和双写 文章目录 [重难点][Redis 03]缓存雪崩.缓存穿透.缓存击穿.Redis 的内存过期策略 ...
最新文章
- Java基础。public,private,static变量!以及一个实例化的小例子 以及方法
- FreeTextBox License机制的粗浅分析
- 【深度学习】一个应用—肝脏CT图像自动分割(术前评估)
- 直方图尖峰python_直方图、密度图、散点图,python数据可视化方法,你要的都在这里...
- C# A potentially dangerous 问题解决
- Linux Ubuntu 18.04安装JDK、Hadoop、Hbase以及图形界面
- [导入]七大千年数学难题
- 移动端:zepto框架
- 山东大学软件学院计算机组成原理课程设计实验三
- 突破电信80端口封锁,用CDN架设公司服务器!
- 基本农田卫星地图查询_天地图山东,购房者勘测利器,国产骄傲
- mongoDB地理位置查询
- php阴阳万年历转换的接口,用PHP写的阴阳万年历_PHP
- 【word】设置背景为绿豆沙保护色
- python招聘现状-前程无忧 Python 招聘岗位信息爬取和分析
- 对角化求可逆矩阵_「线性代数」求可逆矩阵P,使得相似矩阵对角化
- 台积电、高通“示好”华为:恢复供货?
- 带轮轮毂长度l和带轮宽b表_B型V带轮的轮缘宽B_轮毂孔径D和轮毂长L.doc
- 3d建模师就业前景?
- 【Docker】谷粒商城笔记记录:P104运行ElasticSearch容器
热门文章
- 重磅!Ubuntu 20.04 LTS(Focal Fossa)发布
- java 去掉pdf文字_如何从PDF文件中删除所有图像/图纸,并仅在Java中留下文本?
- vivo入驻华为测试鸿蒙,VIVO联动华为?官方宣传图出现华为智联,为鸿蒙合作埋下伏笔...
- 远离浮躁,重视基础。
- ZuulFilter修改参数并传递给后续微服务
- Scanner使用中缓冲区清空
- 面向对象 之 设计模式
- 智能投影销量爆发式增长 国内智能投影市场的春天还会要多久?
- C++学习笔记----allocator
- SSL证书七大常见错误及解决方法