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

 关键函数:
fopen() // 打开文件或一个http地址,形成一个文件流
flock()  // 对文件加锁及解锁
fwrite()  // 对文件读写操作
fclose()  // 关闭文件流
 fopen()   resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] )

 文件打开模式:
'r' 只读方式打开,将文件指针指向文件头。
'r+' 读写方式打开,将文件指针指向文件头。
'w' 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
'w+' 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
'a' 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
'a+' 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
'x' 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建之。这和给 底层的 open(2) 系统调用指定 O_EXCL|O_CREAT 标记是等价的。
'x+' 创建并以读写方式打开,其他的行为和 'x' 一样。
 flock()   bool flock ( resource $handle , int $operation [, int &$wouldblock ] )

 handle
文件系统指针,是典型地由 fopen() 创建的 resource(资源)。
operation
operation 可以是以下值之一:
◦ LOCK_SH取得共享锁定(读取的程序)。
◦ LOCK_EX 取得独占锁定(写入的程序。
◦ LOCK_UN 释放锁定(无论共享或独占)。 如果不希望 flock() 在锁定时堵塞,则是 LOCK_NB(Windows 上还不支持),即遇到有锁不等待,直接报错返回EWOULDBLOCK
写法为:$re = flock(lockfd,LOCK_EX|LOCK_NB)
有错则返回$re = -1,errno = EWOULDBLOCK
 fwrite()   int fwrite ( resource $handle , string $string [, int $length ] )

 handle
文件系统指针,是典型地由 fopen() 创建的 resource(资源)。
string
The string that is to be written.
length
如果指定了 length,当写入了 length 个字节或者写完了 string 以后,写入就会停止,视乎先碰到哪种情况。 注意如果给出了 length 参数,则 magic_quotes_runtime 配置选项将被忽略,而 string 中的斜线将不会被抽去。 fwrite() 返回写入的字符数,出现错误时则返回 FALSE 。
 fclose()   bool fclose ( resource $handle )

 handle
文件指针必须有效,并且是通过 fopen() 或 fsockopen() 成功打开的。

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

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

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

  1. 多线程协作 FileStream文件读写操作,读写冲突解决

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...

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

    一.前言       多线程操作一直是编程的常用操作,掌握好基本的操作可以让程序运行的更加有效.本文不求大而全,只是将我自己工作中常常用到的多线程操作做个分类和总结.平时记性不好的时候还能看看.本文参 ...

  3. 用读写锁三句代码解决多线程并发写入文件 z

    C#使用读写锁三句代码简单解决多线程并发写入文件时提示“文件正在由另一进程使用,因此该进程无法访问此文件”的问题 在开发程序的过程中,难免少不了写入错误日志这个关键功能.实现这个功能,可以选择使用第三 ...

  4. C#使用读写锁三行代码简单解决多线程并发写入文件时线程同步的问题

    (补充:初始化FileStream时使用包含文件共享属性(System.IO.FileShare)的构造函数比使用自定义线程锁更为安全和高效,更多内容可点击参阅) 在开发程序的过程中,难免少不了写入错 ...

  5. C#多线程操作界面控件的解决方案(转)

    C#中利用委托实现多线程跨线程操作 - 张小鱼 2010-10-22 08:38 在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了 ...

  6. c# BackGroundWorker 多线程操作的小例子

    在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示 ...

  7. swift语言之多线程操作和操作队列(下)———坚持51天吃掉大象(写技术文章)

    欢迎有兴趣的朋友,参与我的美女同事发起的活动<51天吃掉大象>,该美女真的很疯狂,希望和大家一起坚持51天做一件事情,我加入这个队伍,希望坚持51天每天写一篇技术文章.关注她的微信公众号: ...

  8. Python之FTP多线程下载文件之多线程分块下载文件

    Python之FTP多线程下载文件之多线程分块下载文件 Python中的ftplib模块用于对FTP的相关操作,常见的如下载,上传等.使用python从FTP下载较大的文件时,往往比较耗时,如何提高从 ...

  9. WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)

    WebAPI调用笔记   前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...

随机推荐

  1. [LeetCode] Reconstruct Itinerary 重建行程单

    Given a list of airline tickets represented by pairs of departure and arrival airports [from, to], r ...

  2. [LeetCode] Nth Highest Salary 第N高薪水

    Write a SQL query to get the nth highest salary from the Employee table. +----+--------+ | Id | Sala ...

  3. C#进阶系列——WebApi 接口参数不再困惑:传参详解

    前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料.如今,使用WebApi也有段时间了,今天就记录下API接口传参的一些方式方法,算是一个笔记,也希望能帮初学者少走弯路.本 ...

  4. [干货]Chloe官网及基于NFine的后台源码毫无保留开放

    扯淡 经过不少日夜的赶工,Chloe 的官网于上周正式上线.上篇博客中LZ说过要将官网以及后台源码都会开放出来,为了尽快兑现我说过的话,趁周末,我稍微整理了一下项目的源码,就今儿毫无保留的开放给大家, ...

  5. .NET跨平台之旅:基于.NET Core改写EnyimMemcached,实现Linux上访问memcached缓存

    注:支持 .NET Core 的 memcached 客户端 EnyimMemcachedCore 的 NuGet 包下载地址:https://www.nuget.org/packages/Enyim ...

  6. form 表单基础知识

    <form method=" name="one" action="http://www.battlenet.com.cn/zh/"> & ...

  7. 如何从Exchange邮箱数据库批量删除特定邮件

  8. C# 通过Selecnuim WebDriver操作非IE浏览器

    之前有需求需要操作Chrome中的dom元素,没做过这个,但是网上关于这个方面的资料比较少,所以自己捣腾了几天,在知道.net中有这个玩意. 但是一百度,全是关于java,python的而c#的那是一 ...

  9. Eclipse安装scala

    Scala官方提供了三种插件,分别支持Eclipse.NetBeans和Intellij IDEA开发环境.要在Eclipse IDE下安装Scala插件:选择Eclipse的菜单项Help--> ...

  10. [个人论文]一种基于GPU并行计算的MD5密码解密方法

    求轻喷... [顺便get一份LaTeX论文模板....还是XeLaTex好用.珍爱生命远离CJK http://files.cnblogs.com/files/pdev/paper.zip