【问题标题】:PHP methods for Implementing a pseudo cache system for files实现文件伪缓存系统的 PHP 方法
【发布时间】:2013-04-06 11:12:06
【问题描述】:

这个问题更多的是关于方法而不是实际的代码行

我想知道如何在 php 中为 FILES 实现 pseudo caching(因为没有更好的名称)。我曾尝试阅读一些文章,但其中大多数是指 PHP 的内部缓存系统,而不是我需要的 FILE 缓存。

我有几个场景需要应用这样的系统:

场景 1:

在访问帖子并单击链接时,所有帖子附件都会被收集并添加到 zip 文件中以供下载。

场景 2:

访问帖子,脚本将扫描所有内容,提取所有链接,为每个链接下载一些匹配的图像(或动态准备一个),然后将这些图像提供给浏览器。 (但不是在检查有效期之后??)

(这些示例使用 "post""attachment",因为我使用 wordpress 并且它是 wordpress 术语,目前两者都适用于我,除了它们一遍又一遍地生成文件。)

我对这两种情况(尤其是第 2 种情况)的怀疑 - 如何防止脚本在每次访问页面时都执行操作? (换句话说,如果文件存在,只需提供它,而无需再次循环整个创建操作)

我的第一直觉是用一些独特的(但不是加载唯一的,如uniqueid())名称调用文件,然后检查它是否已经在服务器上,但这会带来几个问题(比如它可能已经作为命名存在,但是另一篇文章..)而且 - 对于拥有 20,000 张图像的服务器来说,这应该是非常耗费资源的。

我想到的第二件事是以某种方式关联这些文件的元数据,但话又说回来,如何实现它?如何知道哪个链接是什么图片??

另外,如果我检查服务器上的文件是否存在,我怎么知道文件是否应该更改(并因此重新创建)?

因为我指的是 wordpress,所以我考虑将这些图像作为 base64 从二进制直接存储到数据库中,使用 transien_API - 但感觉很笨拙。

总结问题。如何生成文件,还要知道是否存在,需要时直接调用??我唯一的选择是将文件名存储在数据库中并以某种方式与帖子相关联吗?这似乎效率很低..

编辑我

我决定包含一些示例代码,因为它可以帮助人们理解我的困境。

function o99_wbss_prepare_with_callback($content,$width='250'){

 $content = preg_replace_callback( '/(http[s]?:[^\s]*)/i', 'o99_wbss_prepare_cb', $content );

 return $content;
}

function o99_wbss_prepare_cb($match){
    
    $url = $match[1];
    
    $url = esc_url_raw( $url );//someone said not need ?? 
    
    $url_name = parse_url($url);
        
    $url_name =  $url_name['host'];// get rid of http://..
    $param = '660';
    $url = 'http://somescript/' .  urlencode($url)   . '?w=' . $param ; 
    $uploads = wp_upload_dir();
    //$uniqid = uniqid(); 
    
    $img = $uploads['basedir'] . '/tmp/' . $url_name  .'.jpg' ; // was with $uniqid...
    
   
    if(! @ file_get_contents($url)){
        $url = 'path ' .$url. ' doesn"t exist or unreachable';
        return $url;
        } else {
             $file = file_get_contents( $url );
         }
         // here I will need to make some chck if the file already was generated , and 
        // if so - just serve it ..
         if ( $file) {
         
            file_put_contents( $img, $file ); 
                // Do some other operations on the file and prepare a new one ...
                // this produces a NEW file in the wp-uploads folder with the same name...
              unlink($img);
         }

    return $url;
} 

【问题讨论】:

  • 这是一个巧妙的问题 :) 你确定要手写解决方案吗?还是您对现有的解决方案/库持开放态度?
  • @asifrc - 我宁愿一个没有现成的解决方案,因为我想了解这种方法,所以我可以在类似的情况下使用它..就像我在 OP 中写的那样,它不是那么多关于代码,因为它是关于方法和方法..
  • 你真的应该只写你自己的文件缓存。您可以使用 filemtime() 检查缓存文件是否已经存在并且不旧。从包含描述其唯一内容的所有信息的 MD5 哈希中命名它。然后只加载缓存(如果存在)或生成(如果不存在)。每隔一段时间,删除所有旧的。文件方法比任何数据库访问都快 btw ;)

标签: php wordpress file caching


【解决方案1】:

对于场景 1:

Wordpress 将所有帖子附件作为帖子存储在帖子表中。当访问帖子时,在创建的插件或您的主题 functions.php 中运行一个函数。使用pre_get_posts 挂钩检查您是否已经使用函数 file_exists() 创建了 zip 文件,并为您创建的每个 zip 存档使用唯一名称、发布 ID 或永久链接将是一个好主意。尽管您需要确保没有用户特定的内容。您可以使用 filemtime() 检查文件的创建时间以及它是否仍然相关。如果 zip 文件不存在创建它, pre_get_posts 将传递具有帖子 ID 的查询对象,只需使用 get_posts 获取所有帖子附件,并将父 ID 设置为在查询对象中传递的 ID。 GUID 字段包含每个附件的 URL,然后在 tutorial 之后使用 ZipArchive() 生成一个 zip 存档。

对于场景 2: 如果您的 wordpress 模板设置为使用 wordpress 函数,则替换附件函数以返回其 url 并将其映射到您拥有缓存内容的新 url。例如 the_post_thumbnail() 将转到 wp_get_attachment_thumb_url() 将文件复制到您的缓存并使用缓存 url 作为输出。如果您还想缓存页面的 DOM,请使用 ob_start()。现在只需使用 file_exists 和 filetime() 在模板的开头运行检查,如果两者都在缓存的 DOM 中有效读取而不是加载页面。

【讨论】:

    猜你喜欢
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    相关资源
    最近更新 更多