My 2020 in books

In June I decided to challenge myself to read at least ten books by the end of the year. I surpassed that goal by reading eleven books and I just started reading the twelfth (but I am sure I won’t finish it by the end of the year). Here is the list of books I liked the most (and that I recommend) with some considerations.

I read most of my books in English, but sometimes I like to enjoy reading in my native language. This list features only books that are either only or available in English.

(more…)

Common database paradigms

From the simplest to the more advanced, here is a list of different database paradigms with an introduction and some use cases for each one.

Use this index if you want to navigate directly to a specific one.

  1. Key-value
  2. Wide column
  3. Document
  4. Relational
  5. Graph
  6. Search
(more…)

Making concurrent HTTP requests in PHP

This is part of a new series of articles aimed at giving instant responses to common questions. Find out more.


All the snippets make 10 requests to a fake API that takes 3 seconds to reply.

On my computer, multiple executions of these scripts ran in a little more than 3 seconds.

You can configure how many simultaneous connections to make in each client.

Using Symfony’s HTTPClient

Installation

$ composer require symfony/http-client

Example

$client = new \Symfony\Component\HttpClient\CurlHttpClient([], 10);
$responses = [];

for ($i = 0; $i < 10; ++$i) {
    $responses[] = $client->request('GET', 'http://slowwly.robertomurray.co.uk/delay/3000/url/https://jsonplaceholder.typicode.com/todos/1');
}

foreach ($responses as $response) {
    $content = $response->getContent();
}

Using Guzzle

Installation

$ composer require guzzlehttp/guzzle:^7.0

Example

$client = new \GuzzleHttp\Client();
$responses = [];

$generator = function ($total) use ($client) {
    for ($i = 0; $i < $total; $i++) {
        yield function() use ($client) {
            return $client->getAsync('http://slowwly.robertomurray.co.uk/delay/3000/url/https://jsonplaceholder.typicode.com/todos/1');
        };
    }
};

$pool = new \GuzzleHttp\Pool($client, $generator(10), [
    'concurrency' => 10,
    'fulfilled' => function (\GuzzleHttp\Psr7\Response $response, $index) use (&$responses) {
        $responses[$index] = $response->getBody()->getContents();
    },
]);

$promise = $pool->promise();

$promise->wait();

Any comments? Send me a tweet. 🐸