Package for making Search/Retrieve via URL requests and parse the responses

v0.6.3 2017-08-01 08:50 UTC


Build Status Coverage Code Quality SensioLabsInsight Latest Stable Version Total Downloads


Simple PHP package for making Search/Retrieve via URL (SRU) requests, using the Guzzle HTTP client and returning QuiteSimpleXMLElement instances. Includes an iterator to easily iterate over search results, abstracting away the process of making multiple requests.

If you prefer a simple text response, you might have a look at the php-sru-search package.

Install using Composer

Make sure you have Composer installed, then run

composer require scriptotek/sru-client

in your project directory to get the latest stable version of the package.

You also need a HTTP library. If you're not already using one in your project, just add Guzzle:

composer require php-http/guzzle6-adapter

HTTPlug discovery is used in order to not depend on a specific library.

Configuring the client

use Scriptotek\Sru\Client as SruClient;

$sru = new SruClient('', [
    'schema' => 'marcxml',
    'version' => '1.2',
    'user-agent' => 'MyTool/0.1',

Search and retrieve

To get all the records matching a given CQL query:

$records = $sru->all('alma.title="Hello world"');
foreach ($records as $record) {
	echo "Got record " . $record->position . " of " . $records->numberOfRecords() . "\n";
	// processRecord($record->data);

where $record is an instance of Record and $record->data is an instance of QuiteSimpleXMLElement.

The all() method takes care of continuation for you under the hood for you; the Records generator continues to fetch records until the result set is depleted. A default batch size of 10 is used, but you can give any number supported by the server as a second argument to the all() method.

If you query for some identifier, you can use the convenience method first():

$record = $sru->first('alma.isbn="0415919118"');

The result is a Record object, or null if not found.

Use explain to get information about servers

$urls = array(

foreach ($urls as $url) {

    $sru = new SruClient($url, [
        'version' => '1.1',
        'user-agent' => 'MyTool/0.1'

    try {
        $response = $sru->explain();
    } catch (\Scriptotek\Sru\Exceptions\SruErrorException $e)
        print 'ERROR: ' . $e->getMessage() . "\n";

    printf("Host: %s:%d\n", $response->host, $response->port);
    printf("  Database: %s\n", $response->database->identifier);
    printf("  %s\n", $response->database->title);
    printf("  %s\n", $response->database->description);
    print "  Indexes:\n";
    foreach ($response->indexes as $idx) {
        printf("   - %s: %s\n", $idx->title, implode(' / ', $idx->maps));


API documentation

API documentation can be generated using e.g. Sami, which is included in the dev requirements of composer.json.

php vendor/bin/sami.php update sami.config.php -v

You can view it at

Laravel 5 integration

Add the service provider to the 'providers' array in config/app.php:


Optionally, add the facade to the 'aliases' array in the same file:

'SruClient'      => Scriptotek\Sru\Facades\SruClient::class,

To create the configuration file config/sru.php:

$ php artisan vendor:publish --provider="Scriptotek\Sru\Providers\SruServiceProvider"