Welcome! I'm Lorna Jane Mitchell: web development consultant, trainer and author. I work mostly with PHP, git and the LAMP stack - plus the various excellent technologies associated with it. Part of the time, I am Principal Developer for Siftware, the other part of the time I spend on open source activities, consultancy and training.

This site is a combination of a blog, a central place to keep links to my books, talks and other resources, and also a place to put a bit of information for anyone who wants to work with me. If you have any questions, or if you'd like to work with me, then please let me know.

Work With Me

PHP Migration

Ready for new PHP but need a hand getting your application upgraded? I am happy to assess your codebase and advise on upgrade paths.


If your team needs to gain or improve their technical skills, I can help. Get in touch with me and we'll work out a package that fits your needs.


With buckets of LAMP experience, I can help your team work through the tough spots - and I love to lend a safe pair of hands to help others along.

PHP Services

Time for better tools or better practice? Time for a new version of PHP? Let me lend a hand to make your transition go smoothly.

From The Blog

Git Pull Causes a Merge

If you type git pull and expect a fast-forward update, but get a merge instead, don't panic! This usually happens when we're collaborating on a branch with other people, and we've made changes on our local version of a branch, and someone else (or the other you, if you use git to sync between multiple dev platforms) has made changes to the remote version of a branch in the meantime. It also happens really frequently in teams where all commits are to the master branch ... yet another reason to have a decent branching strategy.

All that's happened is something like this:

$ git log --oneline --all --graph --decorate
* 054f163 (HEAD, branch1) Installation instructions for the application
| * 0ce808c (origin/branch1) Fixing template layout
* 927aad9 A random change of 731 to ideas2.txt

Since the last common commit, there are commits on your local branch, and the remote one. You could just let the merge go ahead but there are other options. You could also check out a new branch at this point, reset your tracking branch to the right place and then reapply your changes using cherry-pick or by rebasing and then fast-forward merging your branch.

In fact, git has an inbuilt command that does the last of those options: rebases your local branch against the remote branch. So in this case, working on branch1:

git pull


git pull --rebase

And voila! Your changes look as if they just happened, crucially after the ones from the remote branch, and at this point you can safely push your changes up to the remote.

Note that if you have a branch that should always defer to upstream changes (the master branch on your fork of a project is a prime example) then you can configure it to always use --rebase when you run git pull. To do so, set the config option for branch.master.rebase:

git config --local branch.master.rebase true

If you're seeing this scenario often then this may indicate a confusing branching strategy but hopefully this example shows you how you can quickly recover and get on with your work.

SOAPFault When Switching PHP Versions

I'm working on an update to my PHP Web Services book and with PHP 7 likely to release before the book even makes it into print, I'm testing all my example code across PHP 5.6 and PHP 7 ... which today gave me a weird problem with a very, very simple SOAP example. Continue reading

Debugging rst2pdf and pygments

I create my slide decks from ReStructuredText, which is a text markup format. Working this way makes it easy to add into source control, fast to work with, and also accessible since I don't use a mouse or other pointing device so traditional slide deck creation programs are kind of difficult. Text-based wins every time for me. While working on a new slide template, I ran into some difficulties and had to figure out how to inspect what was going on. I seem to struggle with this every time so I am writing my troubleshooting guide here for when I need it next. Continue reading

Talks, Articles, Podcasts, and More


What to Expect from PHP7

froscon, August 2015

Get Your Patch Accepted

froscon, August 2015

What to Expect from PHP 7

PHPEM, August 2015

Advanced Adventures in Git

PHP South Coast, July 2015

Make Better Software Podcast

Make Better Software, June 2015

Your Open Source Journey

Dynamic Languages Conference, June 2015