我在数据库中有一个表,可以跟踪每个主系统的所有图像,如下所示:
Table: system_images
field: systemid
field: imglarge
field: imgthumb
有时会从数据库中删除系统,包括属于该系统条目的system_images中的所有记录。但是,图像本身仍然在服务器上。目前有一个cron作业抓取目录中的所有图像,然后每次查询以查看该图像是否仍在表中,如果没有则从服务器上删除该图像。这是当前的cron工作的样子
$system_images = array_diff(scandir($global_productimages),array('..', '.'));
$image_count = count($system_images);
if($image_count > 0)
{
foreach($system_images AS $curr_image)
{
$image_name = trim($curr_image);
$find = $image_query->findSystemImage($image_name);
if($find == 0)
{
unlink($imgpath .$image_name);
}
}
}
有没有办法我不必为每个图像做一个查询?目录中可能有数千个图像。
答案 0 :(得分:2)
为什么删除系统后不立即删除它们?
1)在删除系统记录之前,请使用SELECT
语句并推入array
其所属的图像名称
2)Delete
记录
3)Unlink
图片通过迭代持有图像的array
如果您逐个扫描并查询数据库,则无需使用cron进行此作业,看起来太重了。
答案 1 :(得分:0)
两个建议
短期(扩大@ paokg4的建议)
您可以使用类似
之类的东西轻松地在命令行上执行清理FILEPATH=/global/product/imagedir; mysql -ENe 'select imglarge, imgthumb from `yourdbname`.`system_images` where systemid = 123' | grep -v '^\*' | xargs -i rm $FILEPATH/{}
我们使用mysql的垂直输出格式(-E)在删除列名(-N)的同时同时获取两个文件名,使用grep抑制输出中的行号,并将结果传递给rm
长期
听起来好像你在这里遇到的主要问题是删除系统'可能有成千上万的相关图像 - 最后的整理练习。对于这个问题,它建议您将多个系统的图像存储在一个目录中,并且在文件系统级别没有明显的方法来区分与不同系统关联的图像。
如果这确实是当前设置的特征,那么它还建议了一些问题的长期解决方案,这些解决方案允许通过单个操作删除文件,例如。
将不同系统的图像存储在不同的目录中 - 在哪种情况下你可以删除目录。
为您存储的文件名添加系统前缀,然后允许 您可以使用简单的通配符搜索删除它们。