Heim  >  Artikel  >  Backend-Entwicklung  >  Verwendung des PHP-Netzwerkanforderungs-Plug-ins Guzzle

Verwendung des PHP-Netzwerkanforderungs-Plug-ins Guzzle

Guanhui
Guanhuinach vorne
2020-05-01 09:40:575860Durchsuche

Beim Schreiben von Hintergrundcode ist es unvermeidlich, mit anderen Schnittstellen von Drittanbietern zu interagieren, z. B. beim Senden von Vorlagennachrichten an Dienstkonten. Manchmal müssen möglicherweise mehr als 100.000 Nachrichten gesendet werden. Zu diesem Zeitpunkt müssen Sie die Verwendung asynchroner und „multithreadiger“ Netzwerkanforderungen in Betracht ziehen.

Heute empfehle ich PHP-Ingenieuren ein Guzzle-Plug-in.

Guzzle

Guzzle ist ein PHP-HTTP-Client, der zum einfachen Senden von Anfragen und zur Integration in unsere WEB-Dienste verwendet wird.

Einfache Schnittstelle: Erstellen Sie Abfrageanweisungen, POST-Anfragen, teilen Sie den Upload und Download großer Dateien auf, verwenden Sie HTTP-Cookies, laden Sie JSON-Daten hoch usw.

Senden Sie synchrone oder asynchrone Anfragen über dieselbe Schnittstelle.

Verwenden Sie die PSR-7-Schnittstelle zum Anfordern, Antworten und Auslagern, sodass Sie andere kompatible PSR-7-Klassenbibliotheken verwenden können, um gemeinsam mit Guzzle zu entwickeln.

Abstrahiert den zugrunde liegenden HTTP-Transport und ermöglicht es Ihnen, die Umgebung und anderen Code zu ändern, z. B. keine starke Abhängigkeit von cURL- und PHP-Streams oder -Sockets, nicht blockierende Ereignisschleife.

Mit Middleware-Systemen können Sie clientseitige Verhaltensweisen erstellen.

Guzzle installieren

In diesem Artikel wird das Laravel-Projekt kombiniert, um die grundlegende Verwendung von Guzzle vorzustellen. Daher ist die Verwendung von Composer zur Installation von Guzzle perfekt und wird auch auf der offiziellen Website von Guzzle empfohlen Mit Composer installieren.

composer require guzzlehttp/guzzle:~6.0
// 或者
php composer.phar require guzzlehttp/guzzle:~6.0

Senden Sie eine einfache POST-Anfrage

Greifen Sie auf Schnittstellen von Drittanbietern zu, bei denen es sich im Grunde um POST-Anfragen handelt. Wenn Sie ein einfaches intelligentes Chat-Tool erstellen möchten, können Sie die Turing Robot API verwenden, um eine POST-Anfrage zu senden, um den automatischen Antwortinhalt zu erhalten:

