BxDolCronCmd.php 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  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_mem_levels = (int) getParam("db_clean_mem_levels");
  29. //clear from `sys_acl_levels_members`
  30. if (db_res("DELETE FROM `sys_acl_levels_members` WHERE `DateExpires` < NOW() - INTERVAL $db_clean_mem_levels DAY"))
  31. db_res("OPTIMIZE TABLE `sys_acl_levels_members`");
  32. // clear from `sys_messages`
  33. if (db_res("DELETE FROM `sys_messages` WHERE FIND_IN_SET('sender', `Trash`) AND FIND_IN_SET('recipient', `Trash`)"))
  34. db_res("OPTIMIZE TABLE `sys_messages`");
  35. // clear ban table
  36. if (db_res("DELETE FROM `sys_admin_ban_list` WHERE `DateTime` + INTERVAL `Time` SECOND < NOW()"))
  37. db_res("OPTIMIZE TABLE `sys_admin_ban_list`");
  38. //--- Clean sessions ---//
  39. bx_import('BxDolSession');
  40. $oSession = BxDolSession::getInstance();
  41. $iSessions = $oSession->oDb->deleteExpired();
  42. // clean expired ip bans
  43. bx_import('BxDolAdminIpBlockList');
  44. $oBxDolAdminIpBlockList = new BxDolAdminIpBlockList();
  45. $iIps = $oBxDolAdminIpBlockList->deleteExpired();
  46. // clean old views
  47. bx_import('BxDolViews');
  48. $oBxViews = new BxDolViews('', 0);
  49. $iDeletedViews = $oBxViews->maintenance ();
  50. // clean old votes
  51. bx_import('BxDolVote');
  52. BxDolVote::maintenance();
  53. // clean comments ratings
  54. bx_import('BxDolCmts');
  55. BxDolCmts::maintenance();
  56. // clean storage engine expired private file tokens
  57. bx_import('BxDolStorage');
  58. $iDeletedExpiredTokens = BxDolStorage::pruning();
  59. // clean outdated transcoded images
  60. bx_import('BxDolImageTranscoder');
  61. $iDeletedTranscodedImages = BxDolImageTranscoder::pruning();
  62. // clean expired keys
  63. bx_import('BxDolKey');
  64. $oKey = BxDolKey::getInstance();
  65. $iDeletedKeys = $oKey ? $oKey->prune() : 0;
  66. echo "\n- Database cleaning -\n";
  67. echo "Deleted profiles: $db_clean_profiles_num\n";
  68. echo "Deleted virtual kisses: $db_clean_vkiss_num\n";
  69. echo "Deleted messages: $db_clean_msg_num\n";
  70. echo "Deleted sessions: $iSessions\n";
  71. echo "Deleted records from ip block list: $iIps\n";
  72. echo "Deleted views: $iDeletedViews\n";
  73. echo "Deleted votes: $iDeletedVotes\n";
  74. echo "Deleted comment votes: $iDeletedCommentVotes\n";
  75. echo "Storage expired tokens: $iDeletedExpiredTokens\n";
  76. echo "Deleted outdated transcoded images: $iDeletedTranscodedImages\n";
  77. echo "Deleted expired keys: $iDeletedKeys\n";
  78. }
  79. function del_old_all_files() {
  80. $num_tmp = 0;
  81. $num_del = 0;
  82. $file_life = 86400; // one day
  83. $dirToClean = array();
  84. $dirToClean[] = BxDolConfig::getInstance()->get('path_dynamic', 'tmp');
  85. $dirToClean[] = BX_DIRECTORY_PATH_CACHE;
  86. foreach( $dirToClean as $value )
  87. {
  88. if ( !( $lang_dir = opendir( $value ) ) )
  89. {
  90. continue;
  91. }
  92. else
  93. {
  94. while ($lang_file = readdir( $lang_dir ))
  95. {
  96. $diff = time() - filectime( $value . $lang_file);
  97. if ( $diff > $file_life && '.' != $lang_file && '..' != $lang_file && '.htaccess' !== $lang_file )
  98. {
  99. @unlink ($value . $lang_file);
  100. ++$num_del;
  101. }
  102. ++$num_tmp;
  103. }
  104. closedir( $lang_dir );
  105. }
  106. }
  107. echo "\n- Temporary files check -\n";
  108. echo "Total temp files: $num_tmp\n";
  109. echo "Deleted temp files: $num_del\n";
  110. }
  111. function processing() {
  112. global $MODE;
  113. // - Defaults -
  114. $MODE = "_MAIL_";
  115. //$MODE = "_LIVE_";
  116. $DAY = "_OBEY_";
  117. //$DAY = "_FORCE_";
  118. define('NON_VISUAL_PROCESSING', 'YES');
  119. // - Always finish
  120. set_time_limit( 36000 );
  121. ignore_user_abort();
  122. // - Parameters check -
  123. for ( $i = 0; strlen( $argv[$i] ); $i++ )
  124. {
  125. switch( $argv[$i] )
  126. {
  127. case "--live": $MODE = "_LIVE_"; break;
  128. case "--mail": $MODE = "_MAIL_"; break;
  129. case "--force-day": $DAY = "_FORCE_"; break;
  130. case "--obey-day": $DAY = "_OBEY_"; break;
  131. }
  132. }
  133. if ( $MODE != "_LIVE_" )
  134. ob_start();
  135. $day = date( "d" );
  136. if ( getParam( "cmdDay" ) == $day && $DAY == "_OBEY_" )
  137. {
  138. echo "Already done today, bailing out\n";
  139. $this->finish();
  140. return;
  141. }
  142. setParam( "cmdDay", $day );
  143. //========================================================================================================================
  144. // - Membership check -
  145. echo "\n- Membership expiration letters -\n";
  146. $iExpireNotificationDays = (int)getParam("expire_notification_days");
  147. $bExpireNotifyOnce = getParam("expire_notify_once") == 'on';
  148. $iExpireLetters = 0;
  149. bx_import('BxDolDb');
  150. $oDb = BxDolAcl::getInstance();
  151. bx_import('BxDolAcl');
  152. $oAcl = BxDolAcl::getInstance();
  153. $aRow = $oDb->getFirstRow( "SELECT `ID` FROM `Profiles`");
  154. while(!empty($aRow)) {
  155. $aCurrentMem = getMemberMembershipInfo( $aRow['ID'] );
  156. // If expire_notification_days is -1 then notify after expiration
  157. if ( $aCurrentMem['ID'] == MEMBERSHIP_ID_STANDARD && $iExpireNotificationDays == -1 ) {
  158. // Calculate last UNIX Timestamp
  159. $iLastTimestamp = time() - 24 * 3600;
  160. $aLastMem = getMemberMembershipInfo( $aRow['ID'], $iLastTimestamp );
  161. if($aCurrentMem['ID'] != $aLastMem['ID']) {
  162. $bMailResult = $oAcl->getExpirationLetter($aRow['ID'], $aLastMem['Name'], -1);
  163. if($bMailResult)
  164. $iExpireLetters++;
  165. }
  166. }
  167. // If memberhip is not standard then check if it will change
  168. else if($aCurrentMem['ID'] != MEMBERSHIP_ID_STANDARD) {
  169. // Calculate further UNIX Timestamp
  170. $iFurtherTimestamp = time() + $iExpireNotificationDays * 24 * 3600;
  171. $aFurtherMem = getMemberMembershipInfo( $aRow['ID'], $iFurtherTimestamp );
  172. if($aCurrentMem['ID'] != $aFurtherMem['ID'] && $aFurtherMem['ID'] == MEMBERSHIP_ID_STANDARD) {
  173. if(!$bExpireNotifyOnce || abs($iFurtherTimestamp - $aCurrentMem['DateExpires']) < 24 * 3600) {
  174. $bMailResult = $oAcl->getExpirationLetter( $aRow['ID'], $aCurrentMem['Name'], (int)(($aCurrentMem['DateExpires'] - time())/(24 * 3600)));
  175. if($bMailResult)
  176. $iExpireLetters++;
  177. }
  178. }
  179. }
  180. $aRow = $oDb->getNextRow();
  181. }
  182. echo "Send membership expire letters: $iExpireLetters letters\n";
  183. //========================================================================================================================
  184. // clear tmp folder --------------------------------------------------------------------------
  185. $this->del_old_all_files();
  186. // ----------------------------------------------------------------------------------
  187. $this->clean_database();
  188. $this->finish();
  189. }
  190. }