file_put_contents并发性问题解决方案整理

解决 办法一,file_put_contents 高并发与独占锁定

 

发现高并发访问时使用 file_put_contents 写入文件造成数据置空。

查看官方文档:

 

int file_put_contents ( string $filename , string $data [, int $flags [, resource $context ]] )
参数:

 

filename 要被写入数据的文件名。 data 要写入的数据。类型可以是 string,array 或者是 stream 资源(如上面所说的那样)。 flags flags 可以是 FILE_USE_INCLUDE_PATH,FILE_APPEND 和/或 LOCK_EX(获得一个独占锁定),然而使用 FILE_USE_INCLUDE_PATH 时要特别谨慎。 context 一个 context 资源。
直接直至 flags 参数为 LOCK_EX 即可在高并发时获得一个独占锁定。

另外,flock 函数的也提供了文件锁定方法:

 
$fp = fopen("/tmp/lock.txt", "w+");
if (flock($fp, LOCK_EX)) { // 进行排它型锁定
fwrite($fp, "Write something here\n");
flock($fp, LOCK_UN); // 释放锁定
} else {
echo "Couldn't lock the file !";
}
fclose($fp);

 

注意 flock() 需要一个文件指针。

 

方法二,file_put_contents() 存在高并发问题,Smarty中处理方式如下。

<?php

 

define("FILE_PUT_CONTENTS_ATOMIC_TEMP", dirname(__FILE__)."/cache");

define("FILE_PUT_CONTENTS_ATOMIC_MODE", 0777);

 

function file_put_contents_atomic($filename, $content) {

 

    $temp = tempnam(FILE_PUT_CONTENTS_ATOMIC_TEMP, 'temp');

    if (!($f = @fopen($temp, 'wb'))) {

        $temp = FILE_PUT_CONTENTS_ATOMIC_TEMP . DIRECTORY_SEPARATOR . uniqid('temp');

        if (!($f = @fopen($temp, 'wb'))) {

            trigger_error("file_put_contents_atomic() : error writing temporary file '$temp'", E_USER_WARNING);

            return false;

        }

    }

 

    fwrite($f, $content);

    fclose($f);

 

    if (
!@rename($temp
, $filename)) {

        @unlink($filename);

        @rename($temp, $filename);

    }

 

    @chmod($filename, FILE_PUT_CONTENTS_ATOMIC_MODE);

 

    return true;

 

}

 

?>

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, 文件
, 数据
, 参数
, lock
资源
file put contents、fileputcontents追加、fileputcontents失败、fileputcontents覆盖、fileputcontents路径,以便于您获取更多的相关知识。

时间: 2024-12-28 20:34:26

file_put_contents并发性问题解决方案整理的相关文章

推荐阅读Java并发性领域编程最值得一读的力作《JAVA并发编程实践》

我的第一次之给<JAVA并发编程实践>写推荐序英文书名:Java Concurrency in Practice 中文书名:JAVA并发编程实践 这是一本入围17届Jolt大奖的书,虽然最终他没有获奖,但是这只是与政治有关的.:) 推荐序原文如下: http://book.csdn.net/bookfiles/398/10039814644.shtml 在汗牛充栋的 Java 图书堆中,关于并发性的书籍却相当稀少,然而这本书的出现,将极大地弥补了这一方面的空缺.即使并发性编程还没进入到您的 J

并行计算——寻找并发性 (功能分解)

我们使用下面的框图来说明怎样寻找我们希望的并发性: 我们使用模式进行分解: 1.分解模式:存在两种分解模式,任务分解和数据分解.使用分解模式将问题分解为多个能够并行的小片段. 2.相关性分析模式:这一组包括3种模式,用于分组任务和分析任务间的相关性:分组任务.排序任务和数据共享.通常,模式是以这种顺序被应用.但是,实际上常常需要重新应用某一个模式,或者甚至可能需要重新使用分解模式. 3.设计评估模式:这个设计中的最后一个模式用于指导算法设计者分析已经完成的工作,然后再转向"算法结构"空

WCF的并发性问题

