Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.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_Wordpress_File_Caching - Fatal编程技术网

用于实现文件伪缓存系统的PHP方法

用于实现文件伪缓存系统的PHP方法,php,wordpress,file,caching,Php,Wordpress,File,Caching,这个问题更多的是关于方法论,而不是实际的代码行 我想知道如何为php中的文件实现伪缓存(因为没有更好的名称)。我试着读了一些文章,但大多数都提到PHP的内部缓存系统,而不是我需要的文件缓存 我有几个场景需要应用这样的系统: 场景1: 访问帖子并单击链接时,会收集所有帖子附件并将其添加到zip文件中进行下载 场景2: 访问帖子时,脚本将扫描所有内容,提取所有链接,下载每个链接的匹配图像(或动态准备一个),然后将这些图像提供给浏览器。(但在检查到期日后除外??) (这些示例使用了“post”和“at

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

我想知道如何为php中的文件实现
伪缓存
(因为没有更好的名称)。我试着读了一些文章,但大多数都提到PHP的内部缓存系统,而不是我需要的文件缓存

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

场景1:

访问帖子并单击链接时,会收集所有帖子附件并将其添加到zip文件中进行下载

场景2:

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

(这些示例使用了
“post”
“attachment”
,因为我使用的是wordpress,这是wordpress术语,它们目前对我来说都很好,只是它们一次又一次地生成文件。)

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

我的第一反应是使用一些独特的(但不是load-unique,如
uniqueid()
)名称调用该文件,然后检查它是否已经在服务器上,但这会带来一些问题(例如它可能已经作为命名存在,但属于另一篇文章…)而且,对于一个拥有20000个图像的服务器来说,这应该是非常占用资源的

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

另外,在检查服务器上是否存在文件的情况下,如何知道是否应该更改(并因此重新创建)该文件

因为我提到的是wordpress,所以我想用
transien_API将这些图像作为base64从二进制文件直接存储到DB中,但感觉相当笨拙

总结一下这个问题。如何生成一个文件,但也知道它是否存在,并在需要时直接调用它??我唯一的选择是将文件名存储在DB中并以某种方式将其与post关联吗??那似乎太没效率了

编辑I

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

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;
} 
对于场景1:

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

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

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