【发布时间】:2016-06-02 21:08:10
【问题描述】:
在 Prestashop,当我删除一些产品时,图像仍保留在其目录 /img/p/ 中,因此目前我的图像目录接近 2GB。 找到这个脚本来删除 Prestashop 上无用和 BBDD 未链接的图像,但我不知道为什么它只检测孤儿图像而不是删除它们。也许在 php 配置中禁用了 unlink 功能?可能吗?还是代码错了?还有其他方法可以进行这种清理吗?
<?php
// root path of the shop
$shop_root='/home/myweb/public_html/';
// limit number of image files to check, set to 10 for testing
$limit=1000000000;
include $shop_root . '/config/settings.inc.php';
$pdo = new PDO( 'mysql:host='._DB_SERVER_.';dbname='._DB_NAME_, _DB_USER_, _DB_PASSWD_ );
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$r=$pdo->query('select count(1) cnt from ps_image')->fetch();
echo 'count images database: '.$r['cnt'] . "<Br />";
// reset some counters
$cnt_files=0;
$cnt_checked=0;
$cnt_not_found=0;
$cnt_found=0;
for($ii=1; ($ii<=9) && ($cnt_files != $limit); $ii++)
{
$path=$shop_root.'img/p/'.$ii;
delImage($path);
for($jj=0; ($jj<=9) && ($cnt_files != $limit); $jj++)
{
$path=$shop_root.'img/p/'.$ii.'/'.$jj;
delImage($path);
for($kk=0; ($kk<=9) && ($cnt_files != $limit); $kk++)
{
$path=$shop_root.'img/p/'.$ii.'/'.$jj.'/'.$kk;
delImage($path);
for($ll=0; ($ll<=9) && ($cnt_files != $limit); $ll++)
{
$path=$shop_root.'img/p/'.$ii.'/'.$jj.'/'.$kk.'/'.$ll;
delImage($path);
}
}
}
}
echo 'files: '.$cnt_files.' checked: '.$cnt_checked.' not_found: '.$cnt_not_found.' found: '.$cnt_found;
function delImage($imageDir)
{
global $limit, $pdo, $cnt_files, $cnt_checked, $cnt_not_found, $cnt_found;
if ($handle = @opendir($imageDir)) { //@ is wriiten to avoid warning message and is handled in else condition
echo $imageDir."<BR />";
while ($cnt_files != $limit && false !== ($entry = readdir($handle))) {
if ($entry != "." && $entry != "..") {
$cnt_files++;
$pi = explode('-',$entry);
if($pi[0]>0 && !empty($pi[1])) {
$cnt_checked++;
if(!checkExistsDb($pdo,$pi[0])) {
$cnt_not_found++;
echo 'rm '.$imageDir.'/'.$entry."<BR />";
unlink($imageDir.'/'.$entry);
} else {
$cnt_found++;
}
}
}
}
closedir($handle);
}
else
{
echo $imageDir." doesn't exist".'<BR />';
}
}
function checkExistsDb($pdo, $id_image) {
$r=$pdo->query($q='select \'ok\' ok, (select id_image from ps_image where id_image = '.(int)$id_image.') id_image');
$row=$r->fetch();
if($row['ok']!='ok') die( 'Problem with query, please correct');
return $row['id_image']?true:false;
}
?>
这是一个输出片段:
/home/myweb/public_html/img/p/9/9/7
/home/myweb/public_html/img/p/9/9/7/0 doesn't exist
/home/myweb/public_html/img/p/9/9/7/1 doesn't exist
/home/myweb/public_html/img/p/9/9/7/2 doesn't exist
/home/myweb/public_html/img/p/9/9/7/3 doesn't exist
/home/myweb/public_html/img/p/9/9/7/4 doesn't exist
/home/myweb/public_html/img/p/9/9/7/5 doesn't exist
/home/myweb/public_html/img/p/9/9/7/6 doesn't exist
/home/myweb/public_html/img/p/9/9/7/7 doesn't exist
/home/myweb/public_html/img/p/9/9/7/8 doesn't exist
/home/myweb/public_html/img/p/9/9/7/9 doesn't exist
/home/myweb/public_html/img/p/9/9/8
/home/myweb/public_html/img/p/9/9/8/0 doesn't exist
/home/myweb/public_html/img/p/9/9/8/1 doesn't exist
/home/myweb/public_html/img/p/9/9/8/2 doesn't exist
/home/myweb/public_html/img/p/9/9/8/3 doesn't exist
/home/myweb/public_html/img/p/9/9/8/4 doesn't exist
/home/myweb/public_html/img/p/9/9/8/5 doesn't exist
/home/myweb/public_html/img/p/9/9/8/6 doesn't exist
/home/myweb/public_html/img/p/9/9/8/7 doesn't exist
/home/myweb/public_html/img/p/9/9/8/8 doesn't exist
/home/myweb/public_html/img/p/9/9/8/9 doesn't exist
/home/myweb/public_html/img/p/9/9/9
/home/myweb/public_html/img/p/9/9/9/0 doesn't exist
/home/myweb/public_html/img/p/9/9/9/1 doesn't exist
/home/myweb/public_html/img/p/9/9/9/2 doesn't exist
/home/myweb/public_html/img/p/9/9/9/3 doesn't exist
/home/myweb/public_html/img/p/9/9/9/4 doesn't exist
/home/myweb/public_html/img/p/9/9/9/5 doesn't exist
/home/myweb/public_html/img/p/9/9/9/6 doesn't exist
/home/myweb/public_html/img/p/9/9/9/7 doesn't exist
/home/myweb/public_html/img/p/9/9/9/8 doesn't exist
/home/myweb/public_html/img/p/9/9/9/9 doesn't exist
files: 29013 checked: 22290 not_found: 0 found: 22290
【问题讨论】:
-
您可以
var_dumpunlink 调用并查看它是否返回 (bool) true|false。 -
@paskl 非常感谢。它没有返回任何东西..所以我认为代码流没有到达 if(!checkExistsDb($pdo,$pi[0])) 块。
标签: php image optimization prestashop