Subversion Repositories cheapmusic

Rev

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 functions
class CronController extends Controller {
    
        var $cronList;                      // the array includes all tools avialable for cron
        var $repTools;                      // the array includes all tools avialable for report generation
        var $debug = true;                  // to show debug message or not
        var $layout = 'ajax';       // ajax layout or not
        var $timeStamp;             // timestamp for storing reports
        var $checkedKeywords = 0;   // the number of keywords checked in cron, this is used for split cron execution feature 
        var $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 generation 
        function 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 job
        function 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 manager
        function 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 command
        function showCronCommand(){
                
                $this->render('report/croncommand');
        }
        
        # common report generation function
        function 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 function
        function 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 empty
                if (!empty($userSelectList)) {
                        $userList = $userSelectList;
                } else {
                        $userList = $userCtrler->__getAllUsers(true, true, "utype_id DESC");
                }
                
                foreach($userList as $userInfo){
                        
                        // check whethere user id is existing
                        if (empty($userInfo['id'])) continue;
                        
                        // check whether user expired 
                        if (!$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 available
                        if ($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 day
                                        if ($this->checkedWebsites != $websiteCount) {
                                                                                        
                                                // to implement split cron execution feature
                                                if ( 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 enabled
                                if (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 empty
                if (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 methods
        function 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 admin
                if ($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 tool
                    if (!$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 cron
        function 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 cron
        function 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 cron
        function 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 data
                foreach ($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 cron
        function 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 data
                foreach ($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 cron
        function 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 cron
        function 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 checker
        function 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 keyword                    
                foreach ( $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 feature
                        if ( (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 cron
        function 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 list
                        foreach ($wmCtrler->sourceList as $source) {
                                
                                // check whether reports already existing 
                                if (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 cron
        function 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 existing 
                if (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 messages
        function debugMsg($msg='') {
                if($this->debug == true) print $msg;
        }
        
}
?>