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();

progress প্রবাহিত উত্তর

<?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 ইনস্টল করতে হবে অধিনায়ক চালকের জন্য।

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)
    {
        // ক্লায়েন্ট অবজেক্ট সংরক্ষণ করে পুনরায় ব্যবহার করুন, এটি দক্ষতা অনেক বাড়িয়ে দিতে পারে
        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 হিসাবে ক্লায়েন্টের কাছে পাঠানো হয়, অবশ্যই উপরের ব্যবহারটি কোঅর্ডিনেশন ব্যবহার করতে পারেন।

মনোযোগ
উপরের কোডটি ক্লায়েন্ট অবজেক্ট পুনরায় ব্যবহার করার জন্য পদ্ধতির ক্ষেত্রের স্থায়ী ভেরিয়েবলে সংরক্ষণ করা হয়েছে, প্রকৃতপক্ষে এটিকে ক্লাসের স্থায়ী সদস্য বা গ্লোবাল অবজেক্টেও সংরক্ষণ করতে পারেন।

webman এ OpenAI API তে অনুরোধ করে প্রবাহিত উত্তর ফেরত

রেফার করুন https://www.workerman.net/plugin/157