kdn/attempts-counter

An abstract counter of attempts to perform some actions.

1.0.1 2022-06-11 13:59 UTC

This package is auto-updated.

Last update: 2024-05-07 17:41:09 UTC


README

An abstract PHP counter of attempts to perform some actions.

License Latest Stable Version Code Coverage Scrutinizer Code Quality Code Climate

Requirements

  • PHP 5.4 or later or HHVM 3.

Installation

The preferred way to install this package is through Composer.

To install, either run

php composer.phar require kdn/attempts-counter "*"

or add

"kdn/attempts-counter": "*"

to the require section of your composer.json file.

Usage

Repeat the retrieving of URL content in case of network problems:

<?php

use kdn\attemptsCounter\Action;

$contents = false;
$action = new Action('query-url', 10, 3 * 10 ** 9); // up to 10 attempts, 3 seconds delay between attempts
while ($contents === false) {
    $contents = @file_get_contents('https://unreliable.site');
    $action->increment();
}
var_dump($contents);

A more sophisticated example illustrating failures for various reasons, the maximum number of attempts and the delay between attempts can be configured separately:

<?php

use kdn\attemptsCounter\Action;
use kdn\attemptsCounter\AttemptsCounter;

function generateId() {
    return mt_rand(0, 30);
}

$ids = [];
$counter = new AttemptsCounter();
$counter->addAction(new Action('generate-unique', 5))
    ->addAction(new Action('generate-odd', 10));
while (count($ids) < 10) {
    $id = generateId();
    if ($id % 2 === 0) {
        $counter->getAction('generate-odd')->increment();
        continue;
    }
    if (in_array($id, $ids, true)) {
        $counter->getAction('generate-unique')->increment();
        continue;
    }
    $ids[] = $id;
}
var_dump($ids);

For further details, please see the documentation for the public methods in the Action and AttemptsCounter classes.

Testing

Make sure you installed all Composer dependencies (run composer update in the base directory of repository). Run PHPUnit in the base directory of repository:

./vendor/bin/phpunit

Testing using Docker

Requirements

Up and running

  1. Provide credentials for Composer:

    cp auth.json.example \
        auth.json

    I suggest to set GitHub OAuth token (also known as personal access token) in auth.json, however if you have doubts about security, or you are lazy to generate token then you can replace content of auth.json on {}, in most cases this will work.

  2. Build images for services:

    docker buildx bake --load --pull

    or

    docker buildx bake --load --pull --no-cache --progress plain

    see docker buildx bake --help for details.

  3. Start service in background mode:

    docker-compose up --detach 8.1

    This command will start the service with PHP 8.1. Also allowed 7.4 and 5.6, see services defined in docker-compose.yml.

  4. Execute tests in the running container:

    docker-compose exec 8.1 ./vendor/bin/phpunit

    Alternatively you can start a shell in the running container and execute tests from it:

    docker-compose exec 8.1 bash
    $ ./vendor/bin/phpunit
  5. Stop and remove containers created by up:

    docker-compose down

    You may want to remove volumes along with containers:

    docker-compose down --volumes

Backward compatibility promise

attempts-counter is using Semver. This means that versions are tagged with MAJOR.MINOR.PATCH. Only a new major version will be allowed to break backward compatibility (BC).

PHP 8 introduced named arguments, which increased the cost and reduces flexibility for package maintainers. The names of the arguments for methods in attempts-counter is not included in our BC promise.