Go Back   vb.org Archive > vBulletin 3 Discussion > vB3 Programming Discussions
  #1  
Old 05-12-2009, 11:45 PM
OcR Envy's Avatar
OcR Envy OcR Envy is offline
 
Join Date: May 2008
Location: Boston
Posts: 248
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default Cron Job Broken

I've written a custom cron job to interact with a mod I am working on. However the cron job doesn't work every time. If I run it manually it works without any problem, however it doesn't seem to run automatically despite the scheduled task manager showing it ran.

Is there some kind of error in my coding that would cause this? I'm reluctant to post the code but will if needed.
Reply With Quote
  #2  
Old 05-13-2009, 04:06 AM
Lynne's Avatar
Lynne Lynne is offline
 
Join Date: Sep 2004
Location: California/Idaho
Posts: 41,180
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

I've written cron jobs before that only run manually because I didn't have the code correct. Find a similar one that vbulletin wrote and compare it to yours and see if there are things missing (I seem to recall I forgot to make something global in mine).
Reply With Quote
  #3  
Old 05-13-2009, 05:53 AM
Dismounted's Avatar
Dismounted Dismounted is offline
 
Join Date: Jun 2005
Location: Melbourne, Australia
Posts: 15,047
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Some variables do not exist when scheduled tasks are not run from the Admin CP. Also, keep in mind that the task has a possibility of running as a guest.
Reply With Quote
  #4  
Old 05-13-2009, 09:20 AM
OcR Envy's Avatar
OcR Envy OcR Envy is offline
 
Join Date: May 2008
Location: Boston
Posts: 248
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Thank you for both of your responses. I've PMed you the code if you have the chance to review it that would be swell.

Lynne, I've globalized only $vbulletin and a few vars I want to hold the string outside of functions. I'm unsure what else would need to be done.

Dismounted, How would this make a difference? I'm stating that the task works when run manually by clicking on "Run Now" not from outside the Admin CP. I don't think you can even run it stand alone as it calls the db defined by vbulletin. There isn't any code in it that would matter as for member vs guest.

--------------- Added [DATE]1242226401[/DATE] at [TIME]1242226401[/TIME] ---------------

After getting a response from Lynne I've decided to post the code. Anyone who see's an issue please help!

For reference I am not currently giving permission to reuse the code.

PHP Code:
<?php
/*======================================================================*\
|| #################################################################### ||
|| # Who's on XBL By OcR Envy v 2.8                                    ||
|| #################################################################### ||
\*======================================================================*/

// ---------------------------------------------------
// Start Set PHP Environment
// ---------------------------------------------------

error_reporting(E_ALL & ~E_NOTICE);
if (!
is_object($vbulletin->db))
{
    echo 
"No vBulletin Found!";
    exit;
}

// ---------------------------------------------------
// Start Cronjob
// ---------------------------------------------------

global $vbulletin;
global 
$db;

@
set_time_limit(0);
@
ignore_user_abort(true);

$updatetime=time(); 
putenv("TZ=US/Eastern");
$checktime=date("h:i A"time());
$checkdate=date("m/d/y"time());

function 
DownloadUrl($Url){
 
    
$ch curl_init();
        
curl_setopt($chCURLOPT_URL$Url);
        
curl_setopt($chCURLOPT_RETURNTRANSFERtrue); 
        
curl_setopt($chCURLOPT_TIMEOUT5); 
        
curl_setopt($chCURLOPT_USERAGENT'vBulletin via cURL/PHP');
        
curl_setopt($chCURLOPT_FOLLOWLOCATIONtrue);
        
curl_setopt($chCURLOPT_ENCODING'gzip');
        
$output curl_exec($ch);
    
curl_close($ch);

    
$online strstr($output'Server');

    if(
$online) { 
        
$online "false";
    } else {
        if(
$output == "") {
            
$online "false";
        } else {                
            global 
$xml;
            
$xml simplexml_load_string($output);
            
$account=$xml->AccountStatus;
            if(
$account == "Gold") {
                
$online "true";
            } else {
                
$online "false";
            }
        }
    }
    return 
$online;
}

$duncanonline Downloadurl('http://xboxapi.duncanmackenzie.net/gamertag.ashx?GamerTag=outcast%20reborn');
$vbulletin->db->query("UPDATE xblusers SET time='$checktime', date='$checkdate' WHERE title='checked'");

if(
$duncanonline=="true") {
    
$updater="true";
} else {

    
$grabchecked $vbulletin->db->query("SELECT time, date FROM xblusers WHERE title='crashed'");
    
$gchecked=$vbulletin->db->fetch_array($grabchecked);
    
$checkedt=$gchecked['time'];
    
    
    if(
$checkedt=="00:00PM") {
        
$vbulletin->db->query("UPDATE xblusers SET time='$checktime', date='$checkdate' WHERE title='crashed'");
    }
    die;
}


