PDA

View Full Version : Administrative and Maintenance Tools - Schedule vB's tasks with a host crontab


Nxs
31 Jul 2006, 16:43
Schedule vB's tasks with a host crontab
!!! Warning You run this script at your OWN risk, I will not be responsible for any damage caused !!!

Description:vBulletins schedule tasks only run when a user is browsing your forum. With the release of 3.6 and RSS imports this has caused problems for slow moving forums importing fast moving RSS feeds (If a news item passes fully through the RSS feed before a visitor browses your forums causing the import to be processed then content could be lost)

Solution:If your host supports "Cron Jobs" you can call the attached PHP file periodically to force vBulletin to catch up with its internal scheduled tasks.

Installation

Download the attached file and edit the variables at the top to match your forum installation
Upload the file to somewhere on your host
Schedule this file to run at an appropriate interval
eg. (to run every hour at 15m past the hour, 12:15 - 13:15 - 14:15 - etc.)
15 * * * * /usr/bin/php -f /home/myuser/exec-cron.php >/dev/null 2>&1


Detailed InformationUnfortunatly running the cron.php from the vBulletin files will only process the next pending single task, This short script simply queries the scheduled task database to count how many tasks are pending, it then calls the cron.php routine that number of times - thus your scheduled tasks are kept up to date.

This is my first ever PHP script so please don't expect a masterpiece from a rocket scientist, if anyone has any comments or suggestions please drop me a PM

Nxs
31 Jul 2006, 16:44
I wasn't at all sure which forum to drop this script into, but as it relates mostly to the new RSS feature in 3.6 I guessed here was as good a place, sorry if it isn't.

Evercraft
31 Jul 2006, 17:19
Very nice! :)

Milad
01 Aug 2006, 08:18
very good work

Now vBulletin has real cronjop

Nxs
01 Aug 2006, 08:44
very good work

Now vBulletin has real cronjop

Well, only if you schedule this script to run every minute - and i'm sure your host will have something to say about that :)

Mine just runs every hour and typicaly has about 5 or 6 jobs to run at that point if no one has visited the forums in that time, works really well for importing RSS feeds tho.

jmw
29 Mar 2007, 17:50
Does this work with 3.6.5? It appears the "15 minute after the hour" example has the file name backwards.

dooch
04 May 2007, 17:53
yes it does work with 3.6.5 I had to change it slightly for non-localhost connections ;) Here is the part you need to change.

$ec_localhost = "localhost"; //Dooch's Additional bit. Add your remote mysql db info her eif not localhost!
$ec_dbname = "db"; // your vBulletin database
$ec_dbuser = "user"; // user with READ access
$ec_dbpass = "passw"; // password for the above user
$ec_dbprefix = ""; // database prefix, if required

// This should be the location of your forum folder (where cron.php resides)
$ec_pathtoforum = "path";

// Specify the FULL location of your PHP installation (how to call php)
$ec_pathtophp = "/usr/bin/php";

// Maximum number of tasks to run on one pass
$ec_max = 10;

/**************************************************
**** DO NOT CHANGE THE CODE BELOW THIS LINE ****
**************************************************/


// Connect to MySQL
$ec_link = mysql_connect($ec_localhost,$ec_dbuser,$ec_dbpass); //note the change here for non-localhost dudes. ;)

Nice work dude!

INSTALLED

Thanks

Dooch

NiTRoN
06 May 2007, 08:27
Sweet this is excellent for small boards.. I've been waiting sooooooo loooooong for this.. :)

trilljester
27 Jun 2007, 16:04
This is working nicely. I can't believe that VB doesn't offer something like this to run the scheduled tasks, because without traffic, those tasks will not run. That's just stupid.

Thanks!

gamma912
24 Jul 2007, 20:40
yea thats true - Thanks Im using it now it works great :)

jmw
09 Aug 2007, 22:21
Doesn't work with vbulletin 3.6.8

OmniBuzz
07 Jul 2008, 15:41
any chance to have an update for the latest release of Vbulletin ?

trilljester
03 Aug 2008, 22:29
Yeah, I can't seem to get it to work anymore. Sad, but I'm uninstalling. I'll have to write a shell script or something to trigger the cron in VB every 15 minutes or something.

Quarterbore
12 Aug 2008, 20:42
I need something like this for my Devopment board where I need to test but there are no users to make the scripts work. I will see if I can get it working on my 3.6.x site.

plothook
19 Jun 2009, 21:09
This works for me using vB 3.8.3

save the code below into a script file named vbcronjob.sh, and call the script from cron (I schedule my crontab for once a minute). Be sure to chmod +x the script. The logic in this shell script is pretty much the same as in the cron-exec.php script you can download here.

you should also disable the cron image inserted at the bottom of the pages presented to your users. See This Mod (http://www.vbulletin.org/forum/showthread.php?t=164477) for a simple plugin to do that.
#!/bin/bash

#----- environment setup -----#
# Absolute path to vBulletin root (where cron.php is located)
ct_pathtoforum='/home/user/public_html/forum/'
# Max tasks to run on one pass
ct_max=10

#----- database setup -----#
ct_dbhost='localhost' # your MySQL Server
ct_dbport='3306' # your MySQL Port
ct_dbname='forum' # your vBulletin database
ct_dbuser='username' # user with READ access
ct_dbpass='password' # password for the above user
ct_dbprefix='' # database prefix, if required

#----- query execution ----#
ct_date=`date "+%s"` # current unix time
ct_connect="--protocol=socket -h$ct_dbhost -P$ct_dbport -u$ct_dbuser -p$ct_dbpass -D$ct_dbname"
ct_query="SELECT COUNT(*) FROM ${ct_dbprefix}cron WHERE active=1 AND nextrun < $ct_date;"
# -A, No automatic rehashing, gives quicker start.
# -B, Batch mode.
# -N, Don't write column names.
# -n, Flush buffer.
# -q, Don't cache.
# -r, Write raw fields.
# -e, Execute command and quit.
ct_repeat=`mysql $ct_connect -A -B -N -n -q -r -e"$ct_query"`

#----- cron execution ----#
ct_pathtophp=`which php` # path to PHP
cd $ct_pathtoforum
if [ "$ct_repeat" -gt "$ct_max" ]; then ct_repeat=$ct_max; fi
for ((i=0; ct_repeat>i; i++)); do
#echo "$i"
$ct_pathtophp ./cron.php >& /dev/null
sleep 5
done

exit 0