Frequently when using the non command line version of PHPList which I have loaded on my service providers server, I have to hit Process Queue multiple times for a message. I have read a lot of posts online complaining this issue. I have done some troubleshooting of it myself by turning on the verbose feature in PHPList and I am still at a loss as to what it gets stuck on and then stops processing the queue.
PHPList works great, I love it for all that it does and does well. My one complaint is the Process Queue issue and from reading a bunch of posts online I have successfully patched together a solution.
This code can be executed on the server where PHPList lives if they will let you run a wget command from a CRON entry, some won’t. In my case I opted to simply run the command from a Raspberry Pi server that I have that runs 24/7. It is simple a looping script that does the equivalent of hitting the “Process Queue” button on PHPList at regularly timed intervals and detected when the queue has been processed. I have seen several examples of using wget to be fired off every 5 minutes to do this, but that means it gets run every 5 minutes, all day, every day. Why not run something that can be scheduled for a time and then runs to completion which this script does.
This script also produces a log file that can be copied to a location viewable via the server so you can double check to see if all ran OK. I see this mostly as a debug feature and it could potentially be turned off along with some of the “echos” of text. Except for the one in the else-if, it is an error to have an empty else-if in a bash script.
PHPList Automatic Process Queue Script
#!/bin/bash
# Controller Script for PHPlist Process Queue
# Erick Clasen blog.oils-of-life.com 05/16/2015
# User defined variables
# No trailing / on DIR!
DIR=/home/erick/php-proc
LOG=php-pq.log
# Time to sleep between loop iterations.
TIME=3m
# Max number of loops, so the script breaks out if for some reason it fails to complete.
LOOPS=100
# Publish a copy of the log to the following directory
PUBDIR=/home/erick/public_html
# wget having trouble with some options so simply switch to the dir we want it to work in.
cd $DIR
x=1
echo Start------------- >> $LOG
# While loop, breaks out if done or at LOOPS as a guard against #infinite loop.
while [ $x -le $LOOPS ]; do
# Timestamp in DDMMYYYY_HHMM-SS (UTC)
timestamp=$(date -u +"%d%m%Y_%H%M-%S")
echo $x $timestamp
echo $x $timestamp >> $LOG
x=$(( $x + 1 ))
# Use wget to run process queue with login and password provided
wget 'your_url_here.com/phpList/admin/?page=processqueue&login=phplist&password=your_password_here'
# Test to see if PHPlist process queue has completed.
if grep -q "Finished, Nothing to do" $DIR/index.*
then
# Exit from Loop with a break, mark log,remove index files that wget fetched, break out.
echo All Done! Breaking Out
echo All Done!--------- >> $LOG
echo ------------------ >> $LOG
# Publish Log, Optional
cp $LOG $PUBDIR/$LOG
rm $DIR/index.*
break
else
# Nothing Happens
echo Keep Running...
fi
# Sleep for TIME
echo ------- Sleeping Process --------
sleep $TIME;
done;
PHPList Automated Process Bounces Script
Process Bounces can be run from a script as well…
#!/bin/bash
# Controller Script for PHPlist Process Bounces
# Erick Clasen blog.oils-of-life.com 05/16/2015
# User defined variables
# No trailing / on DIR!
DIR=/home/erick/php-proc
LOG=php-pq.log
# Publish a copy of the log to the following directory
PUBDIR=/home/erick/public_html
# wget having trouble with some options so simply switch to the dir we want it $
cd $DIR
# Use wget to run process queue with login and password provided
wget 'your_url_here.com/phpList/admin/?page=processbounces&login=phplist&password=your_password_here'
echo ---------------------------- >> $LOG
echo BOUNCES HAVE BEEN PROCESSED! >> $LOG
echo ---------------------------- >> $LOG
# Publish Log, Optional
cp $LOG $PUBDIR/$LOG
rm $DIR/index.*
CRON entry to run these scripts
These entries run Process Queue every Monday, Wednesday and Friday (1,3,5) at 4:15AM and Process Bounces at 12:15AM on the first day of the month. Nothing magic about those settings, you can set them any way you wish. I figure starting the process in the wee hours of the morning will allow people to receive the email by the time that they wake and first check their mail. I set the time to 15 after so it won’t run at the same time as some processes that I have set to run on the hour. Sending mail on weekdays keeps people from having to deal with more email than they might like on the weekends.
15 04 * * 1,3,5 /home/erick/php-proc/php-pq.sh
15 00 1 * * /home/erick/php-proc/php-pb.sh
PHPList Automatic Process Queue Override
If you must make PHPList process the queue now and don’t want to wait for the CRON task. Two options are available, do it the via the normal way from the PHPList admin website or you can use something as simple as a CGI script to force the php-pq.sh script to execute. Below is an example of a dirt simple CGI script. It prints out the tail of the php-pq.log and runs the php-pq.sh script. Php-pq.log is the log of the previous automatic processing event and then goes ahead and fires off the Process Queue Override by running the script. Basically the act of loading the page makes it run. I keep my cgi-bin directory locked down so no one outside of a few IP addresses can get to the files there. But it would be fairly harmless if someone did, the worst that happens is that the queue gets processed.
CGI Code for Automatic Process Queue Override
#!/bin/bash
echo "Content-type: text/html"
echo ""
echo "PHPList Automatic Process Queue Override"
echo ""
echo "
PHPList Automatic Process Queue Override from host $(hostname -s &)
"
echo ""
echo "
$(tail /home/erick/php-proc/php-pq.log &)
"
echo ""
echo "
Information generated on $(date &)
"
echo ""
echo "Processing..."
echo "
$(/home/erick/php-proc/php-pq.sh &)
"
echo "
"
PHP Config File Tweaks
I am working on taking some notes on some changes I have made to the PHPList config.php file and will be posting on this in August 2015.