workerman/http-client

विवरण

workerman/http-client एक असिंक्रोनस http क्लाइंट घटक है। सभी अनुरोध प्रतिक्रियाएँ असिंक्रोनस और अवरोध-मुक्त हैं, इसमें अंतर्निहित कनेक्शन पूल है, संदेश अनुरोध और प्रतिक्रियाएं PSR7 मानक के अनुरूप हैं।

स्थापना:

composer require workerman/http-client

उदाहरण:

get और post अनुरोध का उपयोग

use Workerman\Worker;

require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker();
$worker->onWorkerStart = function () {
    $http = new Workerman\Http\Client();

    $http->get('https://example.com/', function ($response) {
        var_dump($response->getStatusCode());
        echo $response->getBody();
    }, function ($exception) {
        echo $exception;
    });

    $http->post('https://example.com/', ['key1' => 'value1', 'key2' => 'value2'], function ($response) {
        var_dump($response->getStatusCode());
        echo $response->getBody();
    }, function ($exception) {
        echo $exception;
    });

    $http->request('https://example.com/', [
        'method' => 'POST',
        'version' => '1.1',
        'headers' => ['Connection' => 'keep-alive'],
        'data' => ['key1' => 'value1', 'key2' => 'value2'],
        'success' => function ($response) {
            echo $response->getBody();
        },
        'error' => function ($exception) {
            echo $exception;
        }
    ]);
};
Worker::runAll();

फ़ाइल अपलोड करना

<?php
use Workerman\Worker;

require_once 'vendor/autoload.php';

$worker = new Worker();
$worker->onWorkerStart = function () {
    $http = new Workerman\Http\Client();
    // फ़ाइल अपलोड करना
    $multipart = new \Workerman\Psr7\MultipartStream([
        [
            'name' => 'file',
            'contents' => fopen(__FILE__, 'r')
        ],
        [
            'name' => 'json',
            'contents' => json_encode(['a'=>1, 'b'=>2])
        ]
    ]);
    $boundary = $multipart->getBoundary();
    $http->request('http://127.0.0.1:8787', [
        'method' => 'POST',
        'version' => '1.1',
        'headers' => ['Connection' => 'keep-alive', 'Content-Type' => "multipart/form-data; boundary=$boundary"],
        'data' => $multipart,
        'success' => function ($response) {
            echo $response->getBody();
        },
        'error' => function ($exception) {
            echo $exception;
        }
    ]);
};

Worker::runAll();

प्रगति प्रवाहिक प्रतिक्रिया

<?php
require_once __DIR__ . '/vendor/autoload.php';

use Workerman\Connection\TcpConnection;
use Workerman\Http\Client;
use Workerman\Protocols\Http\Chunk;
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
use Workerman\Worker;

$worker = new Worker('http://0.0.0.0:1234');
$worker->onMessage = function (TcpConnection $connection, Request $request) {
    $http = new Client();
    $http->request('https://api.ai.com/v1/chat/completions', [
        'method' => 'POST',
        'data' => json_encode([
            'model' => 'gpt-3.5-turbo',
            'temperature' => 1,
            'stream' => true,
            'messages' => [['role' => 'user', 'content' => 'hello']],
        ]),
        'headers' => [
            'Content-Type' => 'application/json',
            'Authorization' => 'Bearer sk-xxx',
        ],
        'progress' => function($buffer) use ($connection) {
            $connection->send(new Chunk($buffer));
        },
        'success' => function($response) use ($connection) {
            $connection->send(new Chunk('')); // खाली chunk भेजें जिससे प्रतिक्रिया समाप्त होती है
        },
    ]);
    $connection->send(new Response(200, [
        //"Content-Type" => "application/octet-stream",
        "Transfer-Encoding" => "chunked",
    ], ''));
};
Worker::runAll();

विकल्प

<?php
require __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
$worker = new Worker();
$worker->onWorkerStart = function(){
    $options = [
        'max_conn_per_addr' => 128, // प्रत्येक डोमेन पर अधिकतम कितने समवर्ती कनेक्शन बनाए रखें
        'keepalive_timeout' => 15,  // कितने समय तक कनेक्शन निष्क्रिय रहने पर बंद कर दिया जाए
        'connect_timeout'   => 30,  // कनेक्शन टाइमआउट समय
        'timeout'           => 30,  // अनुरोध भेजने के बाद प्रतिक्रिया की प्रतीक्षा का टाइमआउट समय
    ];
    $http = new Workerman\Http\Client($options);

    $http->get('http://example.com/', function($response){
        var_dump($response->getStatusCode());
        echo $response->getBody();
    }, function($exception){
        echo $exception;
    });
};
Worker::runAll();

