From 286e8ad5b1d10aef3b423d050ca8d74be851330e Mon Sep 17 00:00:00 2001 From: Matthieu Leproux Date: Wed, 7 Jul 2021 18:10:22 +0200 Subject: [PATCH] related to #1316 Calculates cache size and cache size derivatives --- admin/include/functions.php | 43 ++++++++ admin/maintenance_actions.php | 4 +- admin/maintenance_env.php | 2 + admin/themes/default/js/maintenance.js | 30 ++--- .../default/template/maintenance_actions.tpl | 104 +++++++++++------- .../default/template/maintenance_env.tpl | 15 ++- include/ws_functions/pwg.php | 65 ++++++++--- language/en_UK/admin.lang.php | 4 +- language/fr_FR/admin.lang.php | 6 +- 9 files changed, 196 insertions(+), 77 deletions(-) diff --git a/admin/include/functions.php b/admin/include/functions.php index 5095fb773..d2b5b8ca7 100644 --- a/admin/include/functions.php +++ b/admin/include/functions.php @@ -3410,3 +3410,46 @@ SELECT * return $images[0]; } + + +/** + * Return each cache image sizes. + * + * @since 12 + * @param string $path_to_file + */ +function get_cache_size_derivatives($path) +{ + $msizes = array(); //final res + $subdirs = array(); //sous-rep + + if (is_dir($path)) + { + if ($contents = opendir($path)) + { + while (($node = readdir($contents)) !== false) + { + if ($node == '.' or $node == '..') continue; + + if (is_file($path.'/'.$node)) + { + if ($split = explode('-' ,$node)) + { + $size_code = substr(end($split), 0, 2); + @$msizes[$size_code] += filesize($path.'/'.$node); + } + } + elseif (is_dir($path.'/'.$node)) + { + $tmp_msizes = get_cache_size_derivatives($path.'/'.$node); + foreach ($tmp_msizes as $size_key => $value) + { + @$msizes[$size_key] += $value; + } + } + } + } + closedir($contents); + } + return $msizes; +} diff --git a/admin/maintenance_actions.php b/admin/maintenance_actions.php index abfa9a02c..409448a29 100644 --- a/admin/maintenance_actions.php +++ b/admin/maintenance_actions.php @@ -281,7 +281,9 @@ $template->assign( 'U_PHPINFO' => sprintf($url_format, 'phpinfo'), 'PHP_DATATIME' => $php_current_timestamp, 'DB_DATATIME' => $db_current_date, - 'pwg_token' => $pwg_token + 'pwg_token' => $pwg_token, + 'cache_sizes' => (isset($conf['cache_sizes'])) ? unserialize($conf['cache_sizes']) : null, + 'time_elapsed_since_last_calc' => (isset($conf['cache_sizes'])) ? time_since(unserialize($conf['cache_sizes'])[3]['value'], 'year') : null, ) ); diff --git a/admin/maintenance_env.php b/admin/maintenance_env.php index 6a9820ad4..f00d7c45b 100644 --- a/admin/maintenance_env.php +++ b/admin/maintenance_env.php @@ -292,6 +292,8 @@ $template->assign( 'U_PHPINFO' => sprintf($url_format, 'phpinfo'), 'PHP_DATATIME' => $php_current_timestamp, 'DB_DATATIME' => $db_current_date, + 'cache_sizes' => (isset($conf['cache_sizes'])) ? unserialize($conf['cache_sizes']) : null, + 'time_elapsed_since_last_calc' => (isset($conf['cache_sizes'])) ? time_since(unserialize($conf['cache_sizes'])[3]['value'], 'year') : null, ) ); diff --git a/admin/themes/default/js/maintenance.js b/admin/themes/default/js/maintenance.js index 35ae16efb..e71476cfd 100644 --- a/admin/themes/default/js/maintenance.js +++ b/admin/themes/default/js/maintenance.js @@ -1,14 +1,15 @@ -function displayResponse(domElem, values, mDivs, mValues, lastTimeCalc) { +function displayResponse(domElem, values, mDivs, mValues) { for (let index = 0; index < domElem.length; index++) { - domElem[index].html(values[index]) + domElem[index].html(values[index] + " Mo") } for (let index = 0; index < mDivs.length; index++) { - mDivs[index].title = mValues[index] + "Mo"; + mDivName = mDivs[index].getAttribute("name"); + mDivs[index].title = mValues[mDivName] + " Mo"; } - $(".cache-lastCalculated-value").html(lastTimeCalc) + $(".cache-lastCalculated-value").html(no_time_elapsed); } $(document).ready(function () { @@ -28,26 +29,29 @@ $(document).ready(function () { if (data.stat === "ok") { res(); - console.log(data); - - console.log(data.result.infos[1].value); - var domElemToRefresh = [$(".cache-size-value"), $(".multiple-pictures-sizes"), $(".multiple-compiledTemplate-sizes")]; - var domElemValues = [data.result.infos[0].value, 69, 42]; + var domElemValues = [data.result.infos[0].value, data.result.infos[1].value.all, data.result.infos[2].value]; + for (let i = 0; i < domElemValues.length; i++) { + domElemValues[i] = (domElemValues[i]/1024/1024).toFixed(2); + } var multipleSizes = $(".delete-check-container").children(".delete-size-check"); - var multipleSizesValues = data.result.infos[1].value; + var multipleSizesValues = data.result.infos[1].value + for (const [key, value] of Object.entries(multipleSizesValues)) { + multipleSizesValues[key] = (multipleSizesValues[key]/1024/1024).toFixed(2); + } - displayResponse(domElemToRefresh , domElemValues, multipleSizes, multipleSizesValues, data.result.infos[2].value); + displayResponse(domElemToRefresh , domElemValues, multipleSizes, multipleSizesValues); - $(".refresh-icon").addClass("icon-arrows-cw").removeClass("spin6"); + $(this).children("span").addClass("icon-arrows-cw").removeClass("spin6"); } else { - rej(raw_data); + rej(data); } }, error: function(message) { rej(message); + console.log(message); } }); }) diff --git a/admin/themes/default/template/maintenance_actions.tpl b/admin/themes/default/template/maintenance_actions.tpl index 446c42a3d..2fb92bbcc 100644 --- a/admin/themes/default/template/maintenance_actions.tpl +++ b/admin/themes/default/template/maintenance_actions.tpl @@ -4,6 +4,7 @@ {footer_script} const confirm_msg = '{"Yes, I am sure"|@translate}'; const cancel_msg = "{"No, I have changed my mind"|@translate}"; +const no_time_elapsed = "{"right now"|@translate}"; let selected = []; $(".lock-gallery-button").each(function() { const gallery_tip = '{"A locked gallery is only visible to administrators"|@translate|@escape:'javascript'}'; @@ -113,11 +114,11 @@ $(".delete-size-check").click( function () {
Global Gallery Actions
- {if (isset($U_MAINT_LOCK_GALLERY))} - {'Lock gallery'|@translate} - {else} - {'Unlock gallery'|@translate} - {/if} +{if (isset($U_MAINT_LOCK_GALLERY))} + {'Lock gallery'|@translate} +{else} + {'Unlock gallery'|@translate} +{/if} {'Update albums informations'|@translate} {'Update photos information'|@translate} {'Repair and optimize database'|@translate} @@ -138,28 +139,50 @@ $(".delete-size-check").click( function () {
-Purge Cache + Purge Cache -
-
- {'Cache size'|@translate} - 999 Go - {'calculated'|@translate} - 42 {'months ago'|@translate} - {'Refresh'|@translate} +
+
+ {'Cache size'|@translate} + +{if isset($cache_sizes)} + {round($cache_sizes[0]['value']/1024/1024, 2)} Mo +{else} + {'N/A'|translate} +{/if} + + {if $time_elapsed_since_last_calc}  {'calculated'|@translate}{/if} + {if $time_elapsed_since_last_calc} {$time_elapsed_since_last_calc} {else}   {"never calculated"|@translate} {/if} + {'Refresh'|@translate}
- {'Purge compiled templates'|@translate} 999 Go + {'Purge compiled templates'|@translate} + +{if isset($cache_sizes)} + {round($cache_sizes[2]['value']/1024/1024, 2)} Mo +{else} + {'N/A'|translate} +{/if} + +
-
- {'Delete multiple size images'|@translate}999 Go + {'Delete multiple size images'|@translate} + +{if isset($cache_sizes)} + {round($cache_sizes[1]['value']['all']/1024/1024, 2)} Mo +{else} + {'N/A'|translate} +{/if} + +
- {foreach from=$purge_derivatives key=name item=url name=loop} -
- {$name} +{foreach from=$purge_derivatives key=name item=url name=loop} +
+ + {$name}
- {/foreach} +{/foreach}
@@ -168,8 +191,8 @@ $(".delete-size-check").click( function () { \ No newline at end of file diff --git a/admin/themes/default/template/maintenance_env.tpl b/admin/themes/default/template/maintenance_env.tpl index f807ff063..807b81418 100644 --- a/admin/themes/default/template/maintenance_env.tpl +++ b/admin/themes/default/template/maintenance_env.tpl @@ -1,4 +1,7 @@ {combine_script id='ajax' load='footer' path='admin/themes/default/js/maintenance.js'} +{footer_script} +const no_time_elapsed = "{"right now"|@translate}"; +{/footer_script}
{'Environment'|@translate} @@ -12,9 +15,15 @@ {/if}
  • {'Cache size'|@translate} - 999 Go - {'calculated'|@translate} - {'42 months ago'|@translate} + + {if isset($cache_sizes)} + {round($cache_sizes[0]['value']/1024/1024, 2)} Mo + {else} + {'N/A'|translate} + {/if} + + {if $time_elapsed_since_last_calc}  {'calculated'|@translate}{/if} + {if $time_elapsed_since_last_calc} {$time_elapsed_since_last_calc} {else}   {"never calculated"|@translate} {/if} {'Refresh'|@translate}
  • diff --git a/include/ws_functions/pwg.php b/include/ws_functions/pwg.php index 082872822..d05b30b9e 100644 --- a/include/ws_functions/pwg.php +++ b/include/ws_functions/pwg.php @@ -197,31 +197,63 @@ function ws_getInfos($params, &$service) /** * API method * Calculates and returns the size of the cache + * + * @since 12 * @param mixed[] $params */ function ws_getCacheSize($params, &$service) { + global $conf; + // Cache size - $infos['cache_size'] = 4444; + $path_cache = $conf['data_location']; + $infos['cache_size'] = null; + if (function_exists('exec')) + { + @exec('du -sk '.$path_cache, $return_array_cache); + if ( + is_array($return_array_cache) + and !empty($return_array_cache[0]) + and preg_match('/^(\d+)\s/', $return_array_cache[0], $matches_cache) + ) + { + $infos['cache_size'] = $matches_cache[1] * 1024; + } + } + include_once(PHPWG_ROOT_PATH.'admin/include/functions.php'); + // Multiples sizes size + $path_msizes = $conf['data_location'].'i'; + $msizes = get_cache_size_derivatives($path_msizes); - /* Multiples sizes */ + $infos['msizes'] = array_fill_keys(array_keys(ImageStdParams::get_defined_type_map()), 0); + $infos['msizes']['custom'] = 0; + $all = 0; - $custom = 1; - $huge = 2; - $extra_large = 3; - $large = 4; - $medium = 5; - $small = 6; - $extra_small = 7; - $tiny = 8; - $thumbnail = 9; - $squarre = 10; - $all = $squarre + $thumbnail + $tiny + $extra_small + $small + $medium + $large + $extra_large + $huge + $custom; + foreach(array_keys($infos['msizes']) as $size_type) + { + $infos['msizes'][$size_type] += @$msizes[derivative_to_url($size_type)]; + $all += $infos['msizes'][$size_type]; + } + $infos['msizes']['all'] = $all; - $infos['msizes'] = [$all, $squarre, $thumbnail, $tiny, $extra_small, $small, $medium, $large, $extra_large, $huge, $custom]; + // Compiled templates size + $path_template_c = $conf['data_location'].'templates_c'; + $infos['tsizes'] = null; + if (function_exists('exec')) + { + @exec('du -sk '.$path_template_c, $return_array_template_c); + if ( + is_array($return_array_template_c) + and !empty($return_array_template_c[0]) + and preg_match('/^(\d+)\s/', $return_array_template_c[0], $matches_template_c) + ) + { + $infos['tsizes'] = $matches_template_c[1] * 1024; + } + } - $infos['last_time_calc'] = "now"; + $infos['last_date_calc'] = date("Y-m-d H:i:s"); foreach ($infos as $name => $value) { @@ -231,10 +263,11 @@ function ws_getCacheSize($params, &$service) ); } + conf_update_param("cache_sizes", $output, true); + return array('infos' => new PwgNamedArray($output, 'item')); } - /** * API method * Adds images to the caddie diff --git a/language/en_UK/admin.lang.php b/language/en_UK/admin.lang.php index 39c176276..b7db13b0c 100644 --- a/language/en_UK/admin.lang.php +++ b/language/en_UK/admin.lang.php @@ -1227,4 +1227,6 @@ $lang['Plugin "%s" has been activated!'] = 'Plugin "%s" has been activated!'; $lang['Plugin "%s" deleted!'] = 'Plugin "%s" deleted!'; $lang['Activated'] = 'Activated'; $lang['Deactivated'] = 'Deactivated'; -$lang['Restored'] = 'Restored'; \ No newline at end of file +$lang['Restored'] = 'Restored'; +$lang['right now'] = 'right now'; +$lang['never calculated'] = 'never calculated'; \ No newline at end of file diff --git a/language/fr_FR/admin.lang.php b/language/fr_FR/admin.lang.php index 65494cf1b..81e7865bc 100644 --- a/language/fr_FR/admin.lang.php +++ b/language/fr_FR/admin.lang.php @@ -1171,7 +1171,7 @@ $lang['Apply to the whole hierarchy'] = 'Appliquer à toute l\'arborescence'; $lang['%d+ albums found, try to refine the search'] = '%d+ albums trouvé, essayez d\'affiner la recherche'; $lang['Select an album... or type it!'] = 'Sélectionnez un album... ou tapez-le !'; $lang['Cache size'] = "Taille du cache"; -$lang['calculated'] = "calculé il y a"; +$lang['calculated'] = "calculé"; $lang['months ago'] = "mois"; $lang['Delete these sizes'] = 'Supprimer les tailles'; $lang['Activity'] = 'Activité'; @@ -1229,4 +1229,6 @@ $lang['Plugin "%s" has been activated!'] = 'Le plugin "%s" a été activé !'; $lang['Plugin "%s" deleted!'] = 'Plugin "%s" supprimé !'; $lang['Activated'] = 'Activé'; $lang['Deactivated'] = 'Désactivé'; -$lang['Restored'] = 'Restoré'; \ No newline at end of file +$lang['Restored'] = 'Restoré'; +$lang['right now'] = 'à l\'instant'; +$lang['never calculated'] = 'jamais calculé'; \ No newline at end of file