我有个站,每天,会员登陆一次,都会将会员名称、时间和IP地址保存到一个txt文件中程序先读取该txt文件内容,赋值给变量,然后再将会员的登陆信息加到该变量后面串起来,再保存txt文件一般情况下没有什么问题但是现在网站访问量非常大,会员登陆特别频繁,某个时间段登陆的人特别多这样就导致了登陆日志的txt文件的日志内容变得残缺不全我想可能是某个会员登陆时,读取txt文件后,又有其他会员同时登陆,提前写入,结果搞得这个txt文件内容,一天下来,经常从某个时间段之前的记录都没有了有没有什么办法解决这个问题?好像有写入文件前,可以先锁定这个文件?写完后再解锁?如果A会员登陆时,锁定了txt文件,正好B会员也登陆,碰巧要写入txt文件,怎么办?

解决方案 »

  1.   

    PHP文件操作有锁功能:flock<?php
    写操作:
    //WRITE
    $fp = fopen("test.txt", 'ab'); 
    flock($fp, LOCK_EX); 
    fwrite($fp, 'Just A Test String.......');
    flock($fp, LOCK_UN); 
    fclose($fp); 
    读操作:
    //READ
    $fp = fopen("test.txt", 'r');
    flock($fp, LOCK_SH);
    //Read from the file.......
    flock($fp, LOCK_UN);
    fclose($fp);
    ?>
      

  2.   

    php模拟多线程来做咯。
    网上很多例子。
      

  3.   

    mysql数据库伤不起呀就因为现在的网站操作数据库的地方太多,导致服务器负载经常很高,能少用数据库尽量少用吧再说这个日志文件只是起辅助作用,也不是特别关键的因为我看支付宝的网站集成接口的日志也是保存成txt文件的,所以就照学……
      

  4.   


    杯具,我是用file_put_contents写文件保存的,晕
      

  5.   

    file_put_contents 是有 LOCK_EX 参数选项的你需要注意一个事实:
    锁文件时为了防止偶然出现的写冲突,如果写冲突频繁发生,显然是仅靠文件锁是不能完成的
    日志是只写的,发生写冲突的概率较低
    而你是需要有修改操作的,写冲突的概率至少要翻一番
      

  6.   

    用队列,比如memcacheq。
    http://code.google.com/p/memcacheq/downloads/list
      

  7.   

    怕拥塞mysql数据库有INSERT DELAYED,就很适合这种需求话说,一般写日志是程序一次打开日志文件,不断地写……而php是每次打开日志文件、关闭……当然用文件,可以分开16、100,256,甚至更多个文件保存,以降低竞争几率
      

  8.   

    谢谢上面的朋友,不过还是不想用mysql保存了我暂时用
    file_put_contents($file, $content, FILE_APPEND|LOCK_EX);
    这样试试看效果如何,最近一两天就会看到测试结果