कोरॉउटीन उपयोग

ध्यान दें
कोरॉउटीन उपयोग के लिए workerman>=5.1, http-client>=3.0 की आवश्यकता होती है, swoole या swow एक्सटेंशन स्थापित करें, या composer require revolt/event-loop स्थापित करें ताकि Fiber ड्राइवर का समर्थन किया जा सके

use Workerman\Worker;

require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker();
$worker->eventLoop = \Workerman\Events\Swoole::class; // या \Workerman\Events\Swow::class या \Workerman\Events\Fiber::class
$worker->onWorkerStart = function () {
    $http = new Workerman\Http\Client();

    $response = $http->get('https://example.com/');
    var_dump($response->getStatusCode());
    echo $response->getBody();

    $response = $http->post('https://example.com/', ['key1' => 'value1', 'key2' => 'value2']);
    var_dump($response->getStatusCode());
    echo $response->getBody();

    $response = $http->request('https://example.com/', [
        'method' => 'POST',
        'version' => '1.1',
        'headers' => ['Connection' => 'keep-alive'],
        'data' => ['key1' => 'value1', 'key2' => 'value2'],
    ]);
    echo $response->getBody();
};
Worker::runAll();

जब कोल्बैक फ़ंक्शन सेट नहीं किया जाता है, तो ग्राहक समवर्ती अनुरोध परिणाम को समन्वयित तरीके से लौटाता है, अनुरोध प्रक्रिया वर्तमान प्रक्रिया को अवरोधित नहीं करती है, यानी समवर्ती रूप से अनुरोधों को संसाधित किया जा सकता है।

ध्यान दें:

  1. परियोजना को पहले require __DIR__ . '/vendor/autoload.php'; लोड करना चाहिए।

  2. सभी असिंक्रोनस कोड केवल workerman के शुरू होने के बाद के कार्यक्षेत्र में चल सकते हैं

  3. workerman पर आधारित सभी परियोजनाओं का समर्थन करें, जिसमें Webman, GatewayWorker, PHPSocket.io आदि शामिल हैं

  4. क्लाइंट ऑब्जेक्ट को पुन: उपयोग में लाना बेहतर है, इससे कनेक्शन पूल का पूर्ण उपयोग हो सकेगा और प्रदर्शन में सुधार होगा, हर बार new Workerman\Http\Client() को पुनः बनाने से बचें।

webman में उपयोग

यदि आपको webman में असिंक्रोनस http अनुरोध का उपयोग करना है और परिणाम को सामने भेजना है, तो निम्नलिखित उपयोग देखें

<?php
namespace app\controller;

use support\Request;
use support\Response;
use Workerman\Protocols\Http\Chunk;

class IndexController
{
    public function index(Request $request)
    {
        // client ऑब्जेक्ट को पुन: उपयोग में लाना, प्रदर्शन को काफी बढ़ा सकता है
        static $http;
        $connection = $request->connection;
        $http = $http ?: new \Workerman\Http\Client();
        $http->get('https://example.com/', function ($response) use ($connection) {
            $connection->send(new Chunk($response->getBody()));
            $connection->send(new Chunk('')); // खाली chunk भेजें जिससे प्रतिक्रिया समाप्त होती है
        });
        return response()->withHeaders([
            "Transfer-Encoding" => "chunked",
        ]);
    }
}

उपरोक्त उपयोग पहले ग्राहक को एक chunked http हैडर के साथ वापस लौटाता है, और फिर डेटा को chunk के रूप में ग्राहक तक पहुँचाता है, निश्चित रूप से आप ऊपर दिए गए कोरॉउटीन उपयोग को भी देख सकते हैं।

ध्यान दें
ऊपर दिए गए कोड में client ऑब्जेक्ट को पुनः उपयोग करने के लिए इसे विधि क्षेत्र की स्थिर चर में संग्रहीत किया गया है, वास्तव में इसे कक्षा की स्थिर सदस्य में या वैश्विक ऑब्जेक्ट में भी संग्रहीत किया जा सकता है।

webman में OpenAI इंटरफेस के लिए अनुरोध करना और प्रवाही प्रतिक्रिया प्राप्त करना

संदर्भ: https://www.workerman.net/plugin/157