网站需要记录一些操作,目前的问题是
如果记录成文本 那么可能存在IO的问题,例如两个人同时操作的记录
如果记录到数据库,会增加数据库的负担,
如果先缓存到内存 例如 memcache 什么的 最后再统一写入硬盘,又担心万一可能存在掉电什么的灾难事件.那么是否有既能挤奶又不吃草的牛?

解决方案 »

  1.   

    弄个文件夹 /log
    日志以JSON格式保存到log文件夹下,以用户IP为名,写到txt里.$json = array();
    $json['log'] = '日志内容';
    $phplog .= json_encode($json).',';
    file_put_contents(dirname(__FILE__) ."/log/".str_replace('.','',$_SERVER["REMOTE_ADDR"])."txt","[".$phplog.'{"ips":"'.$_SERVER["REMOTE_ADDR"].'"}]');如果怕log文件夹下文件数过多,按IP地址前3再细分文件夹。比如/log/192/,/log/193/,/log/194/ ...下次改IP再次登录时,查询txt文件,先读取旧的,再重组数组重写txt文件。
      

  2.   


    嗯,开拓思路了,可以根据用户名md5之后产生日志文件。按照26个字母产生26个文件夹,再将各自的名字产生md5值保存到文件夹內。嗯,看看有没其他方案
      

  3.   

    打不是是到log文件中
    facebook的http://dongxicheng.org/search-engine/scribe-intro/@PhpNewnew
    其实我也有一个问题。如果存到memcache里面。一些数据我用完了,取出来了。就想把他们从memcache中删掉,除了设置过期时间,有没有更快的方法。
      

  4.   

    本帖最后由 PhpNewnew 于 2012-03-14 09:27:54 编辑
      

  5.   

    日志...首先要看是多大规模的...如果规模很大,数据库和前端cache是必然的
    但如果每天日志不超过1G的话,直接记文本就可以了,这种大小,IO不会成为瓶颈,不能太小看现代硬盘...另外就是,只对最有必要的内容记日志....这点很重要,什么都记,看起来牛逼了,其实实际没有任何用处,分析的时候还要白白浪费很多时间...
      

  6.   

    flush是不可能,毕竟里面还有一些没处理的日志,需要保留。 现在用的memcache还没有指定分块的策略。
    delete,flush的原理都是通过设置时间来完成的吧?redis是个好东西。nsoql中的经典
      

  7.   

    如果用户少的应用,那可以根据用户生成一个log,这样就不会有同时操作问题了。如果用户多,或者其它原因:先使用db存,然后一段时间,比如一天,使用cronjob去统计到file去保存
      

  8.   


    Memcache::delete()函数通过key删除一个元素。 如果参数timeout指定,该元素会在timeout秒后失效。 同样也可以使用memcache_delete()函数完成同样功能。删除该元素的执行时间。如果值为0,则该元素立即删除,如果值为30,元素会在30秒内被删除。 设置为0就行了.我猜测加上数值了才会产生一个计时。
      

  9.   


    不错,先db 再转成file.谢谢林妹妹继续...后面的.
      

  10.   

    不要想得那么复杂吧?
    日志文件是以追加方式写入的,而追加方式不会出现写冲突。必要时也可以加文件锁apache、mysql 都有文本形式的日志文件,他们都不存在写冲突,那你的怎么就会呢
      

  11.   


    原来的思路是将某个表的操作记录下来,那么可能有很多用户同时操作某个表插入什么的,记录这些sql数值啥的,并且保存成txt格式,这样多个用户打开同个文件做写入这个应该存在冲突吧?你说的追加模式可能跟这个不太一样?我记得以前写一些桌面程序的时候如果同时用两个句柄写模式打开一个文件就报错了。文件锁可能不适合在多用户的场合,所以这个方案看样子不对。
    根据上面的解答可以换成根据用户名的模式来产生日志,这样就不会产生冲突了,各自写各自的文件...
    因为这个数据库的数据很重要才需要去记录每一个用户的每个操作,不是我蛋痛...嘿嘿
      

  12.   

    radis是个不错的方案,radis比memcached高级一点最重要是因为有内存数据定时备份成硬盘数据的功能。
    或者mysql转文件也可以,定时清空表数据,每日/每月生成文件,反正文件最好有记录备份,日后系统扩充你还可以转成hadoop分布运算不是