Freelance client, Model One in PHP

<?php
/*

  • Freelance Client - Model 1
  • Uses REQ socket to query one or more services

*

  • Author: Rob Gagnon <rgagnon24(at)gmail(dot)com>

*/

$request_timeout = 1000; // ms
$max_retries = 3; # Before we abandon

/**

  • @param ZMQContext $ctx
  • @param string $endpoint
  • @param string $request

*/
function try_request($ctx, $endpoint, $request)
{
global $request_timeout;

printf("I: Trying echo service at %s…\n", $endpoint);
$client = $ctx->getSocket(ZMQ::SOCKET_REQ);
$client->connect($endpoint);
$client->send($request);

$poll = new ZMQPoll();
$poll->add($client, ZMQ::POLL_IN);
$readable = $writable = array();

$events = $poll->poll($readable, $writable, $request_timeout);
$reply = null;
foreach ($readable as $sock) {
if ($sock == $client) {
$reply = $client->recvMulti();
} else {
$reply = null;
}
}

$poll->remove($client);
$poll = null;
$client = null;

return $reply;
}

$context = new ZMQContext();
$request = 'Hello world';
$reply = null;

$cmd = array_shift($argv);
$endpoints = count($argv);
if ($endpoints == 0) {
printf("I: syntax: %s <endpoint> …\n", $cmd);
exit;
}

if ($endpoints == 1) {
// For one endpoint, we retry N times
$endpoint = $argv[0];
for ($retries = 0; $retries < $max_retries; $retries++) {
$reply = try_request($context, $endpoint, $request);
if (isset($reply)) {
break; // Success
}
printf("W: No response from %s, retrying\n", $endpoint);
}
} else {
// For multiple endpoints, try each at most once
foreach ($argv as $endpoint) {
$reply = try_request($context, $endpoint, $request);
if (isset($reply)) {
break; // Success
}
printf("W: No response from %s\n", $endpoint);
}
}

if (isset($reply)) {
print "Service is running OK\n";
}