ProfiPHPProfiPHP
Категория: Поддержка OUR-CMS

Поиск неиспользованных изображений в OUR-CMS

Представьте ситуацию: вы удалили категорию с большим количеством записей. Но удалится исключительно текстовая сторона, а все изображения, которые использовались в записях категории - продолжат сохранятся загруженными на сервер.

Опишем скрипт, который осуществляет поиск неиспользованных изображений в OUR-CMS.

Для установки скопируйте содержимое архива Unused_images в корень сайта и запустите его:
http://yousite/unused_images.php
Исходный код файла:
<?php
function get_size( $bytes )
{
if ( $bytes < 1000 * 1024 ) {
return number_format( $bytes / 1024, 2 ) . " KB";
}
elseif ( $bytes < 1000 * 1048576 ) {
return number_format( $bytes / 1048576, 2 ) . " MB";
}
elseif ( $bytes < 1000 * 1073741824 ) {
return number_format( $bytes / 1073741824, 2 ) . " GB";
}
else {
return number_format( $bytes / 1099511627776, 2 ) . " TB";
}
}
$result = '';
$array_images = array( );
$dir = glob( $_SERVER['DOCUMENT_ROOT'].'/content/infopagedb/*.dat' );
foreach ( $dir as $thisName )
{
@chmod( $thisName, 0644 );
$array_filedb = file( $thisName );
$row = unserialize( $array_filedb[0] );
$count = count( $array_filedb );
for ( $i = 1; $i < $count; $i++ )
{
if ( trim( $array_filedb[$i] ) != '' )
{
$messold = unserialize( $array_filedb[$i] );
preg_match_all( '/<img[^>]+src="?\'?([^"\']+)"?\'?[^>]*>/i', str_replace( array( "|slash|", "|quotes|" ), array( "\\", "\"" ), $messold['mess'] ), $matches );
foreach ( $matches[1] as $src ) {
if ( ! in_array( strtolower( parse_url( $src, PHP_URL_PATH ) ), $array_images ) ) {
$array_images[ ] = strtolower( parse_url( $src, PHP_URL_PATH ) );
}
}
preg_match_all( '/<img[^>]+src="?\'?([^"\']+)"?\'?[^>]*>/i', str_replace( array( "|slash|", "|quotes|" ), array( "\\", "\"" ), $messold['extra'] ), $matches );
foreach ( $matches[1] as $src ) {
if ( ! in_array( strtolower( parse_url( $src, PHP_URL_PATH ) ), $array_images ) ) {
$array_images[ ] = strtolower( parse_url( $src, PHP_URL_PATH ) );
}
}
}
}
}
$dir = glob( $_SERVER['DOCUMENT_ROOT'].'/content/pagedb/*.dat' );
foreach ( $dir as $thisName )
{
if ( $thisName == $_SERVER['DOCUMENT_ROOT'].'/content/pagedb/404.dat' ) continue;
@chmod( $thisName, 0644 );
$fopendb = fopen( $thisName, 'r' );
flock( $fopendb, LOCK_SH );
$data = fread( $fopendb, filesize( $thisName ) );
flock( $fopendb, LOCK_UN );
fclose( $fopendb );
$content = explode( '<!-- OUR_content -->', $data );
preg_match_all( '/<img[^>]+src="?\'?([^"\']+)"?\'?[^>]*>/i', str_replace( array( "|slash|", "|quotes|" ), array( "\\", "\"" ), $content[1] ), $matches );
foreach ( $matches[1] as $src ) {
if ( ! in_array( strtolower( parse_url( $src, PHP_URL_PATH ) ), $array_images ) ) {
$array_images[ ] = strtolower( parse_url( $src, PHP_URL_PATH ) );
}
}
}
$all_filesize = 0;
$num = 1;
function scan_dir( $path )
{
global $all_filesize, $array_images, $result, $num;
if ( $content_scan_dir = glob( $path.'/*') )
{
foreach ( $content_scan_dir as $object )
{
if ( is_dir( $object ) ) {
scan_dir( $object );
}
else {
@chmod( $object, 0644 );
if ( ! in_array( strtolower( str_replace( $_SERVER['DOCUMENT_ROOT'], '', $object ) ), $array_images ) ) {
$all_filesize = $all_filesize + filesize( $object );
$result .= '
<tr>
<td>'.$num++.'</td>
<td>'.str_replace( $_SERVER['DOCUMENT_ROOT'], '', $object ).'</td>
<td>'.get_size( filesize( $object ) ).'</td>
</tr>';
}
}
}
}
}
scan_dir( $_SERVER['DOCUMENT_ROOT'].'/userfiles/image' );
echo '<h1>Поиск неиспользованных изображений</h2>';
if ( empty( $result ) ) {
echo 'Нет неиспользованных изображений!';
}
else {
echo '
<table border="1">
<tr>
<td><b>№</b></td>
<td><b>Изображение:</b></td>
<td><b>Размер:</b></td>
</tr>
'.$result.'
<tr>
<td colspan="2">Общий размер</td>
<td>'.get_size( $all_filesize ).'</td>
</table>';
}
?>
Если вы хотите удалить неиспользованные изображения, необходимо изменить участок кода:
if ( ! in_array( strtolower( str_replace( $_SERVER['DOCUMENT_ROOT'], '', $object ) ), $array_images ) ) {
$all_filesize = $all_filesize + filesize( $object );
$result .= '
<tr>
<td>'.$num++.'</td>
<td>'.str_replace( $_SERVER['DOCUMENT_ROOT'], '', $object ).'</td>
<td>'.get_size( filesize( $object ) ).'</td>
</tr>';
}
}
на:
if ( ! in_array( strtolower( str_replace( $_SERVER['DOCUMENT_ROOT'], '', $object ) ), $array_images ) ) {
unlink( $object );
}

Добавить комментарий

Имя:
Текст комментария: