近期,在使用 Chevereto 程序的时候,发现了一个奇怪的问题,每次删除图片的时候,虽然数据库中的记录已经被删除了,但是,外部存储中的图片并没有被删除掉,针对这个问题,本文简单分享一下通过定时任务解决 Chevereto 外部存储图片无法删除的方法。
问题分析
如果使用了外部存储,删除图片的时候正常来说外部存储中对应的图片也需要被删除,程序源码中提供了删除的代码,但是需要我们手动执行定时任务来执行删除代码。
1、源码分析
在 app/lib/classes/class.storage.php 文件的 deleteFiles 方法中,找到了下面这句注释代码:
// Just for CHV::DB, the real thing will be deleted in the queue
意思是说:删除图片的时候,只操作数据库,文件删除在队列中执行。
2、数据库分析
在 ch_queues 表中,可以看到队列任务的记录,其中任务的状态为 pending,意思是 “待办”,于是可以猜测队列任务没有执行。
3、定时任务源码分析
在 app/cron.php 这个文件中,可以看到任务包含:删除外部存储图片,删除未经确认的用户帐号等,于是想到,可以通过定时任务来执行该文件代码。
4、解决方法
最终,在官方论坛中找到了解决方法,执行下述定时任务:
php /www/wwwroot/chevereto/cli.php -C cron
以宝塔面板为例,配置如下定时任务:
本文是以 Chevereto v3.20.18 为例来说明的,低版本中没有 cli.php 文件,可升级至 v3.20.18.
5、测试
手动执行上述定时任务,宝塔面板定时任务的输出日志:
查看外部存储,发现图片已经被删除了。至此,大功告成!
结束语
针对 Chevereto 外部存储中的图片无法被删除的这个问题,Chevereto 源码已经提供了删除代码,只不过需要我们手动执行定时任务来配合完成。这个问题困扰我有一段时间了,今天终于找到了完美的解决方法,故记录一下,方便有此需求的小伙伴参考。
本文已通过「原本」原创作品认证,转载请注明文章出处及链接。