+ -
当前位置:首页 → 问答吧 → PHP读写问题,急啊。。在线等。

PHP读写问题,急啊。。在线等。

时间:2011-09-20

来源:互联网

我想实现这样一个功能,函数判断输入帐号5个小时内是否有过动作,如果没有就返回true,有就返回false
我的思路是这样的,
首先去读取缓存文件。如果没有缓存则直接返回true,然后写缓存文件。
如果有缓存再去判断缓存里是否有该帐号,如果没有返回true,改写缓存文件,将该帐号跟时间加入缓存文件
如果缓存有该帐号,再去判断该帐号的时间是否超过预定时间,超过返回true,将缓存文件中该帐号时间改写。
如果没超过返回false。缓存不变。
缓存文件格式是这样的。。每行帐号+制表符+时间+换行
帐号1\t时间\n

以下是代码:
PHP code
    function is_send_codes($code)
    {
        $flag = false;
        $cache_path = "./codelist.txt";  //缓存文件
        $list = explode("\n", file_get_contents($cache_path));
        
        date_default_timezone_set('Asia/Chongqing'); //系统时间差8小时问题
        $now = getdate(time()); 
        $cur_wday=$now['wday'];
        $date = date("Y-m-d H:i:s $cweekday[$cur_wday]"); 
        [color=#FF0000]var_dump($list); //第一次的时候由于缓存文件不存在,按道理这里$list应该是空值应该跳转到步骤1,问题就在这里[/color]

        if(empty($list)) //步骤1
        {
            $flag = true;
            file_put_contents($cache_path, $code."\t".$date."\n");
          }else{   //步骤2
            @unlink($cache_path);  //删除缓存
            foreach($list as $tmp)
            {
                $scode = explode("\t",$tmp);
                if (empty($scode)) continue;
                echo "scode is ".$scode[0]."\t".$scode[1]." ...\n";
                
                if($code == $scode[0])
                {
                    echo "code is same ...\n";
                    if((strtotime($date)-strtotime($scode[1]))>18000 ) // 取帐号时间进行比较
                    {
                        $flag = true ;
                        $scode[1] = $date;  //改写该帐号当前活动时间
                    } 
                }else{
                     file_put_contents($cache_path, $scode[0]."\t".$scode[1]."\n");
                     $flag = true;   
                }
                if(!empty($scode))
                {
                    file_put_contents($cache_path, $scode[0]."\t".$scode[1]."\n",FILE_APPEND);  //改写缓存

                }    
            }
        }
        return $flag;
    }
if(@is_send_codes("[email protected]"))
echo "send to ...";


写完根本实现不了。找了一下午也不知道该怎么弄,求高手帮忙,指点一二,谢谢。

作者: sunyyang   发布时间: 2011-09-20

这位兄弟,你可以用memcached啊,memcached有自动过期功能,有动作的时候就设置一下动作key,同时把过期设置成5个小时。至于其他判断就很简单了

作者: php_json   发布时间: 2011-09-20

你没有说明白

作者: kenan0304   发布时间: 2011-09-20

说简单点,其实就是判断下缓存文件里有没有这个号码,号码时间有没有超过限制。 没有这个号就把他写回缓存去,有的话再看时间有没超时,超过了就改写时间

作者: sunyyang   发布时间: 2011-09-20

引用 1 楼 php_json 的回复:
这位兄弟,你可以用memcached啊,memcached有自动过期功能,有动作的时候就设置一下动作key,同时把过期设置成5个小时。至于其他判断就很简单了

这个是内存对象缓存的吧?我那个程序是每隔5分钟启动一次。这样的话程序结束内存对象也应该没有了吧?所以我想写在硬盘上。新手不太明白,愿闻其详。

作者: sunyyang   发布时间: 2011-09-20

引用 3 楼 sunyyang 的回复:

说简单点,其实就是判断下缓存文件里有没有这个号码,号码时间有没有超过限制。 没有这个号就把他写回缓存去,有的话再看时间有没超时,超过了就改写时间


这个方法太复式啊。

内存对象缓存只要你不重启机器就行了啊。一般不会重启机器嘛,如果你的检查不涉及到金钱的问题可以用这个。硬是丢了就丢了呗。

作者: php_json   发布时间: 2011-09-20

引用 5 楼 php_json 的回复:
引用 3 楼 sunyyang 的回复:

说简单点,其实就是判断下缓存文件里有没有这个号码,号码时间有没有超过限制。 没有这个号就把他写回缓存去,有的话再看时间有没超时,超过了就改写时间


这个方法太复式啊。

内存对象缓存只要你不重启机器就行了啊。一般不会重启机器嘛,如果你的检查不涉及到金钱的问题可以用这个。硬是丢了就丢了呗。

有个例子吗?

作者: sunyyang   发布时间: 2011-09-20

引用 5 楼 php_json 的回复:
引用 3 楼 sunyyang 的回复:

说简单点,其实就是判断下缓存文件里有没有这个号码,号码时间有没有超过限制。 没有这个号就把他写回缓存去,有的话再看时间有没超时,超过了就改写时间


这个方法太复式啊。

内存对象缓存只要你不重启机器就行了啊。一般不会重启机器嘛,如果你的检查不涉及到金钱的问题可以用这个。硬是丢了就丢了呗。

Fatal error: Class 'MemCachedClient' not found
还要给Php装扩展吗?这个我没办法改啊。。。

作者: sunyyang   发布时间: 2011-09-20

呵呵,你还是写文件吧。你这个数据不多吧,要是几百万的数据根本行不通 ,几百上千的应该还行。

作者: php_json   发布时间: 2011-09-20

新手吧,直接存储时间戳就可以了哦,为啥要转换为时间格式呢

作者: php_json   发布时间: 2011-09-20

引用 9 楼 php_json 的回复:
新手吧,直接存储时间戳就可以了哦,为啥要转换为时间格式呢

泪奔啊。。求指教。

作者: sunyyang   发布时间: 2011-09-20

就是存储的时候直接存储时间戳,不转换成日期格式。取出来的时候不用strtotime,直接相减就行了啊

作者: php_json   发布时间: 2011-09-20

你怎么不用数据库存储呢,很简单啊。两个字段:账号,最后操作时间戳。要判断也很简单,查询到了就看最后操作时间是不是大于5个小时,没查询到肯定没在5小时内操作过。还可以做定时事务,每天清除掉最后操作时间大于5个小时的,可以清除掉垃圾数据。每次操作都更新这个时间戳。就算有几百条数据也可以的啊

作者: php_json   发布时间: 2011-09-20

相关阅读 更多