Setting up PHP 5 + Gearman + Java on Ubuntu Linux 9.10 (Karmic)
Bellow are stops to setup a running Gearman based job server which can be used to have various work-distribution clusters especially creating an interoperability between your web layer (esp PHP5) and backing business layer (esp. in Java).
Steps:
Prepare Gearman job server
You may decide to get the source and compile or use Ubunut’s PPA repositories to get them pre-built. I go with the second and added this repository ( deb
http://ppa.launchpad.net/gearman-developers/ppa/ubuntu karmic main ) to my /etc/apt/source.list .
Install Job Server
sudo aptitude update sudo aptitude install gearman-job-server
Prepare PHP environment
sudo aptitude install uuid-dev php5-dev sudo pecl install channel://pecl.php.net/gearman-0.7.0
And also add extension=gearman.so to both:
- /etc/php5/apache2/php.ini
- /etc/php5/cli/php.ini
Check Gearman PHP extension
Get phpinfo() and see if gearman exists there
<?php phpinfo(); ?>
Setup Java/Gearman Binding
Get the project from https://launchpad.net/gearman-java
Startup Gearmand
sudo /etc/init.d/gearman-job-server start
Sample Java based Worker
import org.gearman.client.*; import org.gearman.common.GearmanJobServerConnection; import org.gearman.common.GearmanNIOJobServerConnection; import org.gearman.worker.AbstractGearmanFunction; import org.gearman.worker.GearmanWorker; import org.gearman.worker.GearmanWorkerImpl; public class SampleGearmanWorker { public static void main(String[] args) { final GearmanJobServerConnection connection = new GearmanNIOJobServerConnection("localhost", 4730); GearmanWorker worker = new GearmanWorkerImpl(); worker.addServer(connection); worker.registerFunction(SampleFunction.class); worker.work(); } private static final byte[] EMPTY_BYTES = new byte[]{}; public static class SampleFunction extends AbstractGearmanFunction { @Override public String getName() { return "test"; } @Override public GearmanJobResult executeFunction() { final byte[] hello = "hello ".getBytes(); final byte[] name = (byte[]) this.data; final byte[] resp = new byte[hello.length + name.length]; System.arraycopy(hello, 0, resp, 0, hello.length); System.arraycopy(name, 0, resp, hello.length, name.length); final GearmanJobResult jr = new GearmanJobResultImpl(this.jobHandle, true, resp, EMPTY_BYTES, EMPTY_BYTES, 0, 0); return jr; } } }
Sample PHP Client
<?php $client= new GearmanClient(); $client->addServer(); print $client->do("test", "amin")."\n"; ?>
Run the example
run Java code and also php gearman-client.php. It will print “hello amin” :)
Hope it helps!
very informative..thanks a lot..james
javajobs.net
For some reasons, Ubuntu installed libgearman2… And
pecl install channel://pecl.php.net/gearman-0.7.0
fails with
checking whether to enable gearman support… yes, shared
not found
configure: error: Please install libgearman
ERROR: `/tmp/pear/temp/gearman/configure’ failed
:(
you need
sudo aptitude install php-pear
otherwise sudo pecl does not work
after that I am stock with the same error as Alex
configure: error: Please install libgearman
ERROR: `/tmp/pear/temp/gearman/configure’ failed
If you are running Ubuntu 10.04, this should get you up and running:
EDIT: /etc/apt/source.list and add the following:
deb http://ppa.launchpad.net/gearman-developers/ppa/ubuntu lucid main
sudo apt-key adv –recv-keys –keyserver keyserver.ubuntu.com
sudo apt-get update
sudo apt-get install gearman-job-server libgearman2 libgearman-dev uuid-dev php5-dev libgearman-dev
sudo pecl install channel://pecl.php.net/gearman-0.7.0
@wilmoore
After the “apt-get install” I get the following error (I’m on 10.04):
Reading package lists… Done
Building dependency tree
Reading state information… Done
uuid-dev is already the newest version.
php5-dev is already the newest version.
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:
The following packages have unmet dependencies:
gearman-job-server: Depends: libdrizzle1 (>= 2010.10.01) but it is not installable
E: Broken packages
@Luke:
=========================================================
Install Drizzle (Gearman Dependency)
=========================================================
1. Add the signing key to your keyring:
> sudo apt-key adv –keyserver keyserver.ubuntu.com –recv-keys 06899068
or see 1a. (especially if dealing with an outbound proxy server)
2. Add the PPA:
> sudo sh -c ‘echo “deb http://ppa.launchpad.net/drizzle-developers/ppa/ubuntu lucid main” > /etc/apt/sources.list.d/drizzle.list’
3. Update the APT cache
> sudo apt-get update
4. Install drizzle-dev (retrieves libdrizzle1)
> sudo apt-get install -y drizzle
Thanks Luke for comments.