Blame | Last modification | View Log | RSS feed
<?php/**************************************************************************** Copyright (C) 2009-2011 by Geo Varghese(www.seofreetools.net) ** sendtogeo@gmail.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the ** Free Software Foundation, Inc., ** 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ****************************************************************************/include_once(SP_CTRLPATH."/keyword.ctrl.php");include_once(SP_CTRLPATH."/moz.ctrl.php");# class defines all cron controller functionsclass CronController extends Controller {var $cronList; // the array includes all tools avialable for cronvar $repTools; // the array includes all tools avialable for report generationvar $debug = true; // to show debug message or notvar $layout = 'ajax'; // ajax layout or notvar $timeStamp; // timestamp for storing reportsvar $checkedKeywords = 0; // the number of keywords checked in cron, this is used for split cron execution featurevar $checkedWebsites = 0; // the number of websites checked in cron, this is used for split cron execution feature# function to load all tools required for report generationfunction loadReportGenerationTools($includeList=array()){$includeList = formatSQLParamList($includeList);$sql = "select * from seotools where status=1 and reportgen=1";if(count($includeList) > 0) $sql .= " and id in (".implode(',', $includeList).")";$this->repTools = $this->db->select($sql);}# function to load all tools required for cron jobfunction loadCronJobTools($includeList=array()){$sql = "select * from seotools where status=1 and cron=1";if(count($includeList) > 0) $sql .= " and id in (".implode(',', $includeList).")";$sql .= " order by id ASC";$this->cronList = $this->db->select($sql);}# function to show report generation managerfunction showReportGenerationManager(){$userId = isLoggedIn();$websiteController = New WebsiteController();$websiteList = $websiteController->__getAllWebsites($userId, true);$this->set('websiteList', $websiteList);$this->set('websiteNull', false);$this->loadReportGenerationTools();$this->set('repTools', $this->repTools);$this->render('report/reportgenerationmanager');}# function to show cron commandfunction showCronCommand(){$this->render('report/croncommand');}# common report generation functionfunction executeReportGenerationScript($info='') {if(count($info['repTools']) <= 0){showErrorMsg($this->spTextKeyword['pleaseselecttool']."!");}$websiteCtrler = New WebsiteController();if(!empty($info['website_id'])){$allWebsiteList[] = $websiteCtrler->__getWebsiteInfo($info['website_id']);}else{$userCtrler = New UserController();$userList = $userCtrler->__getAllUsers();$allWebsiteList = array();foreach($userList as $userInfo){$websiteList = $websiteCtrler->__getAllWebsites($userInfo['id']);foreach($websiteList as $websiteInfo){$allWebsiteList[] = $websiteInfo;}}}if(count($allWebsiteList) <= 0){showErrorMsg($_SESSION['text']['common']['nowebsites']."!");}$this->set('allWebsiteList', $allWebsiteList);$this->set('repTools', implode(':', $info['repTools']));$this->render('report/reportgenerator');}# common cron execute functionfunction executeCron($includeList=array(), $userSelectList=array()) {$this->loadCronJobTools($includeList);$lastGenerated = mktime(0, 0, 0, date('m'), date('d'), date('Y'));$userCtrler = New UserController();// if user list selected is not emptyif (!empty($userSelectList)) {$userList = $userSelectList;} else {$userList = $userCtrler->__getAllUsers(true, true, "utype_id DESC");}foreach($userList as $userInfo){// check whethere user id is existingif (empty($userInfo['id'])) continue;// check whether user expiredif (!$userCtrler->isUserExpired($userInfo['id'])) {continue;}// create report controller$reportCtrler = New ReportController();// check for user report schedule$repSetInfo = $reportCtrler->isGenerateReportsForUser($userInfo['id']);if (!empty($repSetInfo['generate_report'])) {$websiteCtrler = New WebsiteController();$sql = "select * from websites where status=1 and user_id=" . $userInfo['id'] . " and crawled=0 order by name";$websiteList = $websiteCtrler->db->select($sql);$websiteCount = count($websiteList);// if websites are availableif ($websiteCount > 0) {foreach($websiteList as $websiteInfo){$this->websiteInfo = $websiteInfo;$this->routeCronJob($websiteInfo['id'], '', true);$this->checkedWebsites++;// change website crawl status$sql = "update websites set crawled=1 where id=" . $websiteInfo['id'];$websiteList = $websiteCtrler->db->query($sql);// if all websites checked, mark as report generated for the dayif ($this->checkedWebsites != $websiteCount) {// to implement split cron execution featureif ( SP_NUMBER_WEBSITES_CRON > 0) {if ($this->checkedWebsites == SP_NUMBER_WEBSITES_CRON) {die("Reached total number of allowed websites(" . SP_NUMBER_WEBSITES_CRON. ") in each cron job");}}}}// save report generated time$reportCtrler->updateUserReportSetting($userInfo['id'], 'last_generated', $lastGenerated);// update report generation logs$reportCtrler->updateUserReportGenerationLogs($userInfo['id'], date('Y-m-d H:i:s'));// update user alerts section$alertCtrl = new AlertController();$reportTxt = $this->getLanguageTexts('reports', $_SESSION['lang_code']);$alertInfo = array('alert_subject' => $reportTxt["Reports Generated Successfully"],'alert_message' => $reportTxt['report_email_subject'],'alert_category' => "reports",'alert_url' => SP_WEBPATH,);$alertCtrl->createAlert($alertInfo, $userInfo['id']);// send email notification if enabledif (SP_REPORT_EMAIL_NOTIFICATION && $repSetInfo['email_notification']) {$reportCtrler->spTextTools = $this->getLanguageTexts('seotools', $_SESSION['lang_code']);$reportCtrler->set('spTextTools', $reportCtrler->spTextTools);$reportCtrler->sentEmailNotificationForReportGen($userInfo, $repSetInfo['last_generated'], $lastGenerated);}}}}// if user selected list emptyif (empty($userSelectList)) {// reset all keywords crawl status$keywordCtrler = New KeywordController();$keywordCtrler->__changeCrawledStatus(0);$this->debugMsg("Reset all keywords crawl status\n");// change all website crawl status$sql = "update websites set crawled=0";$keywordCtrler->db->query($sql);$this->debugMsg("Change all websites crawl status\n");}}# function to route the cronjobs to different methodsfunction routeCronJob($websiteId, $repTools='', $cron=false){$websiteId = intval($websiteId);if(empty($this->websiteInfo)){$websiteCtrler = New WebsiteController();$this->websiteInfo = $websiteCtrler->__getWebsiteInfo($websiteId);}if($cron){if(empty($this->cronList)){$this->loadCronJobTools();}$seoTools = $this->cronList;}else{$this->loadReportGenerationTools(explode(':', $repTools));$seoTools = $this->repTools;}// check whethre user access to seo tools and plugins$userCtrler = New UserController();$userInfo = $userCtrler->__getUserInfo($this->websiteInfo['user_id']);$userTypeCtrler = new UserTypeController();// check whethere user is adminif ($userInfo['utype_id'] == $userTypeCtrler->getAdminUserTypeId()) {$isAdmin = true;} else {$isAdmin = false;$toolAccessList = $userTypeCtrler->getSeoToolAccessSettings($userInfo['utype_id']);}foreach ($seoTools as $cronInfo) {// check whether user have acccess to the toolif (!$isAdmin && empty($toolAccessList[$cronInfo['id']]['value']) ) continue;switch($cronInfo['url_section']){case "webmaster-tools":$this->webmasterToolsCron($websiteId);break;case "keyword-position-checker":$this->keywordPositionCheckerCron($websiteId);break;case "rank-checker":$this->rankCheckerCron($websiteId);break;case "backlink-checker":$this->backlinkCheckerCron($websiteId);break;case "saturation-checker":$this->saturationCheckerCron($websiteId);break;case "pagespeed":$this->pageSpeedCheckerCron($websiteId);break;case "sm-checker":$this->socialMediaCheckerCron($websiteId);break;case "review-manager":$this->reviewCheckerCron($websiteId);break;case "web-analytics":$this->analyticsCron($websiteId);break;}}}# func to generate search engine saturation reports from cronfunction saturationCheckerCron($websiteId){include_once(SP_CTRLPATH."/saturationchecker.ctrl.php");$this->debugMsg("Starting Search engine saturation Checker cron for website: {$this->websiteInfo['name']}....<br>\n");$saturationCtrler = New SaturationCheckerController();$websiteInfo = $this->websiteInfo;if (SP_MULTIPLE_CRON_EXEC && $saturationCtrler->isReportsExists($websiteInfo['id'], $this->timeStamp)) return;$saturationCtrler->url = $websiteUrl = addHttpToUrl($websiteInfo['url']);foreach ($saturationCtrler->colList as $col => $dbCol) {$websiteInfo[$col] = $saturationCtrler->__getSaturationRank($col);}$saturationCtrler->saveRankResults($websiteInfo, true);echo "Saved Search Engine Saturation results of <b>$websiteUrl</b>.....</br>\n";}# func to generate pagespeed reports from cronfunction pageSpeedCheckerCron($websiteId){include_once(SP_CTRLPATH."/pagespeed.ctrl.php");$this->debugMsg("Starting page speed Checker cron for website: {$this->websiteInfo['name']}....<br>\n");$pageSpeedCtrler = New PageSpeedController();$websiteInfo = $this->websiteInfo;if (SP_MULTIPLE_CRON_EXEC && $pageSpeedCtrler->isReportsExists($websiteInfo['id'], $this->timeStamp)) return;$userCtrler = new UserController();$userInfo = $userCtrler->__getUserInfo($websiteInfo['user_id']);$langCode = $userInfo['lang_code'];$websiteUrl = addHttpToUrl($websiteInfo['url']);$params = array('screenshot' => false, 'strategy' => 'desktop', 'locale' => $langCode);$websiteInfo['desktop'] = $pageSpeedCtrler->__getPageSpeedInfo($websiteUrl, $params);$params = array('screenshot' => false, 'strategy' => 'mobile', 'locale' => $langCode);$websiteInfo['mobile'] = $pageSpeedCtrler->__getPageSpeedInfo($websiteUrl, $params);$pageSpeedCtrler->savePageSpeedResults($websiteInfo, true);echo "Saved page speed results of <b>$websiteUrl</b>.....</br>\n";}# func to generate social media checker reports from cronfunction socialMediaCheckerCron($websiteId){include_once(SP_CTRLPATH."/social_media.ctrl.php");$this->debugMsg("Starting social media Checker cron for website: {$this->websiteInfo['name']}....<br>\n");$socialMediaCtrler = New SocialMediaController();$websiteInfo = $this->websiteInfo;$linkList = $socialMediaCtrler->getAllLinksWithOutReports($websiteInfo['id'], date('Y-m-d', $this->timeStamp));if (SP_MULTIPLE_CRON_EXEC && empty($linkList)) {$this->debugMsg("No social media links left to generate report for website: {$this->websiteInfo['name']}....<br>\n");return true;}// loop through link list and save the dataforeach ($linkList as $linkInfo) {$result = $socialMediaCtrler->getSocialMediaDetails($linkInfo['type'], $linkInfo['url']);if ($result['status']) {echo "Crawled social media results of <b>{$linkInfo['name']}</b>.....</br>\n";} else {echo "Failed Crawling of social media results of <b>{$linkInfo['name']}</b>.....</br>\n";echo $result['msg'];}// save the social media data$socialMediaCtrler->saveSocialMediaLinkResults($linkInfo['id'], $result);sleep(SP_CRAWL_DELAY + 5);}echo "Saved social media results of website id: <b>$websiteId</b>.....</br>\n";}# func to generate review checker reports from cronfunction reviewCheckerCron($websiteId) {include_once(SP_CTRLPATH."/review_manager.ctrl.php");$this->debugMsg("Starting review Checker cron for website: {$this->websiteInfo['name']}....<br>\n");$reviewController = New ReviewManagerController();$websiteInfo = $this->websiteInfo;$linkList = $reviewController->getAllLinksWithOutReports($websiteInfo['id'], date('Y-m-d', $this->timeStamp));if (SP_MULTIPLE_CRON_EXEC && empty($linkList)) {$this->debugMsg("No review links left to generate report for website: {$this->websiteInfo['name']}....<br>\n");return true;}// loop through link list and save the dataforeach ($linkList as $linkInfo) {$result = $reviewController->getReviewDetails($linkInfo['type'], $linkInfo['url']);if ($result['status']) {echo "Crawled review results of <b>{$linkInfo['name']}</b>.....</br>\n";} else {echo "Failed Crawling of review results of <b>{$linkInfo['name']}</b>.....</br>\n";echo $result['msg'];}// save the review data$reviewController->saveReviewLinkResults($linkInfo['id'], $result);sleep(SP_CRAWL_DELAY + 5);}echo "Saved review results of website id: <b>$websiteId</b>.....</br>\n";}# func to generate backlink reports from cronfunction backlinkCheckerCron($websiteId){include_once(SP_CTRLPATH."/backlink.ctrl.php");$this->debugMsg("Starting Backlink Checker cron for website: {$this->websiteInfo['name']}....<br>\n");$backlinkCtrler = New BacklinkController();$websiteInfo = $this->websiteInfo;if (SP_MULTIPLE_CRON_EXEC && $backlinkCtrler->isReportsExists($websiteInfo['id'], $this->timeStamp)) return;$backlinkCtrler->url = $websiteUrl = addHttpToUrl($websiteInfo['url']);foreach ($backlinkCtrler->colList as $col => $dbCol) {$websiteInfo[$col] = $backlinkCtrler->__getBacklinks($col);}$backlinkCtrler->saveRankResults($websiteInfo, true);echo "Saved backlink results of <b>$websiteUrl</b>.....</br>\n";}# func to generate rank reports from cronfunction rankCheckerCron($websiteId){include_once(SP_CTRLPATH."/rank.ctrl.php");$this->debugMsg("Starting Rank Checker cron for website: {$this->websiteInfo['name']}....<br>\n");$rankCtrler = New RankController();$websiteInfo = $this->websiteInfo;if (SP_MULTIPLE_CRON_EXEC && $rankCtrler->isReportsExists($websiteInfo['id'], $this->timeStamp)) return;$websiteUrl = addHttpToUrl($websiteInfo['url']);/*$mozRankInfo = $rankCtrler->__getMozRank(array($websiteUrl));*/$mozCtrler = new MozController();$mozRankInfo = $mozCtrler->__getMozRankInfo(array($websiteUrl));$websiteInfo['moz_rank'] = $mozRankInfo[0]['moz_rank'];$websiteInfo['page_authority'] = $mozRankInfo[0]['page_authority'];$websiteInfo['domain_authority'] = $mozRankInfo[0]['domain_authority'];$websiteInfo['alexaRank'] = $rankCtrler->__getAlexaRank($websiteUrl);$rankCtrler->saveRankResults($websiteInfo, true);$this->debugMsg("Saved rank results of <b>$websiteUrl</b>.....<br>\n");}# func to find the keyword position checkerfunction keywordPositionCheckerCron($websiteId){include_once(SP_CTRLPATH."/searchengine.ctrl.php");include_once(SP_CTRLPATH."/report.ctrl.php");$reportController = New ReportController();$keywordCtrler = New KeywordController();$seController = New SearchEngineController();$reportController->seList = $seController->__getAllCrawlFormatedSearchEngines();// get keywords not to be checked$time = mktime(0, 0, 0, date('m'), date('d'), date('Y'));$sql = "select distinct(keyword_id) from keywordcrontracker kc, keywords k where k.id=kc.keyword_id and k.website_id=$websiteId and time=$time";$keyList = $this->db->select($sql);$excludeKeyList = array(0);foreach ($keyList as $info) {$excludeKeyList[] = $info['keyword_id'];}// get keywords needs to be checked$sql = "select k.*,w.url from keywords k,websites w where k.website_id=w.id and w.id=$websiteId and k.status=1 and k.crawled=0";$sql .= " and k.id not in(".implode(",", $excludeKeyList).") order by k.name";$keywordList = $reportController->db->select($sql);$this->debugMsg("Starting keyword position checker cron for website: {$this->websiteInfo['name']}....<br>\n");// loop through each keywordforeach ( $keywordList as $keywordInfo ) {$reportController->seFound = 0;$crawlResult = $reportController->crawlKeyword($keywordInfo, '', true);foreach($crawlResult as $sengineId => $matchList){if($matchList['status']){foreach($matchList['matched'] as $i => $matchInfo){$remove = ($i == 0) ? true : false;$matchInfo['se_id'] = $sengineId;$matchInfo['keyword_id'] = $keywordInfo['id'];$repCtrler = New ReportController();$repCtrler->saveMatchedKeywordInfo($matchInfo, $remove);}$this->debugMsg("Successfully crawled keyword <b>{$keywordInfo['name']}</b> results from ".$reportController->seList[$sengineId]['domain'].".....<br>\n");}else{$this->debugMsg("Crawling keyword <b>{$keywordInfo['name']}</b> results from ".$reportController->seList[$sengineId]['domain']." failed......<br>\n");}}$keywordCtrler->__changeCrawledStatus(1, 'id=' . $keywordInfo['id']);// to implement split cron execution featureif ( (SP_NUMBER_KEYWORDS_CRON > 0) && !empty($crawlResult) ) {$this->checkedKeywords++;if ($this->checkedKeywords == SP_NUMBER_KEYWORDS_CRON) {die("Reached total number of allowed keywords(".SP_NUMBER_KEYWORDS_CRON.") in each cron job");}}if(empty($reportController->seFound)){$this->debugMsg("Keyword <b>{$keywordInfo['name']}</b> not assigned to required search engines........\n");}sleep(SP_CRAWL_DELAY);}}# func to generate webmaster tools reports from cronfunction webmasterToolsCron($websiteId){include_once(SP_CTRLPATH."/webmaster.ctrl.php");$this->debugMsg("Starting webmaster tools cron for website: {$this->websiteInfo['name']}....<br>\n");$wmCtrler = New WebMasterController();$websiteInfo = $this->websiteInfo;// check whether old reports are not generated. Then generate from it.for ($i=4; $i>=2; $i--) {// report date should be less than 2 days, then only reports will be generated$reportDate = date('Y-m-d', $this->timeStamp - ($i * 60 * 60 * 24));// loop through source listforeach ($wmCtrler->sourceList as $source) {// check whether reports already existingif (SP_MULTIPLE_CRON_EXEC && $wmCtrler->isReportsExists($websiteInfo['id'], $reportDate, $source)) {$this->debugMsg("Skip webmaster tools report($reportDate) generation of <b>{$this->websiteInfo['name']}</b>.....<br>\n");continue;}// store results$wmCtrler->storeWebsiteAnalytics($websiteInfo['id'], $reportDate, $source);}$this->debugMsg("Saved webmaster tools report($reportDate) of <b>{$this->websiteInfo['name']}</b>.....<br>\n");}// update webmaster tools sitemaps$websiteController = New WebsiteController();$websiteController->importWebmasterToolsSitemaps($websiteId, true);$this->debugMsg("Saved webmaster tools sitemaps of <b>{$this->websiteInfo['name']}</b>.....<br>\n");}// func to generate analytics reports from cronfunction analyticsCron($websiteId){include_once(SP_CTRLPATH."/analytics.ctrl.php");$this->debugMsg("Starting analytics cron for website: {$this->websiteInfo['name']}....<br>\n");$wmCtrler = New AnalyticsController();$websiteInfo = $this->websiteInfo;$reportDate = date('Y-m-d', $this->timeStamp - (60 * 60 * 24));// check whether reports already existingif (SP_MULTIPLE_CRON_EXEC && $wmCtrler->isReportsExists($websiteInfo['id'], $reportDate)) {$this->debugMsg("Analytics results already generated of <b>{$this->websiteInfo['name']}</b>.....<br>\n");return FALSE;}// store results$wmCtrler->storeWebsiteAnalytics($websiteInfo['id'], $reportDate);$this->debugMsg("Saved analytics results of <b>{$this->websiteInfo['name']}</b>.....<br>\n");}// func to show debug messagesfunction debugMsg($msg='') {if($this->debug == true) print $msg;}}?>