Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 查找数千个文件中是否存在动态文件名_Php_Codeigniter - Fatal编程技术网

Php 查找数千个文件中是否存在动态文件名

Php 查找数千个文件中是否存在动态文件名,php,codeigniter,Php,Codeigniter,我正在用PHP编写一个缓存模块。它尝试使用$string+时间戳作为文件名写入缓存 我写缓存没有问题 问题是,我执行foreach循环以获取所需的缓存 这是我用于获取缓存的逻辑: foreach ($filenames as $filename){ if(strstr($filename,$cachename)){//if found if(check_timestamp($filename,time())) dis

我正在用PHP编写一个缓存模块。它尝试使用
$string+时间戳作为文件名写入缓存

我写缓存没有问题

问题是,我执行foreach循环以获取所需的缓存

这是我用于获取缓存的逻辑:

foreach ($filenames as $filename){ 
    if(strstr($filename,$cachename)){//if found 
        if(check_timestamp($filename,time()))
                          display_cace($filename);  
        break;
    } 
}
if (file_exists('cache/cache_function_random_news')) ...
但当它试图获取并读取缓存时,会减慢服务器的速度。假设一个文件夹中有10000个缓存文件,我需要检查该缓存文件夹中的每个文件

换句话说,我用这种格式编写缓存文件
filename\u timestamp
。例如:
cache\u function\u random\u news\u 191982899010
在文件夹
/cache/

当我想要获取缓存时,我只传递
cache\u函数\u random\u news\u
并递归检查该文件夹。 如果我在一个文件名上发现有针的东西,显示它,然后断开

但是递归地检查文件夹中的10000个文件不是一件好事,对吗


这样做的最佳方式是什么?

浏览器和web服务器通过维护“索引”来解决缓存维护问题。您可以在文件(二进制/文本)或数据库中维护此索引

例如:

  • 无论何时创建新缓存文件,都要向表/文件中添加行/条目
  • 然后,只需使用表/文件快速搜索缓存文件是否存在
  • 您还可以使用记录中的标志标记不必要/过时的文件
  • 然后定期(使用Cron作业或其他技术)删除过时的缓存文件

  • 这种方法将大大提高性能。

    浏览器和web服务器通过维护“索引”来解决缓存维护问题。您可以在文件(二进制/文本)或数据库中维护此索引

    例如:

  • 无论何时创建新缓存文件,都要向表/文件中添加行/条目
  • 然后,只需使用表/文件快速搜索缓存文件是否存在
  • 您还可以使用记录中的标志标记不必要/过时的文件
  • 然后定期(使用Cron作业或其他技术)删除过时的缓存文件

  • 这种方法将大大提高性能。

    不要将时间戳存储为文件名的一部分,而是将其与缓存内容一起以某种对您有意义的格式存储在文件中。例如:

    文件
    /cache/cache\u函数\u random\u news

    191982899010
    stored content
    
    文件的第一行包含时间戳,您可以在需要时读取该时间戳,例如定期清理缓存时。文件的其余部分包含缓存的内容。另一种可能是使用序列化数组。无论哪种方式,读取缓存都很简单:

    foreach ($filenames as $filename){ 
        if(strstr($filename,$cachename)){//if found 
            if(check_timestamp($filename,time()))
                              display_cace($filename);  
            break;
        } 
    }
    
    if (file_exists('cache/cache_function_random_news')) ...
    

    不要将时间戳存储为文件名的一部分,而是将其与缓存内容一起以某种对您有意义的格式存储在文件中。例如:

    文件
    /cache/cache\u函数\u random\u news

    191982899010
    stored content
    
    文件的第一行包含时间戳,您可以在需要时读取该时间戳,例如定期清理缓存时。文件的其余部分包含缓存的内容。另一种可能是使用序列化数组。无论哪种方式,读取缓存都很简单:

    foreach ($filenames as $filename){ 
        if(strstr($filename,$cachename)){//if found 
            if(check_timestamp($filename,time()))
                              display_cace($filename);  
            break;
        } 
    }
    
    if (file_exists('cache/cache_function_random_news')) ...
    
    这个缓存系统正在将html块保存到php序列化数组中。然后使用上面的函数读取它并取消序列化,然后返回HTML数组。 您只需要使用echo或print\r显示它们

    function rpl_cache_write(&$data,$name,$timelimit){  
        $timesecond = $timelimit * 60;
        $cache_timestamp = time() + $timesecond;
    
        $f = fopen(BASEPATH.'cache/'.$name,"w");
        if($f != FALSE){
            $content = $cache_timestamp.'TS--->'.serialize($data);      
            fwrite($f,$content,strlen($content));       
            fclose($f);
    
            return true;
        } else {
            //todo : throw error cannot write cache file
            //echo "cannot write cache";
        }
        return false;
    }
    
    这个缓存系统正在将html块保存到php序列化数组中。然后使用上面的函数读取它并取消序列化,然后返回HTML数组。 您只需要使用echo或print\r显示它们

    function rpl_cache_write(&$data,$name,$timelimit){  
        $timesecond = $timelimit * 60;
        $cache_timestamp = time() + $timesecond;
    
        $f = fopen(BASEPATH.'cache/'.$name,"w");
        if($f != FALSE){
            $content = $cache_timestamp.'TS--->'.serialize($data);      
            fwrite($f,$content,strlen($content));       
            fclose($f);
    
            return true;
        } else {
            //todo : throw error cannot write cache file
            //echo "cannot write cache";
        }
        return false;
    }
    

    是的,这也在codeigniter缓存系统上实现。我也这么做了。因为这个系统是在99%的用户完成一个应用程序后实现的,所以代码有点像黑客。它没有显著减少内存使用,但将计算时间减少到90%,因为它绕过了数据库。是的,这也在codeigniter缓存系统上实现。我也这么做了。因为这个系统是在99%的用户完成一个应用程序后实现的,所以代码有点像黑客。它没有显著减少内存使用,但将计算时间减少到90%,因为它绕过了数据库。