php多线程操作同一文件-待续

同意文件操作同意文件的问题在于逻辑有些地方不合适,如果多个线程同时写入,在不加锁的情况下,可能导致得到结果不如意,为了安全,和脏读(数据库的词),应该使用排他锁,这就意味着每次只能被一个线程操作。其他线程只能等待,如果超时则会报错。

1 关键函数:
2 fopen()  // 打开文件或一个http地址,形成一个文件流
3 flock()  // 对文件加锁及解锁
4 fwrite()  // 对文件读写操作
5 fclose()  // 关闭文件流
 1 fopen()   resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] )
 2
 3 文件打开模式:
 4 ‘r‘ 只读方式打开,将文件指针指向文件头。
 5 ‘r+‘ 读写方式打开,将文件指针指向文件头。
 6 ‘w‘ 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
 7 ‘w+‘ 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
 8 ‘a‘ 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
 9 ‘a+‘ 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
10 ‘x‘ 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这和给 底层的 open(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。
11 ‘x+‘ 创建并以读写方式打开,其他的行为和 ‘x‘ 一样。 
 1 flock()   bool flock ( resource $handle , int $operation [, int &$wouldblock ] )
 2
 3
 4 handle
 5 文件系统指针,是典型地由 fopen() 创建的 resource(资源)。
 6 operation
 7 operation 可以是以下值之一:
 8 ? LOCK_SH取得共享锁定(读取的程序)。
 9 ? LOCK_EX 取得独占锁定(写入的程序。
10 ? LOCK_UN 释放锁定(无论共享或独占)。
11
12
13 如果不希望 flock() 在锁定时堵塞,则是 LOCK_NB(Windows 上还不支持),即遇到有锁不等待,直接报错返回EWOULDBLOCK
14 写法为:$re = flock(lockfd,LOCK_EX|LOCK_NB)
15 有错则返回$re = -1,errno = EWOULDBLOCK 
 1 fwrite()   int fwrite ( resource $handle , string $string [, int $length ] )
 2
 3 handle
 4 文件系统指针,是典型地由 fopen() 创建的 resource(资源)。
 5 string
 6 The string that is to be written.
 7 length
 8 如果指定了 length,当写入了 length 个字节或者写完了 string 以后,写入就会停止,视乎先碰到哪种情况。
 9
10 注意如果给出了 length 参数,则 magic_quotes_runtime 配置选项将被忽略,而 string 中的斜线将不会被抽去。
11
12 fwrite() 返回写入的字符数,出现错误时则返回 FALSE 。 
1 fclose()   bool fclose ( resource $handle )
2
3 handle
4 文件指针必须有效,并且是通过 fopen() 或 fsockopen() 成功打开的。

通常这样子并不能从根本解决阻塞问题,只能是缓解一下,最好是通过中间件或者reids把请求排成一个队列,保证请求队列不会数据丢失,但是对于写入的数据不是那么重要的,可以用这个方法,直接写入,丢失就丢失了。

在前期调试的时候,可以先用这个方法直接把数据写在文件里,可视化强烈一些,后期可以用mongodb替换文件写入,或者多个文件分类分目录写入,而控制阻塞问题需要使用redis等来控制确保单文件操作的同时,请求不会丢失。

时间: 2024-12-15 22:01:19

php多线程操作同一文件-待续的相关文章

多线程IO操作(扫描文件夹并计算总大小)

场景为,给到一个硬盘上文件或文件夹,(当然文件夹时,多线程的优势才能越发体现出来),得到该文件或文件夹的大小和计算该结果所需要的时间. 首先是单线程下的例子,这个可难不倒大家,代码如下: 01 public class TotalFileSizeSequential { 02   private long getTotalSizeOfFilesInDir(final File file) { 03     if (file.isFile()) return file.length(); 04  

67.文件映射为内存进行操作与多线程 以及 文件映射到内存根据索引进行内存来实现读取多线程操作

问题引出: //有限的额内存情况怎么干活//索引载入内存,多线程//索引映射为内存 一.载入内存,按行读取进行多线程 定义路径以及其他信息 1 char path[256] = "kaifangX.txt"; 2 char indexpath[256] = "indexkf.txt"; 3 #define N 20151574 创建索引 1 struct index 2 { 3 int *pindex;//地址 4 int length; 5 }allindex =

C#中级-常用多线程操作(持续更新)

一.前言       多线程操作一直是编程的常用操作,掌握好基本的操作可以让程序运行的更加有效.本文不求大而全,只是将我自己工作中常常用到的多线程操作做个分类和总结.平时记性不好的时候还能看看.本文参考了多篇园子里的精彩博文,在文章最后会贴出具体来源,感谢他们的无私奉献. 二.关于线程 (1) 为何使用线程: 可以使用线程将代码同其他代码隔离,提高应用程序的可靠性: 可以使用线程来简化编码: 可以使用线程来实现并发执行. (2) 进程.应用程序域以及线程的关系: 进程(Process)是Wind

C#使用读写锁三句代码简单解决多线程并发写入文件时提示“文件正在由另一进程使用,因此该进程无法访问此文件”的问题

在开发程序的过程中,难免少不了写入错误日志这个关键功能.实现这个功能,可以选择使用第三方日志插件,也可以选择使用数据库,还可以自己写个简单的方法把错误信息记录到日志文件. 选择最后一种方法实现的时候,若对文件操作与线程同步不熟悉,问题就有可能出现了,因为同一个文件并不允许多个线程同时写入,否则会提示“文件正在由另一进程使用,因此该进程无法访问此文件”. 这是文件的并发写入问题,就需要用到线程同步.而微软也给进程同步提供了一些相关的类可以达到这样的目的,本文使用到的 System.Threadin

C#操作CSV文件类实例

本文实例讲述了C#操作CSV文件类.分享给大家供大家参考.具体分析如下: 这个C#类用于转换DataTable为CSV文件.CSV文件转换成DataTable,如果需要进行CSV和DataTable之间进行转换,使用这个类非常合适. using System.Data; using System.IO; namespace DotNet.Utilities { /// <summary> /// CSV文件转换类 /// </summary> public static class

JAVA使用和操作properties文件

java中的properties文件是一种配置文件,主要用于表达配置信息,文件类型为*.properties,格式为文本文件,文件的内容是格式是"键=值"的格式,在properties文件中,可以用"#"来作注释,properties文件在Java编程中用到的地方很多,操作很方便.Properties 类存在于包 Java.util 中,该类继承自 Hashtable. 1. getProperty ( String  key) ,   用指定的键在此属性列表中搜索

java使用POI操作excel文件,实现批量导出,和导入

一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Excel 95及以后的版本,即可操作后缀为 .xls 和 .xlsx两种格式的excel. POI全称 Poor Obfuscation Implementation,直译为"可怜的模糊实现",利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能.官网:htt

C语言应用操作之文件

文件是C语言中德中的重点,小编在学习C语言基础知识的时候,大多数的输入输出操作是在屏幕上进行的,现在总算在文件学习上感觉到高大上的样纸.在以前数据量很小时,我们通常将信息从键盘在屏幕上进行输入输出的,but当数据量很大时,则显得很麻烦,因此,我们就要用到小编所说的文件(FILE). 本贴主要涉及到的知识点具有: 文件读操作: 文件写操作: 文件指针: 文件的定位: 缓冲文件系统和非缓冲文件系统. 一.文件(FILE)简介 在C语言中,文件是由一个个字符组成的,文件中的内容称为文件流. 文件可以分

C#操作txt文件

c# 操作txt文件 # 操作txt文件 c#创建文本 private const string FILE_NAME = "ErroLog.txt"; public static void WriteFile(string str) ...{ StreamWriter sr; if (File.Exists(FILE_NAME)) //如果文件存在,则创建File.AppendText对象 ...{ sr = File.AppendText(FILE_NAME); } else //如