BxDolCronCmd.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. <?php
  2. /**
  3. * @package Dolphin Core
  4. * @copyright Copyright (c) BoonEx Pty Limited - http://www.boonex.com/
  5. * @license CC-BY - http://creativecommons.org/licenses/by/3.0/
  6. */
  7. defined('BX_DOL') or die('hack attempt');
  8. // TODO: make alert for database pruning
  9. // TODO: move some functionality to modules, like banners, etc
  10. // TODO: remove command line options
  11. // TODO: db funtions 2 class function + prepare statements
  12. // TODO: other refactoring
  13. bx_import('BxDolCron.php');
  14. class BxDolCronCmd extends BxDolCron {
  15. // - Functions -
  16. function finish() {
  17. global $MODE;
  18. if ( $MODE != "_LIVE_" ) {
  19. $output = ob_get_contents();
  20. ob_end_clean();
  21. if ( $MODE == "_MAIL_" && $output) {
  22. sendMail(getParam('site_email'), getParam('site_title') . ": Periodic Report", $output, 0, array(), BX_EMAIL_NOTIFY, 'text'); // TODO: email template
  23. }
  24. }
  25. }
  26. function clean_database()
  27. {
  28. $db_clean_vkiss = (int) getParam("db_clean_vkiss");
  29. $db_clean_profiles = (int) getParam("db_clean_profiles");
  30. $db_clean_msg = (int) getParam("db_clean_msg");
  31. $db_clean_visits = (int) getParam("db_clean_members_visits");
  32. $db_clean_banners_info = (int) getParam("db_clean_banners_info");
  33. $db_clean_mem_levels = (int) getParam("db_clean_mem_levels");
  34. //clear from `sys_acl_levels_members`
  35. if (db_res("DELETE FROM `sys_acl_levels_members` WHERE `DateExpires` < NOW() - INTERVAL $db_clean_mem_levels DAY"))
  36. db_res("OPTIMIZE TABLE `sys_acl_levels_members`");
  37. //clear from `sys_banners_shows`
  38. if (db_res("DELETE FROM `sys_banners_shows` WHERE `Date` < UNIX_TIMESTAMP( NOW() - INTERVAL $db_clean_banners_info DAY )"))
  39. db_res("OPTIMIZE TABLE `sys_banners_shows`");
  40. //clear from `sys_banners_clicks`
  41. if (db_res("DELETE FROM `sys_banners_clicks` WHERE `Date` < UNIX_TIMESTAMP( NOW() - INTERVAL $db_clean_banners_info DAY )"))
  42. db_res("OPTIMIZE TABLE `sys_banners_clicks`");
  43. // clear from `sys_messages`
  44. if (db_res("DELETE FROM `sys_messages` WHERE FIND_IN_SET('sender', `Trash`) AND FIND_IN_SET('recipient', `Trash`)"))
  45. db_res("OPTIMIZE TABLE `sys_messages`");
  46. //clear from `sys_ip_members_visits`
  47. if (db_res("DELETE FROM `sys_ip_members_visits` WHERE `DateTime` < NOW() - INTERVAL $db_clean_visits DAY"))
  48. db_res("OPTIMIZE TABLE `sys_ip_members_visits`");
  49. // clear ban table
  50. if (db_res("DELETE FROM `sys_admin_ban_list` WHERE `DateTime` + INTERVAL `Time` SECOND < NOW()"))
  51. db_res("OPTIMIZE TABLE `sys_admin_ban_list`");
  52. // profile_delete
  53. if ( $db_clean_profiles > 0)
  54. {
  55. $res = db_res("SELECT `ID` FROM `Profiles` WHERE (`DateLastNav` < NOW() - INTERVAL $db_clean_profiles DAY) AND (`Couple` > `ID` OR `Couple` = 0)");
  56. if ( $res )
  57. {
  58. $db_clean_profiles_num = mysql_num_rows($res);
  59. while ( $arr = mysql_fetch_array($res) )
  60. {
  61. profile_delete($arr['ID']);
  62. }
  63. db_res("OPTIMIZE TABLE `Profiles`");
  64. }
  65. }
  66. if ( $db_clean_vkiss > 0 )
  67. {
  68. $res = db_res("DELETE FROM `sys_greetings` WHERE `When` < NOW() - INTERVAL $db_clean_vkiss DAY");
  69. if ( $res ) {
  70. $db_clean_vkiss_num = db_affected_rows();
  71. db_res("OPTIMIZE TABLE `sys_greetings`");
  72. }
  73. }
  74. if ( $db_clean_msg > 0 )
  75. {
  76. $res = db_res("DELETE FROM `sys_messages` WHERE `Date` < NOW() - INTERVAL $db_clean_msg DAY");
  77. if ( $res ) {
  78. $db_clean_msg_num = db_affected_rows();
  79. db_res("OPTIMIZE TABLE `sys_messages`");
  80. }
  81. }
  82. //--- Clean sessions ---//
  83. bx_import('BxDolSession');
  84. $oSession = BxDolSession::getInstance();
  85. $iSessions = $oSession->oDb->deleteExpired();
  86. // clean expired ip bans
  87. bx_import('BxDolAdminIpBlockList');
  88. $oBxDolAdminIpBlockList = new BxDolAdminIpBlockList();
  89. $iIps = $oBxDolAdminIpBlockList->deleteExpired();
  90. // clean old views
  91. bx_import('BxDolViews');
  92. $oBxViews = new BxDolViews('', 0);
  93. $iDeletedViews = $oBxViews->maintenance ();
  94. // clean old votes
  95. bx_import('BxDolVote');
  96. BxDolVote::maintenance();
  97. // clean comments ratings
  98. bx_import('BxDolCmts');
  99. BxDolCmts::maintenance();
  100. // clean storage engine expired private file tokens
  101. bx_import('BxDolStorage');
  102. $iDeletedExpiredTokens = BxDolStorage::pruning();
  103. // clean outdated transcoded images
  104. bx_import('BxDolImageTranscoder');
  105. $iDeletedTranscodedImages = BxDolImageTranscoder::pruning();
  106. // clean expired keys
  107. bx_import('BxDolKey');
  108. $oKey = BxDolKey::getInstance();
  109. $iDeletedKeys = $oKey ? $oKey->prune() : 0;
  110. echo "\n- Database cleaning -\n";
  111. echo "Deleted profiles: $db_clean_profiles_num\n";
  112. echo "Deleted virtual kisses: $db_clean_vkiss_num\n";
  113. echo "Deleted messages: $db_clean_msg_num\n";
  114. echo "Deleted sessions: $iSessions\n";
  115. echo "Deleted records from ip block list: $iIps\n";
  116. echo "Deleted views: $iDeletedViews\n";
  117. echo "Deleted votes: $iDeletedVotes\n";
  118. echo "Deleted comment votes: $iDeletedCommentVotes\n";
  119. echo "Storage expired tokens: $iDeletedExpiredTokens\n";
  120. echo "Deleted outdated transcoded images: $iDeletedTranscodedImages\n";
  121. echo "Deleted expired keys: $iDeletedKeys\n";
  122. }
  123. function del_old_all_files() {
  124. $num_tmp = 0;
  125. $num_del = 0;
  126. $file_life = 86400; // one day
  127. $dirToClean = array();
  128. $dirToClean[] = BxDolConfig::getInstance()->get('path_dynamic', 'tmp');
  129. $dirToClean[] = BX_DIRECTORY_PATH_CACHE;
  130. foreach( $dirToClean as $value )
  131. {
  132. if ( !( $lang_dir = opendir( $value ) ) )
  133. {
  134. continue;
  135. }
  136. else
  137. {
  138. while ($lang_file = readdir( $lang_dir ))
  139. {
  140. $diff = time() - filectime( $value . $lang_file);
  141. if ( $diff > $file_life && '.' != $lang_file && '..' != $lang_file && '.htaccess' !== $lang_file )
  142. {
  143. @unlink ($value . $lang_file);
  144. ++$num_del;
  145. }
  146. ++$num_tmp;
  147. }
  148. closedir( $lang_dir );
  149. }
  150. }
  151. echo "\n- Temporary files check -\n";
  152. echo "Total temp files: $num_tmp\n";
  153. echo "Deleted temp files: $num_del\n";
  154. }
  155. function processing() {
  156. global $MODE;
  157. // - Defaults -
  158. $MODE = "_MAIL_";
  159. //$MODE = "_LIVE_";
  160. $DAY = "_OBEY_";
  161. //$DAY = "_FORCE_";
  162. define('NON_VISUAL_PROCESSING', 'YES');
  163. // - Always finish
  164. set_time_limit( 36000 );
  165. ignore_user_abort();
  166. // - Parameters check -
  167. for ( $i = 0; strlen( $argv[$i] ); $i++ )
  168. {
  169. switch( $argv[$i] )
  170. {
  171. case "--live": $MODE = "_LIVE_"; break;
  172. case "--mail": $MODE = "_MAIL_"; break;
  173. case "--force-day": $DAY = "_FORCE_"; break;
  174. case "--obey-day": $DAY = "_OBEY_"; break;
  175. }
  176. }
  177. if ( $MODE != "_LIVE_" )
  178. ob_start();
  179. $day = date( "d" );
  180. if ( getParam( "cmdDay" ) == $day && $DAY == "_OBEY_" )
  181. {
  182. echo "Already done today, bailing out\n";
  183. $this->finish();
  184. return;
  185. }
  186. setParam( "cmdDay", $day );
  187. //========================================================================================================================
  188. // - Membership check -
  189. echo "\n- Membership expiration letters -\n";
  190. $iExpireNotificationDays = (int)getParam("expire_notification_days");
  191. $bExpireNotifyOnce = getParam("expire_notify_once") == 'on';
  192. $iExpireLetters = 0;
  193. bx_import('BxDolDb');
  194. $oDb = BxDolAcl::getInstance();
  195. bx_import('BxDolAcl');
  196. $oAcl = BxDolAcl::getInstance();
  197. $aRow = $oDb->getFirstRow( "SELECT `ID` FROM `Profiles`");
  198. while(!empty($aRow)) {
  199. $aCurrentMem = getMemberMembershipInfo( $aRow['ID'] );
  200. // If expire_notification_days is -1 then notify after expiration
  201. if ( $aCurrentMem['ID'] == MEMBERSHIP_ID_STANDARD && $iExpireNotificationDays == -1 ) {
  202. // Calculate last UNIX Timestamp
  203. $iLastTimestamp = time() - 24 * 3600;
  204. $aLastMem = getMemberMembershipInfo( $aRow['ID'], $iLastTimestamp );
  205. if($aCurrentMem['ID'] != $aLastMem['ID']) {
  206. $bMailResult = $oAcl->getExpirationLetter($aRow['ID'], $aLastMem['Name'], -1);
  207. if($bMailResult)
  208. $iExpireLetters++;
  209. }
  210. }
  211. // If memberhip is not standard then check if it will change
  212. else if($aCurrentMem['ID'] != MEMBERSHIP_ID_STANDARD) {
  213. // Calculate further UNIX Timestamp
  214. $iFurtherTimestamp = time() + $iExpireNotificationDays * 24 * 3600;
  215. $aFurtherMem = getMemberMembershipInfo( $aRow['ID'], $iFurtherTimestamp );
  216. if($aCurrentMem['ID'] != $aFurtherMem['ID'] && $aFurtherMem['ID'] == MEMBERSHIP_ID_STANDARD) {
  217. if(!$bExpireNotifyOnce || abs($iFurtherTimestamp - $aCurrentMem['DateExpires']) < 24 * 3600) {
  218. $bMailResult = $oAcl->getExpirationLetter( $aRow['ID'], $aCurrentMem['Name'], (int)(($aCurrentMem['DateExpires'] - time())/(24 * 3600)));
  219. if($bMailResult)
  220. $iExpireLetters++;
  221. }
  222. }
  223. }
  224. $aRow = $oDb->getNextRow();
  225. }
  226. echo "Send membership expire letters: $iExpireLetters letters\n";
  227. //========================================================================================================================
  228. // clear tmp folder --------------------------------------------------------------------------
  229. $this->del_old_all_files();
  230. // ----------------------------------------------------------------------------------
  231. $this->clean_database();
  232. $this->finish();
  233. }
  234. }