morgenshtern 5 Опубликовано: 12 августа 2016 Рассказать Опубликовано: 12 августа 2016 (изменено) Так уж случилось, что у меня в каждой новости прикрепляется много файлов и постоянно опрашивать размер файла функцией 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`; Ну вот, теперь загрузка страниц пошла веселее Изменено 12 августа 2016 пользователем morgenshtern 1 Цитата Ссылка на сообщение Поделиться на других сайтах
morgenshtern 5 Опубликовано: 5 января 2017 Рассказать Опубликовано: 5 января 2017 (изменено) Автор Но лучше конечно же сделать так в функции 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 ); } Изменено 5 января 2017 пользователем morgenshtern Цитата Ссылка на сообщение Поделиться на других сайтах
SKYNET74 315 Опубликовано: 6 января 2017 Рассказать Опубликовано: 6 января 2017 (изменено) Это уже не актуально, разработчик услышал молитвы и вынес это в БД по дефолту с v11.2... Изменено 6 января 2017 пользователем SKYNET74 1 Цитата Ссылка на сообщение Поделиться на других сайтах
morgenshtern 5 Опубликовано: 6 января 2017 Рассказать Опубликовано: 6 января 2017 Автор Вы уже второй раз не читаете что я пишу. Я тут писал про кеширование ресурсоемкой функции хэша. А сам пост писался до выхода 11.2 Цитата Ссылка на сообщение Поделиться на других сайтах
SKYNET74 315 Опубликовано: 13 января 2017 Рассказать Опубликовано: 13 января 2017 В 07.01.2017 в 00:04, morgenshtern сказал: Вы уже второй раз не читаете что я пишу. Я тут писал про кеширование ресурсоемкой функции хэша. А сам пост писался до выхода 11.2 Да будет вам известно, что хеш тоже вынесен в БД с v11.2... 1 Цитата Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Присоединяйтесь к обсуждению
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.