As mentioned in an earlier post, I’ve been playing around with Xapian and PHP5, but the nice object oriented API of Xapian is flattened into 240 functions using the PHP bindings.
To make it easier to work with I’ve created a set of wrapper classes for PHP5 which allow you to use the API just as the documentation suggests, with the added bonus of using PHP iterators.
Wrapping 240 methods would be a bit painful, so I’ve create a base class which uses the __call override to actually dispatch method calls to Xapian functions, marshalling parameters and return values too!
You should find these wrappers “natural” to use if you read the Xapian C++ API documentation. except that all classes are prefixed with “Xapian” so the C++ Xapian::Document class becomes XapianDocument
The various iterator classes support the PHP5 Iterator interface, allowing you to use them in a foreach loop, for example
$termi= $db->allterms_begin(); foreach($termi as $term) { echo "$term | "; }
All of the classes will accept an Xapian resource in their constructor which will wrap that resource, for example, to open an in-memory database you could use
$db = new XapianWritableDatabase(inmemory_open());
Alternatively, pass the documented construction parameters to create a
new resource, e.g.
$database = new XapianDatabase($dbfile);
Inheritance is supported, for example you can call XapianDatabase methods on
a XapianWritableDatabase object
Performance
The included xapian_php5_smoketest.php is an adaptation of the original smoketest.php which comes with the xapian-bindings library. The PHP5 version of the smoketest runs around 2-3 times slower than the original, raw, smoketest.php.
The smoketest is almost entirely made up of Xapian calls, so if Xapian calls are
your bottleneck, then these classes will slow you down more
However, in most common uses, particularly querying, API calls are unlikely to
be the main bottleneck and using php5 iterators makes for some easy to read code.
Download the code
xapian_php5_wrapper_v0.1.tar.gz – 8Kb
If anyone finds this useful or has suggestions for improvement, do let me know.
Nice work. I just finished a implementation using the binding under PHP5… wish I had found this two weeks ago! I’ve downloaded your code and will test it out.
Blimey! You wait for a PHP wrapper and two come along at once!
Daniel Ménard has done it the hard way and has done a “proper” wrapper with documentation for each method. My only gripe is he changed the method names 🙁
Still, it’s a great effort, read more here: http://article.gmane.org/gmane.comp.search.xapian.general/2673
Pingback: David Levy (( Creativity Matters » Blog Archive » another Xapian PHP5 Wrapper