PHP5 Soap Server

Recently I wrapped a class up and provided it as a SOAP service. Getting it working was a bit of a struggle and its clearly not something that people are doing a lot of, so here’s a quick roundup of the main issues and how I tackled each one.

Start Small – Build and Check A Class

I firstly built some unit tests using PHPUnit (more about that another day perhaps, but let me say it is excellent and I tumbled to it really easily once I’d started), then wrote my class and verified the tests were passing. This was to avoid trying to debug the PHP functionality through the added layer of the SOAP.

Simple SOAP Starting Point

My next step was to get a working SOAP service. This isn’t remotely tricky except that PHP can’t generate its own WSDL file (for extremely valid reasons but that doesn’t help me), so you either need to write it by hand or you need to generate it somehow.

As my starting point I took the whole working code from this fantastic example and checked that it worked for me.

SOAP setClass() and WSDL Fiddling

Having got this far I changed my SOAP server code to use the setClass() method and pointed it at my own original class. I then hand-edited the WSDL (one function at a time) to reflect the data types and arguments that would be moving through the service.

The actual service code looks like this:

require_once('lib/myClass.php');
ini_set("soap.wsdl_cache_enabled", "0");

$server = new SoapServer("service.wsdl");
$server->setClass("MyClass");
$server->handle();

The example WSDL supplied by the JimmyZ tutorial has a single function in it at the early stages, and I started with that, then adapted it for one single function from the class. This is perfectly valid providing you don’t try calling anything else! The PHP function declaration took this form:

function getAccountStatus($accountID)

The function returns two variables – it passes back the account ID and also returns information about the number of credits on the account. The accountID is a string of up to 8 characters, the other variable is a number. Here is the WSDL adapted for this purpose:


   
   
     
   
   
     
     
   
   
     
       
       
     
   
   
     
     
       
       
         
       
       
         
       
     
   
   
     
       
     
   
   

Once I discovered that WSDLs are best read from end to beginning, I was able to expand the example above for all the other various functions I needed.

Hopefully this helps someone get started. There are various tools available for generating the WSDL, in particular try either George’s suggestion, the offering from phpclasses.org, or check out the automatic generator in ZDE. Certainly there are tools available, but I didn’t manage to find one that did the trick for me.

If you are writing, or have written, a SOAP service in PHP5 then drop a comment and let me know – I certainly felt like I was in a minority on this project. Similarly if I’ve missed anything then I’d appreciate comments so I know for next time.

So Begins a New Chapter

I’d like to announce that today I parted company with my employers Coolpink to the satisfaction (and probably benefit) of both sides.

To answer the first three questions: Yes, I am fine. Yes, they are paying me my notice period so I won’t starve. And yes, I need a new job! I’ll put up a coherent post on me and my skills soon.

Donate to PHPWomen and Win

Its exciting times at PHPWomen.org. There is the new addition of a “Donate” button, for anyone who would like to contribute to our cause. As if we aren’t reason enough, the adorable Cal Evans from Devzone has given us 10 elePHPants (remember he sent me one?) to give to the first ten people to donate more than $50.

PHPWomen finances goodies to give away at conferences and also assists members who perhaps would not ordinarily be able to attend conferences to get there and participate. More women at conferences …. can that be a bad thing?

Logrotate Error on Ubuntu

For a few weeks now, I’ve been seeing this error in my logs every night:

/etc/cron.daily/logrotate:
error: error running shared postrotate script for /var/log/mysql.log /var/log/mysql/mysql.log /var/log/mysql/mysql-slow.log
run-parts: /etc/cron.daily/logrotate exited with return code 1

What’s happening is that after all the mysql backing up and everything is done, ubuntu is trying to use the debian-sys-maint user to flush the logs, this is actually called in /etc/logrotate.d/mysql-server. On my system, we seem to have lost this mysql user.

The solution is to look for the password used in the /etc/mysql/debian.cnf file, mine looks like this:

# Automatically generated for Debian scripts. DO NOT TOUCH!
[client]
host     = localhost
user     = debian-sys-maint
password = xxxxxxxxxxxxxxxx
socket   = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
user     = debian-sys-maint
password = xxxxxxxxxxxxxxxx
socket   = /var/run/mysqld/mysqld.sock
basedir  = /usr

Using the password, and some inspiration from this post on the Ubuntu Forums I recreated the user with the necessary permissions and password with:

GRANT RELOAD, SHUTDOWN, PROCESS, SHOW DATABASES, SUPER, LOCK TABLES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY PASSWORD 'xxxxxxxxxxxxxxxx'

This did the trick, as the nightly errors have now disappeared from my script. Hope this helps someone in a similar situation – if you can expand these notes then please add a comment and I will update this as needed – thanks :)

Home Office Haven

This weekend has been, like many before it, DIY-tastic. I popped out to a party this afternoon and in the meantime Kevin put the finishing touches to the shelves in the little bedroom that we will use as an office. To put this in context, let’s start with the “before” photo:

So here are the new shelves, finished today (the nice contrasting wall colour was the result of me popping to the DIY store and trying to guess which colour paint would be the closest match … I’ve already been assured there is something wrong with my colour sense!):

And here’s what they looked like an hour later, when I got some stuff unpacked onto them – they’re really deep shelves and they are going to hold a lot of “stuff” :)

I’d also like to give special mention to this guy:

