Skip to main content

Running PHPUnit via Phing on HHVM

This blog post might be outdated!
This blog post was published more than one year ago and might be outdated!
· 2 min read
Stephan Hochdörfer
Head of IT Business Operations

For quite some time we run the unit tests for our libs and tools against PHP and HHVM, at least that is what I thought up to now. As it turns out I missed a minor detail. In our Jenkins job we invoke the Phing task like this:

hhvm -v ResourceLimit.SocketDefaultTimeout=30 -v Http.SlowQueryThreshold=30000 -v Eval.Jit=false "$WORKSPACE/vendor/bin/phing" -f "$WORKSPACE/build.xml" ci:build

What happens now is that Phing is executed via HHVM but PHPUnit will still be executed via the PHP binary because the PHPUnit shell script will look for the php binary in the PATH configuration. Since we run HHVM side-by-side with PHP on our Jenkins build nodes I was not able to point /usr/bin/php to /usr/bin/hhvm - which would be the easiest and cleanest solution. I had to come up with the following work-a-round:

export PATH="$WORKSPACE:$PATH"
ln -s /usr/bin/hhvm "$WORKSPACE/php"
hhvm -v ResourceLimit.SocketDefaultTimeout=30 -v Http.SlowQueryThreshold=30000 -v Eval.Jit=false "$WORKSPACE/vendor/bin/phing" -f "$WORKSPACE/build.xml" ci:build
rm "$WORKSPACE/php"

Before running Phing a php symlink pointing to /usr/bin/hhvm gets created in the current Jenkins workspace directory. In addition to that the directory is added to the PATH environment variable (as the first entry. This is important!). When PHPUnit now tries to find a php binary it will find the one in the current Jenkins workspace directory which in fact is the hhvm binary and will run against it. After running Phing the symlink gets removed just to be on the safe side.