海运的博客

PHP多进程同时写文件

发布时间:December 1, 2013 // 分类:PHP // No Comments

使用系统提供的flock函数:

<?php
   function ffwrite($filename,$content) {
      $file = fopen("$filename","a");
      while(1) {
         if (flock($file,LOCK_EX))
         {
            fwrite($file,$content);
            flock($file,LOCK_UN);
            fclose($file);
            break;
            } else {
            usleep(1000);
         }
      }
   }
?>

或根据创建文件判断其它进程是否在写操作,性能略差,测试1000次20进程写操作慢3%。

<?php
 function _fwrite($filename, $content) {
     $filename_lock = $filename . '.lock';
     while(1)
     {
         if(file_exists($filename_lock))
            {
             usleep(1000);
             } else {
             touch($filename_lock); 
             $f = fopen($filename, 'a');
             fwrite($f, "$content");
             fclose($f);
             unlink($filename_lock);
             break;
             }       
         }
     if(file_exists($filename_lock))
        {
         unlink($filename_lock);
         }
     }
 ?>

标签:php

评论已关闭

分类
最新文章
最近回复
  • 海运: 恩山有很多。
  • swsend: 大佬可以分享一下固件吗,谢谢。
  • Jimmy: 方法一 nghtp3步骤需要改成如下才能编译成功: git clone https://git...
  • 海运: 地址格式和udpxy一样,udpxy和msd_lite能用这个就能用。
  • 1: 怎么用 编译后的程序在家里路由器内任意一台设备上运行就可以吗?比如笔记本电脑 m参数是笔记本的...
  • 孤狼: ups_status_set: seems that UPS [BK650M2-CH] is ...
  • 孤狼: 擦。。。。apcupsd会失联 nut在冲到到100的时候会ONBATT进入关机状态,我想想办...
  • 海运: 网络,找到相应的url编辑重发请求,firefox有此功能,其它未知。
  • knetxp: 用浏览器F12网络拦截或监听后编辑重发请求,修改url中的set为set_super,将POS...
  • Albert: 啊啊啊啊啊啊啊啊啊 我太激动了,终于好了英文区搜索了半天,翻遍了 pve 论坛没找到好方法,博...