I had a build-a-bear voucher for Christmas so I went and chose this traditional style bear. He is stuffed really hard, so although he isn’t cuddly, he is still soft and can sit up on his own. He’ll be supervising operations in the new office and keeping me company when I am working here. All in all, I think its coming together rather well – all I need now is some ideas for small-scale woodwork projects to take care of the many offcuts that are lying around downstairs. Suggestions in the comments box please …

Compiling PHP Development Version

I had cause this week to install an additional version of PHP onto my development server. This is because I wanted to look at the code for forkr which is targeted at PHP 5.3, which isn’t out yet. So I trotted across to snaps.php.net and downloaded the current version of PHP 5.3.

I then used the following steps to compile PHP:

./configure --prefix=/usr/local/php5.3 --with-apxs2=/usr/bin/apxs2
make
make test
make install

The configure arguments are to get the resulting code put into /usr/local/php5.3/ and to specify where to find apxs2 itself. Strictly speaking the “make test” step is optional, however as this is a development version of php I consider it polite to run this automated test and then press the button to submit the results at the end, it runs quickly and if it helps the QA people, then great.

It was at this point that I realised that I had overwritten a pre-existing file, critically it was /usr/lib/apache/modules/libphp5.so, the shared object file for my existing PHP installation! I fiddled with the PHP configuration at length but could not figure out how to get PHP to spit a differently named or located file out of the other end of the process.

This evening I mentioned my problem in the #phpc channel on freenode (warning, its not a help channel, don’t go there and ask questions, you won’t get a warm welcome) and after some prodding from the guys there I worked around my problem by skipping the make install step – its this step which uses apxs to move the file and causes my problem. The makefile shows the list of install targets, and I needed to exclude install-sapi. My steps now look like this:

./configure --prefix=/usr/local/php5.3 --with-apxs2=/usr/bin/apxs2
make
make test
make install-cli install-build install-headers install-programs install-pear
cp libs/libphp5.so /usr/lib/apache2/modules/libphp5-dev.so

The new make install line just installs the bits I’ll want, it seems that any combination of these can be used, depending on which bits of the language will be needed. The final line copies the apache module into the correct location for my system (Ubuntu Gutsy Gibbon).

Non-technical Postscript

I just wanted to add a note here to say that I would probably never have got to the bottom of this problem if I hadn’t been collectively rescued from it by some of the seriously leading lights in the PHP community – people who shouldn’t really know my name never mind stop to help me with a fairly basic problem. So thanks and hugs to Derick, Johannes, Davey and Ben. Thanks guys – for solving my problem *and* reminding me why the PHP Community is a cool place to be!

2007 Review

I was going to skip the essay thing and just write a quick “Happy New Year” post, but then I read last year’s entry and couldn’t help remembering how far I’ve come in what is really a short space of time. Two years ago I had no job and was about to move to Leeds, and this time last year we were in despair over the house buying problems.

Career

This year I changed jobs in the spring, to go and work for a small web agency (they think they’re a digital marketing agency but I’m not convinced) as a web developer. More interesting than the job side of things is that this year, I met the PHP community.

PHP People

I haven’t met the whole community, and hardly any of them in person, but meet them I did. Through phpwomen.org I have a mentor, the lovely Ligaya and she initially suggested I spend more time in IRC since that’s where things happen. Usually I can be found on freenode in the #phpc and channels. In February I met Cal Evans, at the PHPLondon conference. This was a fabulous conference and I also met a few other people, including monxton from phpwomen and also Rasmus Lerdorf (father of PHP) although I was too overwhelmed to say anything to him! Since then I’ve made loads of friends and learned a lot from this community. In November I attended the International PHP Conference in Frankfurt, Germany, and wrote about it for phpwomen. While there I attended some good sessions (of both conference and drinking varieties) and also got to meet lots of people – some friends that I knew already but hadn’t met in real life, and some other new friends. I know the people I met this year will be a big influence on 2008 for me.

Home

This time last year we’d had all our belongings in storage for almost a year and had two house sales fall through in four months. Well, it took another failed sale and a full 5 months but we finally did it and bought our first house in May 2007. For the full saga (and a saga it was) read the house category posts, I warn you it does take some reading! Anyway we are now in possession of a 4-bedroomed house, set over four floors, with two bathrooms, gardens and a garage. Notably it has the kitchen in the basement, which floodes, and we bought the contents of the house, which we hadn’t really planned for. Since buying the house we have had people in to patch up the roof and guttering, fit central heating, and totally rewire the house. We’re now at a point where the brick dust and missing floors are gone and we can start getting the place straight. Plastering, carpentry and decorating skills are now in demand and at some point we need to figure out how to choose, purchase and lay floors. At the moment the house looks like a disaster area but the place is really growing on me and we really are making progress, even if that’s not obvious to outsiders at the moment!

Website

Last year I did a whole round-up of the site and how I was getting on with it. I can’t see me getting around to it this year, mostly because its not that interesting but rest assured that the bulk of my traffic is visiting the recipe pages! Here’s a quick snap of the dashboard of the google analytics tool for this site, things seem to be a bit quiet over the summer, but maybe that’s because I posted less at that time.

In Conclusion

2007 was a very good year, here’s to 2008 :)

Christmas Angel

Merry Christmas everyone!!

I spent last weekend doing a mad delivery round across the midlands but now I’m enjoying a quiet Christmas at home. I also finally got round to making the angel for the top of the tree, here she is:

She took up her post on top of the tree just in time, on Christmas Eve!