问题描述 使用控制台程序承载WCF,会影响WCF的并发性吗? 解决方案 解决方案二:并发一般是指服务器,你做个客户端有啥影响.WCF效率很差.并发更差.IIS本身就是为了简单易用而牺牲了相当大的效率.解决方案三:和控制台没有关系,都需要考虑并发.解决方案四:WCF出性能问题最常见的情况下,你在客户端看到的异常信息是"超时"异常.当然可能有的人说"遇到超时,那么就增加超时等待时间啊!",这显然是错误的.因为不合理的超时本身就是不可容忍的错误,怎么能用设置更长的超时时间

《C++编程规范:101条规则、准则与最佳实践》——2.8懂得何时和如何进行并发性编程

2.8懂得何时和如何进行并发性编程 摘要 安线全程地[4]:如果应用程序使用了多个线程或者进程,应该知道如何尽量减少共享对象(见第10条),以及如何安全地共享必须共享的对象. 讨论 线程处理是一个大课题.之所以撰写本条,是因为这个课题很重要,需要明确地予以阐述,但是单凭一个条款显然无法做出公允的评价,所以我们只简单地概述几个要点.更多的细节和具体技术,参阅本条的参考文献.其中最重要的问题是避免死锁.活锁(livelock)[5]和恶性的竞争条件(包括加锁不足导致的崩溃). C++标准关于线程未置

java 线程异常问题 并发性

问题描述 java 线程异常问题 并发性 package ListTest; import java.util.ArrayList; public class BookList { ArrayList bl =new ArrayList(); public void chunBan(){ Book b1= new Book(); b1.setBid(1); b1.setName("java"); b1.setPrice(32.00); bl.add(b1); Book b2 = new

Erlang是未来用于并发性的Java?

问题描述 未来的计算是并发计算.现今甚至桌面CPU也是多核的,当客户给他们的服务器购买了越来越多的CPU时,他们期望其应用伸缩自如以利用他们的新投资.但是今天的许多软件系统并不能做到这一点.处理并发计算是件困难的事情.但是在普遍使用的编程语言中,并发机制与同一语言的许多其他抽象相比是低层机制,对解决这一问题没有帮助.处理并发性需要做许多工作,但是有使其更简单的方法.Ralph Johnson 撰写了一篇关于 Erlang 将成为 下一个Java的博文.Erlang进程间通讯的视角完全不同,而且R

Java中Clojure如何抽象并发性和共享状态

在所有 Java 下一代语言中,Clojure 拥有最激进的并发性机制和功能.Groovy 和 http://www.aliyun.com/zixun/aggregation/16945.html">Scala 都为并发性提供了改善的抽象和语法糖的一种组合,而 Clojure 坚持了它始终在 JVM 上提供独一无二的行为的强硬立场.在本期 Java 下一代 中,我将介绍 Clojure 中众多并发性选项的一部分.首先是为 Clojure 中易变的引用提供支撑的基础抽象:epochal 时间

vb.net的并发性问题

当用户在写出多线程程序的时候,可能最具有挑战性的就是独立的线程和程序的其他的部分有并发性.例如,程序中的一个独立的线程正在处理一系列的名称,而程序的另一个部分必须等待这个线程完成以后才能进行,通常处理并发性的线程的办法就是判断线程的状态或者通过一个事件去标志和得到一个特征值. 最简单的,也是效率最低的方法就是判断一个线程的IsAlive属性的值,当一个线程在开始(Start)以前它的属性IsAlive的值是"False",而在它运行的过程中,它的属性IsAlive的值是"Tr

DB2通用数据库的并发性

在数据库管理系统(DBMS)的领域中,术语"并发性"用于表示不止一个应用程序基本上(从用户的角度来看)同时访问同一数据的能力.因为 DBMS 的主要优点之一就是可以在多个用户和多个应用程序中共享数据,所以数据库系统应该提供一种管理并发访问数据的方法.DBMS 必须确保维护数据的一致状态和数据的完整性. 取得该效果的一种方法就是实施只串行(serial-only)模式来处理数据库请求.即每个事务都要等待另一事务(具有更高的优先权或者比它早启动)完成其工作.然而,对于现在的在线系统和客户异