reference site :
- https://launchpad.net/gearmand
- http://www.syn-ack.org/centos-linux/installing-gearman-on-centos-6-2/
- http://blog.andyburton.co.uk/index.php/tag/precise/
- https://github.com/Supervisor/initscripts/blob/master/redhat-init-jkoppe
case : centos, amazon-linux-ami
1. install gearman
sudo yum install uuid-devel libuuid libuuid-devel uuid boost-devel libevent libevent-devel libcurl-devel openssl-devel sudo yum install mysql-devel sqlite-devel libmemcached-devel #option wget https://launchpad.net/gearmand/1.2/1.1.5/+download/gearmand-1.1.8.tar.gz tar xvfz gearmand-1.1.8.tar.gz cd gearmand-1.1.8 ./configure make sudo make install sudo cp support/gearmand.init /etc/init.d/gearmand sudo chmod 755 /etc/init.d/gearmand sudo vi /etc/init.d/gearmand gearmand=/usr/local/sbin/gearmand OPTIONS="--log-file=/var/log/gearmand/gearmand.log \ --verbose INFO" daemon --pidfile=$pidfile --user=gearman $gearmand -d $OPTIONS sudo useradd -M gearman -s /sbin/nologin -r sudo mkdir /var/run/gearmand sudo touch /var/log/gearmand.log sudo chown gearman:gearman /var/run/gearmand /var/log/gearmand.log
2. gearman with PHP
sudo pecl install gearman sudo vi /etc/php.d/gearman.ini extension=gearman.so # check gearman php module php -i gearman gearman support => enabled extension version => 1.1.1 libgearman version => 1.1.5 Default TCP Host => localhost Default TCP Port => 4730
3. gearman php test
reverse_worker.php
<?php
echo "Starting\n";
# Create our worker object.
$gmworker= new GearmanWorker();
# Add default server (localhost).
$gmworker->addServer('127.0.0.1', 4730);
# Register function "reverse" with the server. Change the worker function to
# "reverse_fn_fast" for a faster worker with no output.
$gmworker->addFunction("reverse", "reverse_fn");
print "Waiting for job...\n";
while($gmworker->work())
{
if ($gmworker->returnCode() != GEARMAN_SUCCESS)
{
echo "return_code: " . $gmworker->returnCode() . "\n";
break;
}
}
function reverse_fn($job)
{
echo "Received job: " . $job->handle() . "\n";
$workload = $job->workload();
$workload_size = $job->workloadSize();
echo "Workload: $workload ($workload_size)\n";
# This status loop is not needed, just showing how it works
for ($x= 0; $x < $workload_size; $x++) { echo "Sending status: " . ($x + 1) . "/$workload_size complete\n"; $job->sendStatus($x, $workload_size);
sleep(1);
}
$result= strrev($workload);
echo "Result: $result\n";
# Return what we want to send back to the client.
return $result;
}
# A much simpler and less verbose version of the above function would be:
function reverse_fn_fast($job)
{
return strrev($job->workload());
}
reverse_client.php
<?php
# Create our client object.
$gmclient= new GearmanClient();
# Add default server (localhost).
$gmclient->addServer('127.0.0.1', 4730);
echo "Sending job\n";
# Send reverse job
do
{
$result = $gmclient->doNormal("reverse", "Hello!");
# Check for various return packets and errors.
switch($gmclient->returnCode())
{
case GEARMAN_WORK_DATA:
echo "Data: $result\n";
break;
case GEARMAN_WORK_STATUS:
list($numerator, $denominator)= $gmclient->doStatus();
echo "Status: $numerator/$denominator complete\n";
break;
case GEARMAN_WORK_FAIL:
echo "Failed\n";
exit;
case GEARMAN_SUCCESS:
break;
default:
echo "RET: " . $gmclient->returnCode() . "\n";
exit;
}
}
while($gmclient->returnCode() != GEARMAN_SUCCESS);
At first terminal
php reserve_worker.php Starting Waiting for job...
At another terminal
php reserve_client.php Sending job
php reverse_worker.php Starting Waiting for job... Received job: H:xxxxxxxx:11258 Workload: Hello! (6) Sending status: 1/6 complete Sending status: 2/6 complete Sending status: 3/6 complete Sending status: 4/6 complete Sending status: 5/6 complete Sending status: 6/6 complete Result: !olleH
4. using supervisor
reference site : http://stackoverflow.com/questions/8217848/running-gearman-workers-in-the-background
sudo yum install python-setuptools
sudo easy_install supervisor
sudo touch /etc/init.d/supervisord;sudo chmod +x /etc/init.d/supervisord
sudo vi /etc/init.d/supervisord
#!/bin/sh
#
# /etc/rc.d/init.d/supervisord
#
# Supervisor is a client/server system that
# allows its users to monitor and control a
# number of processes on UNIX-like operating
# systems.
#
# chkconfig: - 64 36
# description: Supervisor Server
# processname: supervisord
# Source init functions
. /etc/rc.d/init.d/functions
prog="supervisord"
prefix="/usr/"
exec_prefix="${prefix}"
prog_bin="${exec_prefix}/bin/supervisord"
PIDFILE="/var/run/$prog.pid"
OPTIONS="-c /etc/supervisord/supervisord.conf"
start()
{
echo -n $"Starting $prog: "
daemon $prog_bin --pidfile $PIDFILE $OPTIONS
[ -f $PIDFILE ] && success $"$prog startup" || failure $"$prog startup"
echo
}
stop()
{
echo -n $"Shutting down $prog: "
[ -f $PIDFILE ] && killproc $prog || success $"$prog shutdown"
echo
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $prog
;;
restart)
stop
start
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
;;
esac
sudo mkdir /etc/supervisord sudo mkdir /etc/supervisord/conf.d echo "echo_supervisord_conf > /etc/supervisord/supervisord.conf" | sudo sh
sudo vi /etc/supervisord/supervisord.conf [unix_http_server] file=/var/run/supervisor.sock chmod=0700 [supervisord] logfile=/var/log/supervisord.log pidfile=/var/run/supervisord.pid [supervisorctl] serverurl=unix:///var/run/supervisor.sock [include] files = /etc/supervisord/conf.d/*.conf
vi /etc/supervisord/conf.d/reverse.conf [program:gearman] command=/usr/bin/php reverse_worker.php numprocs=1 directory=/home/xxxxx/ stdout_logfile=/home/xxxxx/reverse_worker.log environment=GEARMAN_USER=gearman autostart=true autorestart=true user=gearman stopsignal=KILL
reference site : http://till.klampaeckel.de/blog/archives/94-start-stop-daemon,-Gearman-and-a-little-PHP.html
case : ubuntu
sudo apt-get install make gcc g++
sudo apt-get install libboost-thread-dev libboost-program-options-dev libevent-dev uuid-dev libpq-dev libcloog-ppl0 libcurl4-gnutls-dev
sudo apt-get install libmemcached-dev libmariadbclient-dev libsqlite3-dev # option
wget https://launchpad.net/gearmand/1.2/1.1.8/+download/gearmand-1.1.8.tar.gz
tar xvfz gearmand-1.1.8.tar.gz
cd gearmand-1.1.8
./configure
make
sudo make install
sudo useradd -M gearman -s /sbin/nologin -r
sudo mkdir /var/run/gearman /var/log/gearman-job-server
sudo touch /var/log/gearman-job-server/gearman.log
sudo chown gearman:gearman /var/run/gearman /var/log/gearman-job-server
sudo vi /etc/init.d/gearman-job-server
#!/bin/sh
# Gearman server and library
# Copyright (C) 2008 Brian Aker, Eric Day
# All rights reserved.
#
# Use and distribution licensed under the BSD license. See
# the COPYING file in this directory for full text.
### BEGIN INIT INFO
# Provides: gearman-job-server
# Required-Start: $network $remote_fs $syslog
# Required-Stop: $network $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time
# Description: Enable gearman job server
### END INIT INFO
prefix=/usr/local
exec_prefix=${prefix}
NAME=gearmand
DAEMON=${exec_prefix}/sbin/gearmand
PIDDIR=/var/run/gearman
PIDFILE=${PIDDIR}/gearmand.pid
GEARMANUSER="gearman"
PARAMS="--verbose INFO"
test -x ${DAEMON} || exit 0
. /lib/lsb/init-functions
test -f /etc/default/gearman-job-server && . /etc/default/gearman-job-server
start()
{
log_daemon_msg "Starting Gearman Server" "gearmand"
if ! test -d ${PIDDIR}
then
mkdir ${PIDDIR}
chown ${GEARMANUSER} ${PIDDIR}
fi
if start-stop-daemon \
--start \
--exec $DAEMON \
-- --pid-file=$PIDFILE \
--user=$GEARMANUSER \
--daemon \
--log-file=/var/log/gearman-job-server/gearman.log \
$PARAMS
then
log_end_msg 0
else
log_end_msg 1
log_warning_msg "Please take a look at the syslog"
exit 1
fi
}
stop()
{
log_daemon_msg "Stopping Gearman Server" "gearmand"
if start-stop-daemon \
--stop \
--oknodo \
--exec $DAEMON \
--pidfile $PIDFILE
then
log_end_msg 0
else
log_end_msg 1
exit 1
fi
}
status()
{
status_of_proc -p $PIDFILE $DAEMON $NAME && exit 0 || exit $?
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart|force-reload)
stop
start
;;
*)
echo "Usage: $0 {start|stop|restart|force-reload|status}"
;;
esac
for using mysql queue table
sudo vi /etc/init.d/gearmand OPTIONS="--log-file=/var/log/gearmand.log \ --verbose INFO --queue-type=MySQL \ --mysql-host=XXX.XXX.XXX.XXX \ --mysql-port=3306 \ --mysql-user=gearman \ --mysql-password=gearman_password \ --mysql-db=gearman \ --mysql-table=queues"
CREATE USER "gearman"@"XXX.XXX.XXX.XXX" IDENTIFIED BY "gearman_password"; GRANT ALL PRIVILEGES ON gearman.* TO "gearman"@"XXX.XXX.XXX.XXX"; CREATE DATABASE gearman; USE gearman; CREATE TABLE queues(unique_key VARCHAR(64) PRIMARY KEY, function_name VARCHAR(255), when_to_run INT, priority INT, data LONGBLOB);