useless-stuff
2/18/2016 - 2:47 PM

PHP - InfiniteIterator

PHP - InfiniteIterator

<?php
// Use InfititeIterator for traversing a circular data structure
// https://en.wikipedia.org/wiki/Circular_buffer
/**
 * Interface AvailabilityService
 */
interface AvailabilityService
{

    /**
     * @param Service $site
     * @return mixed
     */
    public function checkAvailability(\Service $site);
}

/**
 * Interface IHttpAdapter
 */
interface IHttpAdapter
{

    /**
     * @param $url
     * @return mixed
     */
    public function get($url);

    /**
     * @param $url
     * @param $data
     * @return mixed
     */
    public function post($url, $data);

    /**
     * @param $url
     * @param $data
     * @return mixed
     */
    public function put($url, $data);

    /**
     * @param $url
     * @return mixed
     */
    public function delete($url);

    /**
     * @return mixed
     */
    public function getCallInfo();
}

/**
 * Class HttpAdapterCurl
 */
class HttpAdapterCurl implements IHttpAdapter
{

    protected $info;

    /**
     * @param $url
     * @return mixed
     */
    public function get($url)
    {

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $this->response = curl_exec($ch);
        $this->info = curl_getinfo($ch);
        curl_close($ch);

        return $this->getResponse();
    }

    /**
     * @return mixed
     */
    protected function getResponse()
    {

        return $this->response;
    }

    /**
     * @return mixed
     */
    protected function getInfo()
    {

        return $this->info;
    }

    public function post($url, $data)
    {
        // TODO: Implement post() method.
    }

    public function put($url, $data)
    {
        // TODO: Implement put() method.
    }

    public function delete($url)
    {
        // TODO: Implement delete() method.
    }

    /**
     * @return mixed
     */
    public function getCallInfo()
    {

        return $this->getInfo();
    }
}

/**
 * Class HttpClient
 */
abstract class HttpClient
{

    protected $adapter;

    /**
     * HttpClient constructor.
     * @param IHttpAdapter $adapter
     */
    public function __construct(\IHttpAdapter $adapter)
    {

        $this->adapter = $adapter;
    }

    /**
     * @param $url
     * @return mixed
     */
    protected function get($url)
    {

        /** @var */
        return $this->adapter->get($url);
    }
}

/**
 * Class SiteCheckerException
 */
class SiteCheckerException extends \Exception
{

    protected $message = 'The site was down';

}


/**
 * Class SiteChecker
 */
class ServiceMonitor extends HttpClient implements AvailabilityService
{

    public function checkAvailability(\Service $site)
    {

        $this->get($site->getUrl());
        if ($this->adapter->getCallInfo()['http_code'] === 200) {
            return true;
        }

        return false;
    }

}

/**
 * Class Site
 */
class Service
{

    protected $url;

    public function __construct($url)
    {

        $this->url = $url;
    }

    /**
     * @return mixed
     */
    public function getUrl()
    {

        return $this->url;
    }

    /**
     * @param mixed $url
     */
    public function setUrl($url)
    {

        $this->url = $url;
    }


}

$servicesCollection = new ArrayIterator();
$servicesCollection->append(new Service('http://diego.anniballo.com/testwrong.php'));
$servicesCollection->append(new Service('http://diego.anniballo.com/testwrong.php'));
$servicesCollection->append(new Service('http://diego.anniballo.com'));

$serviceMonitor = new ServiceMonitor(new HttpAdapterCurl());
$servicesLoop = new InfiniteIterator($servicesCollection);
foreach ($servicesLoop as $service) {
    /** @var Service $service */
    if ($serviceMonitor->checkAvailability($service)) {
        echo 'Service '.$service->getUrl().'is ready';
        break;
    }
    echo 'Service '.$service->getUrl().'is not ready yet';
}