$gamertaggrab=$vbulletin->db->query("SELECT userfield.field5, userfield.field11, userfield.userid FROM userfield INNER JOIN user ON user.userid = userfield.userid AND userfield.field5 > '' WHERE usergroupid IN (6,48,52,50,51,26,58,60,55,46,25)");
while(
$userrow $vbulletin->db->fetch_array($gamertaggrab)) {    
    
$gamertag=$userrow['field5'];
        
    if (
$gamertag) {
        
$duncanonline Downloadurl('http://xboxapi.duncanmackenzie.net/gamertag.ashx?GamerTag='urlencode($gamertag));

        if(
$duncanonline=="true") {
            
$coretag=$xml->Gamertag;                
            
$tagvalid=$xml->PresenceInfo->Valid;        
            
$onlinestatus=$xml->PresenceInfo->Online;        
            
$statustext=$xml->PresenceInfo->StatusText;        
            
$title=$xml->PresenceInfo->Title;        
            
$info=$xml->PresenceInfo->Info;        
            
$info2=$xml->PresenceInfo->Info2;        
            
$lastseen=$xml->PresenceInfo->LastSeen;                
                    
            
$statustext=addslashes($statustext);        
            
$title=addslashes($title);        
            
$info=addslashes($info);        
            
$info2=addslashes($info2);
            
            if (
$onlinestatus=="true") {            
                
$online=1;        
            } else {            
                
$online=0;            
            }                    
                        
            foreach (
$xml->xpath('//Game') as $gameset) {  
                
$gamename=$gameset->Name;            
                
$gametile=$gameset->Image32url;                        
                
$gamename=addslashes($gamename);

                
$vbulletin->db->query("INSERT IGNORE INTO xblgames (name,tile) VALUES ('".$gamename."','".$gametile."')");                                        
            }
    
            if (
$tagvalid=="true")    {
                
$logmsg $logmsg $userrow['userid'] . ": " $gamertag "-" $statustext "<br />";
                
$vbulletin->db->query("INSERT INTO xblstatus (userid,gamertag,online,statustext,title,info,info2,lastseen,updatetime)             
                VALUES ('"
.$userrow['userid']."','$coretag','$online','$statustext','$title','$info','$info2','$lastseen',FROM_UNIXTIME($updatetime)) ON DUPLICATE KEY             
                UPDATE userid='"
.$userrow['userid']."',gamertag='$coretag',online='$online',statustext='$statustext',title='$title',info='$info',info2='$info2',
                lastseen='
$lastseen',updatetime=FROM_UNIXTIME($updatetime)");                                    
                    
                
$vbulletin->db->query("UPDATE userfield SET field12='$statustext',field13='$title',field14='$info2' WHERE userid=".$userrow['userid']);
            }

        }
    }

    
$gamertag=$userrow['field11'];    
        
    if (
$gamertag) {
        
$duncanonline Downloadurl('http://xboxapi.duncanmackenzie.net/gamertag.ashx?GamerTag='urlencode($gamertag));

        if(
$duncanonline=="true") {
            
$coretag=$xml->Gamertag;                
            
$tagvalid=$xml->PresenceInfo->Valid;        
            
$onlinestatus=$xml->PresenceInfo->Online;        
            
$statustext=$xml->PresenceInfo->StatusText;        
            
$title=$xml->PresenceInfo->Title;        
            
$info=$xml->PresenceInfo->Info;        
            
$info2=$xml->PresenceInfo->Info2;        
            
$lastseen=$xml->PresenceInfo->LastSeen;    
                
            
$statustext=addslashes($statustext);        
            
$title=addslashes($title);        
            
$info=addslashes($info);        
            
$info2=addslashes($info2);                            
                    
            if (
$onlinestatus=="true") {            
                
$online=1;        
            } else {            
                
$online=0;            
            }                
                        
            if (
$tagvalid=="true")    {
                
$logmsg $logmsg $userrow['userid'] . ": " $gamertag "-" $statustext "<br />";
                
$vbulletin->db->query("INSERT INTO sxblstatus (userid,gamertag,online,statustext,title,info,info2,lastseen,updatetime)             
                VALUES ('"
.$userrow['userid']."','$coretag','$online','$statustext','$title','$info','$info2','$lastseen',FROM_UNIXTIME($updatetime)) ON DUPLICATE KEY             
                UPDATE userid='"
.$userrow['userid']."',gamertag='$coretag',online='$online',statustext='$statustext',title='$title',info='$info',info2='$info2',
                lastseen='
$lastseen',updatetime=FROM_UNIXTIME($updatetime)");
                    
                
$vbulletin->db->query("UPDATE userfield SET field15='$statustext',field16='$title',field17='$info2' WHERE userid=".$userrow['userid']);                                                            
            }    
        }                        
    }
}

if(
$updater=="true") {
    
$vbulletin->db->query("UPDATE xblusers SET time='00:00PM', date='00/00/00' WHERE title='crashed'");
}
log_cron_action('Updated XBL Status'$nextitem1);

// ---------------------------------------------------
// End Cronjob
// ---------------------------------------------------
?>
Reply With Quote
  #5  
Old 05-13-2009, 02:48 PM
Lynne's Avatar
Lynne Lynne is offline
 
Join Date: Sep 2004
Location: California/Idaho
Posts: 41,180
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Do you see anything in your error_logs? And is any of that script getting done? Is see you have some update queries and I'm just wondering if some are happening before the script stops.
Reply With Quote
  #6  
Old 05-13-2009, 03:03 PM
OcR Envy's Avatar
OcR Envy OcR Envy is offline
 
Join Date: May 2008
Location: Boston
Posts: 248
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

I have nothing in my error logs.

This query appears to always take place:

$vbulletin->db->query("UPDATE xblusers SET time='$checktime', date='$checkdate' WHERE title='checked'");

And this one takes place when the if statement is true

$vbulletin->db->query("UPDATE xblusers SET time='$checktime', date='$checkdate' WHERE title='crashed'");

It appears the code inside my while is where the issue lays as when the cron job automatically runs the insert queries do not take place. Also my log_cron_action doesn't log ethier when run automatically or manually.

I haven't checked if the userfields update query is saving. I will keep an eye on that now.
Reply With Quote
  #7  
Old 05-13-2009, 03:16 PM
Lynne's Avatar
Lynne Lynne is offline
 
Join Date: Sep 2004
Location: California/Idaho
Posts: 41,180
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Well, if I were to debug this, I'd do things like take out functions and such to see if they are the problem. For instance, change this line to simple give the results (true or false) and see if the job continues to run:
PHP Code:
        $duncanonline Downloadurl('http://xboxapi.duncanmackenzie.net/gamertag.ashx?GamerTag='urlencode($gamertag)); 
I'd do things like that to whole bits of code to see exactly where the problem lies.
Reply With Quote
  #8  
Old 05-13-2009, 03:33 PM
OcR Envy's Avatar
OcR Envy OcR Envy is offline
 
Join Date: May 2008
Location: Boston
Posts: 248
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Will do.

I also updated my Insert, Update statement to query_write function. Not sure if that matters.

The userfield queries where not taking place either.

--------------- Added [DATE]1242234837[/DATE] at [TIME]1242234837[/TIME] ---------------

Well that was easier than I was making it. It appears it is the function. Strange the function works flawless when I run it manually but not when it's automatic.

Thanks Lynne, anyone who can offer a reason as to why function doesn't work I'd appreciate it.
Reply With Quote
  #9  
Old 05-13-2009, 04:58 PM
Lynne's Avatar
Lynne Lynne is offline
 
Join Date: Sep 2004
Location: California/Idaho
Posts: 41,180
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

I had problems with using a function in my cron job, too. You need to pass any variables it is going to need and you need to globalize everything also. And, any functions you want it to use, you need to make sure to include them in the functions. You have to treat the function like it lives in it's own little world and knows nothing of the outside world except what you pass it.
Reply With Quote
  #10  
Old 05-13-2009, 05:06 PM
OcR Envy's Avatar
OcR Envy OcR Envy is offline
 
Join Date: May 2008
Location: Boston
Posts: 248
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Will do,

Thanks again Lynne +Rep if I could
Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 08:15 PM.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, vBulletin Solutions Inc.
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.12269 seconds
  • Memory Usage 2,340KB
  • Queries Executed 13 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (1)ad_showthread_beforeqr
  • (1)ad_showthread_firstpost
  • (1)ad_showthread_firstpost_sig
  • (1)ad_showthread_firstpost_start
  • (2)bbcode_php
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)navbar
  • (3)navbar_link
  • (120)option
  • (10)post_thanks_box
  • (10)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (10)post_thanks_postbit_info
  • (10)postbit
  • (10)postbit_onlinestatus
  • (10)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available:
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files:
  • ./showthread.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_post_thanks.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_postinfo_query
  • fetch_postinfo
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • showthread_start
  • showthread_getinfo
  • forumjump
  • showthread_post_start
  • showthread_query_postids
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • fetch_musername
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete