这个问题更多的是关于方法而不是实际的代码 -
我想知道如何在php中为FILES实现pseudo caching
(缺少更好的名称)。我曾尝试阅读一些文章,但大多数文章都是指PHP的内部缓存系统,而不是我需要的文件缓存。
我有几个场景需要应用这样的系统:
情景1:
在访问帖子并点击链接时,会收集所有帖子附件并将其添加到zip文件中以供下载。
情景2:
访问帖子,脚本将扫描所有内容,提取所有链接,为每个链接下载一些匹配的图像(或动态准备一个),然后将其提供给浏览器。 (但在结束有效期后却没有?)
(这些示例使用"post"
和"attachment"
因为我使用wordpress并且它是wordpress术语,两者目前对我很好,除非它们一遍又一遍地生成文件。)
我对这两种情况(特别是No.2)的疑虑 - 如何在访问页面时阻止脚本执行操作? (换句话说,如果文件存在,只需提供它而不再循环整个创建操作)
我的第一直觉是使用一些独特的(但不是加载 - 唯一的,如uniqueid()
)名称来调用该文件,然后检查它是否已经在服务器上,但这会产生一些问题(比如它已经存在)命名,但另一篇文章......)以及 - 对于拥有20,000张图像的服务器来说,这应该是非常耗费资源的。
我想到的第二件事是以某种方式关联这些文件的元数据,但话又说回来,如何实现它?怎么知道哪个链接是什么形象?
此外,在我检查服务器上是否存在文件的情况下,如何知道文件是否应该更改(并因此重新创建)?
由于我正在引用wordpress,我考虑将这些图像作为base64从二进制文件直接存储到带有transien_API
的DB中 - 但它感觉非常笨拙。
总结一下这个问题。如何生成文件,但也知道它是否存在并在需要时直接调用它?我唯一的选择是将文件名存储在数据库中并以某种方式将其与帖子相关联?这看起来很无效..
编辑我
我决定加入一些示例代码,因为它可以帮助人们理解我的困境。
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;
}
答案 0 :(得分:0)
对于场景1:
Wordpress将所有帖子附件存储为帖子表中的帖子。当访问帖子时,在创建的插件或主题functions.php中运行一个函数。如果您已经使用函数file_exists()使用您创建的每个zip存档的唯一名称创建了zip文件,则使用pre_get_posts挂钩检查,帖子ID或永久链接将是一个好主意。虽然您需要确保没有用户特定的内容。您可以使用filemtime()来检查文件创建的时间以及它是否仍然相关。如果zip文件不存在,则创建它,pre_get_posts将传递具有帖子ID的查询对象,只需使用get_posts获取所有帖子附件,并将父ID设置为查询对象中传递的ID。 GUID字段包含每个附件的URL,然后使用ZipArchive()在此tutorial之后生成一个zip存档。
对于场景2: 如果您的wordpress模板设置为使用wordpress功能,则替换附件功能以返回其URL并将其映射到您具有缓存内容的新URL。例如,the_post_thumbnail()将转到wp_get_attachment_thumb_url()将文件复制到缓存并使用缓存URL作为输出。如果你想为页面缓存DOM,也可以使用ob_start()。现在只需使用file_exists和filetime()在模板的开头进行检查,如果两者都在缓存的DOM中有效读取而不是加载页面。