Hazelcast PHP Client Part I
Wolfram Hüsken recently published a blog post entitled, “Hazelcast PHP Client Part I”. In the post, Wolfram begins the adventure of building a PHP Client for Hazelcast. Be sure to follow along—the ride promises to be interesting and informative.
PHP and datatypes is like building a watch with a sledgehammer
While the cool kids talk about double precision 64-bit floating point or 32-bit unsigned integers, PHP’s only word is “numberish”…
$x = "234g"; echo ++$x . PHP_EOL; echo $x += 5 . PHP_EOL;
234h? Seriously? So this implementation will be quite a challenge.
Enough complaining, let’s try something cool
I have to use pack() to create a binary string with all the different datatypes. I started implementing a message class, which holds the variables to build the header, the child classes, e.g. Authentication should only store the values needed for authentication.
As I’m really lazy, I want to automate the string building as far as possible. So I will have a Serializer class, which can build the string for every <? extends Message> by itself.
By using an annotation and reflection, I can query the docblocks of the private properties of the class.
That’s how my class looks like:
class AuthenticationRequest extends Message
{
/**
* @var string
* @type string
*/
private $username;
/**
* @var string
* @type string
*/
private $password;
/**
* @var string
* @type string
*/
private $uuid;
/**
* @var string
* @type string
*/
private $ownerUuid;
/**
* @var bool
* @type boolean
*/
private $isOwnerConnection;
/**
* @var string
* @type string
*/
private $clientType;
/**
* @var int
* @type uint8
*/
private $serializationVersion;
}
And this script will extract the datatypes:
$refl = new ReflectionClass('HazelcastMessageGenericAuthenticationRequest');
$props = $refl->getProperties(ReflectionProperty::IS_PRIVATE);
$map = [];
/** @var ReflectionProperty $prop */
foreach ($props as $prop) {
$docBlock = $prop->getDocComment();
$matches = [];
preg_match('/@types+(w+)/m', $docBlock, $matches);
if (!empty($matches[1])) {
$map[$prop->getName()] = $matches[1];
}
}
print_r($map);
Here the result:
Array
(
[username] => string
[password] => string
[uuid] => string
[ownerUuid] => string
[isOwnerConnection] => boolean
[clientType] => string
[serializationVersion] => uint8
)
Usually these values don’t change, so they should be cached. A Memcached / Redis / File / Whatever adapter can be configured in the client config.
I hope to publish some working code as soon as possible, maybe I find some fellow devs who want to join me or report bugs…