Перейти к публикации

Рекомендованные сообщения

Так уж случилось, что у меня в каждой новости прикрепляется много файлов и постоянно опрашивать размер файла функцией filesize тоже не есть хорошо.

 

Поэтому пришлось изменить функцию до такого вида

 

function show_attach($story, $id, $static = false) {
	global $db, $config, $lang, $user_group, $member_id, $_TIME, $news_date;

	$find_1 = array();
	$find_2 = array();
	$replace_1 = array();
	$replace_2 = array();

	$tpl = new dle_template();
	$tpl->dir = TEMPLATE_DIR;

	if( $static ) {
		
		if( is_array( $id ) and count( $id ) ) {
			$list = array();
			
			foreach ( $id as $value ) {
				$list[] = intval($value);
			}
			
			$id = implode( ',', $list );
			
			$where = "static_id IN ({$id})";
			
		} else $where = "static_id = '".intval($id)."'";
		
		$db->query( "SELECT id, date, name, onserver, dcount, size FROM " . PREFIX . "_static_files WHERE $where" );
		
		$area = "&area=static";
	
	} else {
		
		if( is_array( $id ) and count( $id ) ) {
			
			$list = array();
			
			foreach ( $id as $value ) {
				$list[] = intval($value);
			}
			
			$id = implode( ',', $list );
			
			$where = "news_id IN ({$id})";
			
		} else $where = "news_id = '".intval($id)."'";
		
		$db->query( "SELECT id, date, name, onserver, dcount, size FROM " . PREFIX . "_files WHERE $where" );
		
		$area = "";
	
	}

	if( !file_exists( $tpl->dir . "/attachment.tpl" ) ) {
	
		$tpl->template = <<<HTML
[allow-download]<span class="attachment"><a href="{link}" >{name}</a> [count] [{size}] ({$lang['att_dcount']} {count})[/count]</span>[/allow-download]
[not-allow-download]<span class="attachment">{$lang['att_denied']}</span>[/not-allow-download]
HTML;
	
		$tpl->copy_template = $tpl->template;
	
	} else {
		
		$tpl->load_template( 'attachment.tpl' );
		
	}
	
	
	
	while ( $row = $db->get_row() ) {
		

		if (!empty($row['size']) AND $row['size']>0) {
			$size = formatsize($row['size']);
		}
		else{
			$binsize = (@filesize(ROOT_DIR . '/uploads/files/' . $row['onserver']));
			
			$size_arr[$row['id']]=$binsize;

			//$db->query( "UPDATE " . PREFIX . "_files SET size='{$size}' WHERE onserver = '{$row['onserver']}'" );
			
			$size = formatsize($binsize);
		}	
		

		$row['name'] = explode( "/", $row['name'] );
		$row['name'] = end( $row['name'] );
		
		$filename_arr = explode( ".", $row['onserver'] );
		$type = strtolower(end( $filename_arr ));

		$find_1[] = '[attachment=' . $row['id'] . ']';
		$find_2[] = "#\[attachment={$row['id']}:(.+?)\]#i";
		
		//require ENGINE_DIR . '/modules/functions.dp.php';

		if (stripos ( $tpl->copy_template, "{md5}" ) !== false) {
			$tpl->set( '{md5}', @md5_file( ROOT_DIR . '/uploads/files/' . $row['onserver'] ) );
		}
		
		if (stripos ( $tpl->copy_template, "{sha256}" ) !== false) {
			$tpl->set( '{sha256}', @hash_file('sha256', ROOT_DIR . '/uploads/files/' . $row['onserver'] ) );
		}		

		if (stripos ( $tpl->copy_template, "{size}" ) !== false) {
			$tpl->set( '{size}', $size );
		}
		
		if ( $user_group[$member_id['user_group']]['allow_files'] ) {
			
			$tpl->set( '[allow-download]', "" );
			$tpl->set( '[/allow-download]', "" );
			$tpl->set_block( "'\\[not-allow-download\\](.*?)\\[/not-allow-download\\]'si", "" );
					
		} else {
			
			$tpl->set( '[not-allow-download]', "" );
			$tpl->set( '[/not-allow-download]', "" );
			$tpl->set_block( "'\\[allow-download\\](.*?)\\[/allow-download\\]'si", "" );
			
		}
		
		if ( $config['files_count'] ) {
			$tpl->set( '{count}', $row['dcount'] );
			$tpl->set( '[count]', "" );
			$tpl->set( '[/count]', "" );
			$tpl->set_block( "'\\[not-allow-count\\](.*?)\\[/not-allow-count\\]'si", "" );
					
		} else {
			$tpl->set( '{count}', "" );			
			$tpl->set( '[not-allow-count]', "" );
			$tpl->set( '[/not-allow-count]', "" );
			$tpl->set_block( "'\\[count\\](.*?)\\[/count\\]'si", "" );
			
		}
		
		if( date( 'Ymd', $row['date'] ) == date( 'Ymd', $_TIME ) ) {
			
			$tpl->set( '{date}', $lang['time_heute'] . langdate( ", H:i", $row['date'] ) );
		
		} elseif( date( 'Ymd', $row['date'] ) == date( 'Ymd', ($_TIME - 86400) ) ) {
			
			$tpl->set( '{date}', $lang['time_gestern'] . langdate( ", H:i", $row['date'] ) );
		
		} else {
			
			$tpl->set( '{date}', langdate( $config['timestamp_active'], $row['date'] ) );
		
		}

		$news_date = $row['date'];
		$tpl->copy_template = preg_replace_callback ( "#\{date=(.+?)\}#i", "formdate", $tpl->copy_template );

		$tpl->set( '{name}', $row['name'] );
		$tpl->set( '{extension}', $type );
		
		$st_p_hpu=($area) ? 'st' : '';
		$tpl->set( '{link}', $config['http_home_url']."ss".$st_p_hpu."file-".$row['id'].$area );
		
		//$tpl->set( '{link}', $config['http_home_url']."backend/download.php?id=".$row['id'].$area );
		
		$tpl->set( '{id}', $row['id'] );

		$tpl->compile( 'attachment' );
		
		$replace_1[] = $tpl->result['attachment'];
		
		$tpl->result['attachment'] = str_replace( $row['name'], "\\1", $tpl->result['attachment'] );
		
		$replace_2[] = $tpl->result['attachment'];
		
		$tpl->result['attachment'] = '';

	}
	
	$tpl->clear();
	$db->free();

	$story = str_replace ( $find_1, $replace_1, $story );
	$story = preg_replace( $find_2, $replace_2, $story );
	
	$static_prefix=($static) ? '_static' : '';
	
	if(is_array($size_arr) && count($size_arr)){
		foreach($size_arr as $key=>$value) {
			$query = 'UPDATE ' . PREFIX . $static_prefix.'_files SET ';
			$query .= "`size` = '".$value."'";
			$query .= ' WHERE `id` = \''.$key.'\';';
			$db->query($query);
		}
	}

	return $story;

}