<?php
namespace App\Http\Controllers;
use GuzzleHttp\Client;
use Illuminate\Http\Request;
class GuzzleUseController extends Controller {
    public function tuling(Request $request) {
        $params = [
            &#39;key&#39; => &#39;*****&#39;,
            &#39;userid&#39; => &#39;yemeishu&#39;
        ];
        $params[&#39;info&#39;] = $request->input(&#39;info&#39;, &#39;你好吗&#39;);
        $client = new Client();
        $options = json_encode($params, JSON_UNESCAPED_UNICODE);
        $data = [
            &#39;body&#39; => $options,
            &#39;headers&#39; => [&#39;content-type&#39; => &#39;application/json&#39;]
        ];
        // 发送 post 请求
        $response = $client->post(&#39;http://www.tuling123.com/openapi/api&#39;, $data);
        $callback = json_decode($response->getBody()->getContents());
        return $this->output_json(&#39;200&#39;, &#39;测试图灵机器人返回结果&#39;, $callback);
    }
}

Guzzle-Client->Post-Funktion ist immer noch sehr einfach. Ja, Sie müssen nur auf die Schnittstelle zugreifen und Parameter anfordern. Zu den Parametern gehören hauptsächlich: Text, Header, Abfrage usw. Weitere Informationen finden Sie unter

http://guzzle -cn.readthedocs.io/zh_CN /latest/quickstart.html#id8

Im Test:

Verwendung des PHP-Netzwerkanforderungs-Plug-ins Guzzle

Verwendung des PHP-Netzwerkanforderungs-Plug-ins Guzzle

Hinweis: Der Turing-Roboter ist immer noch sehr intelligent. Er kann den Kontext anhand derselben Benutzer-ID identifizieren und einen intelligenten Chat ermöglichen.

Senden Sie eine asynchrone POST-Anfrage

Bei der PHP-Entwicklung handelt es sich hauptsächlich um eine „prozessorientierte“ Entwicklungsmethode, bei der Anforderung jedoch um eine Schnittstelle eines Drittanbieters Manchmal muss nicht gewartet werden, bis die Schnittstelle des Drittanbieters Ergebnisse zurückgibt, bevor die Ausführung fortgesetzt wird. Wenn der Kauf des Benutzers beispielsweise erfolgreich ist, müssen wir eine Postanforderung an die SMS-Schnittstelle senden, und die SMS-Plattform sendet eine Textnachricht an den Benutzer, um ihn darüber zu informieren, dass die Zahlung erfolgreich war. Dies ist eine Art „Erinnerung“. Nachricht“ ist eine „zusätzliche Zusatzfunktion“ und wird nicht benötigt. „Wissen“, ob die Erinnerung erfolgreich versendet wurde, wenn der Benutzer bezahlt.

Zu diesem Zeitpunkt können Sie die asynchrone Anforderungsfunktion von Guzzle verwenden und sich den Code direkt ansehen:

public function sms(Request $request) {
    $code = $request->input(&#39;code&#39;);
    $client = new Client();
    $sid = &#39;9815b4a2bb6d5******8bdb1828644f2&#39;;
    $time = &#39;20171029173312&#39;;
    $token = &#39;af8728c8bc*******12019c680df4b11c&#39;;

    $sig =  strtoupper(md5($sid.$token.$time));

    $auth = trim(base64_encode($sid . ":" . $time));

    $params = [&#39;templateSMS&#39; => [
            &#39;appId&#39; => &#39;12b43**********0091c73c0ab&#39;,
            &#39;param&#39; => "coding01,$code,30",
            &#39;templateId&#39; => &#39;3***3&#39;,
            &#39;to&#39; => &#39;17689974321&#39;
        ]
    ];
    $options = json_encode($params, JSON_UNESCAPED_UNICODE);
    $data = [
        &#39;query&#39; => [
            &#39;sig&#39; => $sig
        ],
        &#39;body&#39; => $options,
        &#39;headers&#39; => [
            &#39;content-type&#39; => &#39;application/json&#39;,
            &#39;Authorization&#39; => $auth
        ]
    ];

    // 发送 post 请求
    $promise = $client->requestAsync(&#39;POST&#39;, &#39;https://api.ucpaas.com/2014-06-30/Accounts/9815b4a2bb6d5******8bdb1828644f2/Messages/templateSMS&#39;, $data);

    $promise->then(
        function (ResponseInterface $res) {
            Log::info(&#39;---&#39;);
            Log::info($res->getStatusCode() . "\n");
            Log::info($res->getBody()->getContents() . "\n");
        },
        function (RequestException $e) {
            Log::info(&#39;-__-&#39;);
            Log::info($e->getMessage() . "\n");
        }
    );
    $promise->wait();

    return $this->output_json(&#39;200&#39;, &#39;测试短信 api&#39;, []);
}

Zuerst die Schnittstellendaten zurückgeben:

Verwendung des PHP-Netzwerkanforderungs-Plug-ins Guzzle

Dann geben Sie das Protokoll aus:

[2017-10-29 09:53:14] local.INFO: ---  
[2017-10-29 09:53:14] local.INFO: 200
  
[2017-10-29 09:53:14] local.INFO: {"resp":{"respCode":"000000","templateSMS":{"createDate":"20171029175314","smsId":"24a93f323c9*****8608568"}}}

Die letzte empfangene SMS-Nachricht:

Verwendung des PHP-Netzwerkanforderungs-Plug-ins Guzzle

Multithread-asynchrone POST-Anfrage senden

「Das Senden einer „Multithread-asynchronen POST-Anfrage“ wird in vielen Fällen verwendet. Zum Beispiel: Double Eleven ist bald verfügbar. Sie können einige Aktivitäten durchführen, um alten Benutzern etwas zurückzugeben Benutzer können den Benutzern mitteilen, an welchen Aktivitäten sie teilnehmen sollen. Zu diesem Zeitpunkt müssen Sie die offizielle WeChat-Kontoschnittstelle für asynchrone Multithread-Anfragen verwenden.

Gehen Sie direkt zum Code:

public function send($templateid, $openid, $url, $data) {
        $client = $this->bnotice->getHttp()->getClient();

        $requests = function ($open_ids) use ($templateid, $url, $data) {
            foreach($open_ids as $v){
                try {
                    yield $this->bnotice
                        ->template($templateid)
                        ->to($v)
                        ->url($url)
                        ->data($data)
                        ->request();
                } catch(Exception $e) {
                    Log::error(&#39;sendtemplate:&#39;.$e->getMessage());
                }
            }
        };

        $pool = new Pool($client, $requests($openid), [
            &#39;concurrency&#39; => 16,
            &#39;fulfilled&#39; => function ($response, $index) {
            },
            &#39;rejected&#39; => function ($reason, $index) {
            },
        ]);

        $promise = $pool->promise();

        $promise->wait();
    }

Die Anforderungsmethode:

public function request($data = [])
    {
        $params = array_merge([
            &#39;touser&#39; => &#39;&#39;,
            &#39;template_id&#39; => &#39;&#39;,
            &#39;url&#39; => &#39;&#39;,
            &#39;topcolor&#39; => &#39;&#39;,
            &#39;miniprogram&#39; => [],
            &#39;data&#39; => [],
        ], $data);
        
        $required = [&#39;touser&#39;, &#39;template_id&#39;];

        foreach ($params as $key => $value) {
            if (in_array($key, $required, true) && empty($value) && empty($this->message[$key])) {
                throw new InvalidArgumentException("Attribute &#39;$key&#39; can not be empty!");
            }

            $params[$key] = empty($value) ? $this->message[$key] : $value;
        }

        $params[&#39;data&#39;] = $this->formatData($params[&#39;data&#39;]);

        $this->message = $this->messageBackup;

        $options = json_encode ( $params,  JSON_UNESCAPED_UNICODE);
        $data = [
            &#39;query&#39; => [
                &#39;access_token&#39; => $this->getAccessToken()->getToken()
            ],
            &#39;body&#39; => $options,
            &#39;headers&#39; => [&#39;content-type&#39; => &#39;application/json&#39;]
        ];
        return function() use ($data) {
            return $this->getHttp()->getClient()->requestAsync(&#39;POST&#39;, $this::API_SEND_NOTICE, $data);
        };
    }

Verbrauchen Sie die asynchrone Multithread-Anforderungsprototypfunktion mit dem GuzzleHttpPool-Objekt

use GuzzleHttp\Pool;use GuzzleHttp\Client;use GuzzleHttp\Psr7\Request;$client = new Client();$requests = function ($total) {
    $uri = &#39;http://127.0.0.1:8126/guzzle-server/perf&#39;;
    for ($i = 0; $i < $total; $i++) {
        yield new Request(&#39;GET&#39;, $uri);
    }};$pool = new Pool($client, $requests(100), [
    &#39;concurrency&#39; => 5,
    &#39;fulfilled&#39; => function ($response, $index) {
        // this is delivered each successful response
    },
    &#39;rejected&#39; => function ($reason, $index) {
        // this is delivered each failed request
    },]);// Initiate the transfers and create a promise$promise = $pool->promise();// Force the pool of requests to complete.$promise->wait();

Zusammenfassung

Mit Guzzle ist es für uns sehr praktisch, Schnittstellen von Drittanbietern gleichzeitig und asynchron anzufordern. Wenn es die Zeit erlaubt, können wir einen Blick auf den Guzzle-Quellcode werfen, um zu sehen, wie er implementiert ist.

Empfohlenes Tutorial: „PHP-Tutorial

Das obige ist der detaillierte Inhalt vonVerwendung des PHP-Netzwerkanforderungs-Plug-ins Guzzle. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:jianshu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen