Асинхронные вызовы API из PHP-приложения с использованием Slim + Guzzle - PullRequest
0 голосов
/ 22 мая 2018

Я работаю над приложением php, используя Slim framework.Моя домашняя страница приложения выполняет около 20 вызовов API REST, что замедляет загрузку страницы.

Я читал, что могу использовать Http-клиенты, такие как Guzzle , для асинхронного вызова этих API, но я не смог найти ни одной статьи, которая рассказывает, как использовать Guzzle с Slim.

Может кто-нибудь сказать, как использовать Guzzle с Slim.

Или есть ли другое решение, которое может ускорить загрузку страницы?

NB: Я новичок вPHP

1 Ответ

0 голосов
/ 24 мая 2018

Чтобы использовать Guzzle с Slim, вам нужно

установить его, запустив composer

$ composer require guzzlehttp/guzzle:~6.0

Установка Guzzle Быстрый запуск Guzzle

Создайте регистрацию зависимостей, например,

<?php

use GuzzleHttp\Client;

$container = $app->getContainer();

$container['httpClient'] = function ($cntr) {
    return new Client();             
};

и поместите ее где-нибудь, где она будет выполняться, когда index.php будет загружен основной файл начальной загрузки.

Затем в своем коде вы можете получить экземпляр жрета из контейнера

$guzzle = $container->httpClient;

Например, если у вас следующий маршрут

$app->get('/example', App\Controllers\Example::class);

И контроллер Example, как следует

<?php
namespace App\Controllers;

use GuzzleHttp\ClientInterface;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;

class Example
{
    private $httpClient;

    public function __construct(ClientInterface $httpClient) 
    {
        $this->httpClient = $httpClient;
    }

    public function __invoke(Request $request, Response $response, array $args)
    {
        //call api, etc..etc
       $apiResponse = $this->httpClient->get('http://api.blabla.org/get');
       //do something with api response
       return $response;
    }
}

Чтобы внедрить экземпляр жрета в контроллер Example, вы создаете его регистрацию зависимостей

use App\Controllers\Example;

$container[Example::class] = function ($cntr) {
    return new Example($cntr->httpClient);
}

Чтобы ускорить загрузку вашей страницы, если вы являетесь разработчиком API, то начните с этого.Если вы не являетесь разработчиком API и не имеете никакого контроля, попробуйте подумать, сможете ли вы уменьшить количество вызовов API, удалив несущественные.Или, в крайнем случае, кешируйте ответ вызова API в хранилище, которое быстрее будет загружать ваше приложение позже.

Например, с помощью redis.Вы вычисляете хэш вызова URL API, включая его строку запроса, и используете хэш в качестве ключа для доступа к кешированному ответу вызова API.

...