Php 图像缓存

Php 图像缓存,php,yii,yii-extensions,Php,Yii,Yii Extensions,我使用IWI扩展来缓存在yii框架中显示时的图像。它工作正常,但问题是当我更新一个图像时,过去的缓存文件和文件夹已经存在。更新图像后,请帮助我删除那些过去的缓存文件夹 编辑: $img = $image_name[0]['image_name']; $p = 'images/'.$img; $newpath = Yii::app()->iwi->load($p)->resize(100,300,Image::AUTO)->cache(); $newpath = expl

我使用IWI扩展来缓存在yii框架中显示时的图像。它工作正常,但问题是当我更新一个图像时,过去的缓存文件和文件夹已经存在。更新图像后,请帮助我删除那些过去的缓存文件夹

编辑:

$img = $image_name[0]['image_name']; 
$p = 'images/'.$img;
$newpath = Yii::app()->iwi->load($p)->resize(100,300,Image::AUTO)->cache();
$newpath = explode('=',$newpath); ?> 
Image : <br/><br/> 
<?php echo CHtml::image($newpath[1],"image"); ?> 
<div class="row">
<?php echo $form->labelEx($model, 'image'); ?>
<?php echo $form->fileField($model, 'image'); ?>
<?php echo $form->error($model, 'image'); ?>
</div>

$img=$image\u name[0]['image\u name'];
$p='images/'。$img;
$newpath=Yii::app()->iwi->load($p)->调整大小(100300,Image::AUTO)->缓存();
$newpath=分解('=',$newpath);?>
图像:


当我更新一张特定的图片时。假设我正在更新表中id为1的图像。新图片正在使用新的缓存文件夹更新,并且以前的缓存文件夹已存在。

好的,我查看了IwI扩展,我想我理解您的要求

不幸的是,你无法在开箱即用的情况下实现这一点。Iwi使用具有上次修改日期的缓存id。这意味着更改图像将创建一个新的缓存文件/文件夹,而不是根据依赖项规则进行替换

我认为最好的选择是扩展
Iwi
,然后覆盖
cache()
方法(最好使用Yii的缓存)

以下是一个未经测试的示例:

扩展
Iwi
class
: 这是非常基本的,可能不包括你的所有情况(即:用另一个不同的文件覆盖一个文件。其中一些是多余的,但我这样做是为了清楚)


希望这能让你走上正轨。祝你好运

你能举个代码示例吗?$img=$image\u name[0]['image\u name']$p=‘图像/’。$img$newpath=Yii::app()->iwi->load($p)->resize(100300,Image::AUTO)->cache()$newpath=分解('=',$newpath);?>图像:

当我更新特定图片时。假设我正在更新表中id为1的图像。新图片正在使用新的缓存文件夹进行更新,并且存在以前的缓存文件夹。我不确定我是否理解。预期的行为是什么?你是说它使用了过去的缓存而不是新映像?否。当我更新特定映像时,以前映像的以前缓存文件夹仍保留在服务器上。我想在更新特定映像时删除以前映像的以前缓存文件夹。请参阅下面的回答。不幸的是,默认情况下,您不可能执行此操作,因为用于命名文件/文件夹的哈希使用时间元素(这意味着它可以是任何内容,以便在没有覆盖原始文件的情况下无法再次找到它)
class MyIwi extends Iwi
{
    public function cache()
    {
        if (!isset($this->image["file"])) {
            return false;
        } 
        $cacheFolder = YiiBase::getPathOfAlias('webroot.images.site.cache');   
        $imagePath = $this->image["file"];
        $info = pathinfo($imagePath);


        //create unique ID (filename for cached image) using actions and path. then serialize and hash it.
        $needle = $this->actions;
        array_unshift($needle, $imagePath);
        $cachedFilePath = $cacheFolder."/".md5(json_encode($needle)).".".$info["extension"];

        //if cache file doesn't exist or is older than file then cache 
        if(  
           $this->createOrNone() //did not look into this, keeping because it was in original method
           &&
           (!file_exists($cachedFilePath)
           || 
           filetime($imagePath) > filetime($cachedFilePath))
        )
            $this->save($cachedFilePath);
        return Yii::app()->createUrl($cachedFilePath);
    }

}