а в файле upload.class.php перед

@chmod( ROOT_DIR . "/uploads/files/" . FOLDER_PREFIX . $uploaded_filename, 0666 );

вставить

$binsize = (@filesize(ROOT_DIR . '/uploads/files/' . FOLDER_PREFIX . $uploaded_filename));

Поменять два запроса в upload.class.php на

этот

$db->query( "INSERT INTO " . PREFIX . "_static_files (static_id, author, date, name, onserver, size) values ('{$this->news_id}', '{$this->author}', '{$added_time}', '{$filename}', '". FOLDER_PREFIX ."{$uploaded_filename}','".$binsize."')" );

и на этот

$db->query( "INSERT INTO " . PREFIX . "_files (news_id, name, onserver, author, date, size) values ('{$this->news_id}', '{$filename}', '". FOLDER_PREFIX ."{$uploaded_filename}', '{$this->author}', '{$added_time}','".$binsize."')" );

 

 

Ну и выполнить запрос в базу

ALTER TABLE `ВАШПРЕФИКС_files` ADD `size` BIGINT NOT NULL AFTER `onserver`;
ALTER TABLE `ВАШПРЕФИКС_static_files` ADD `size` BIGINT NOT NULL AFTER `onserver`;

Ну вот, теперь загрузка страниц пошла веселее

Изменено пользователем morgenshtern
Ссылка на сообщение
Поделиться на других сайтах
  • 4 месяца спустя...

Но лучше конечно же сделать так в функции show_attach в файле functions.php

 

Не знаю как с md5_file но вот hash_file выполнялась больше секунды и сильно замедляла загрузку страниц

 

if (stripos ( $tpl->copy_template, "{md5}" ) !== false) {
		$md5 = dle_cache( "md5", $row['id'] );
	if ($md5 == false) {
		$md5 = @md5_file('md5', ROOT_DIR . '/uploads/files/' . $row['onserver'] );
		create_cache( "md5", $md5, $row['id'] );
	}

	$tpl->set( '{md5}', $md5 );
}

if (stripos ( $tpl->copy_template, "{size}" ) !== false) {
		$size = dle_cache( "size", $row['id'] );
	if ($size == false) {
		$size = formatsize( @filesize( ROOT_DIR . '/uploads/files/' . $row['onserver'] ));
		create_cache( "size", $size, $row['id'] );
	}

	$tpl->set( '{size}', size );
}

if (stripos ( $tpl->copy_template, "{sha256}" ) !== false) {
	$sha256 = dle_cache( "sha256", $row['id'] );
	if ($sha256 == false) {
		$sha256 = @hash_file('sha256', ROOT_DIR . '/uploads/files/' . $row['onserver'] );
		create_cache( "sha256", $sha256, $row['id'] );
	}

	$tpl->set( '{sha256}', $sha256 );
}    

 

Изменено пользователем morgenshtern
Ссылка на сообщение
Поделиться на других сайтах

Это уже не актуально, разработчик услышал молитвы и вынес это в БД по дефолту с v11.2...

Изменено пользователем SKYNET74
Ссылка на сообщение
Поделиться на других сайтах

Вы уже второй раз не читаете что я пишу. Я тут писал про кеширование ресурсоемкой функции хэша. А сам пост писался до выхода 11.2

Ссылка на сообщение
Поделиться на других сайтах
В 07.01.2017 в 00:04, morgenshtern сказал:

Вы уже второй раз не читаете что я пишу. Я тут писал про кеширование ресурсоемкой функции хэша. А сам пост писался до выхода 11.2

Да будет вам известно, что хеш тоже вынесен в БД с v11.2...

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

×
×
  • Создать...