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('')); // إرسال جزء فارغ يشير إلى نهاية الاستجابة
},
]);
$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();
عند عدم تعيين دالة رد الاتصال، سيقوم العميل بإرجاع نتيجة الطلب غير المتزامن بطريقة متزامنة، مما يعني أن عملية الطلب لن تعيق العملية الحالية، مما يسمح بمعالجة الطلبات بشكل متزامن.
ملاحظات:
-
يجب تحميل مشروع
require __DIR__ . '/vendor/autoload.php';في البداية -
يمكن تشغيل جميع الأكواد غير المتزامنة فقط في بيئة التشغيل بعد بدء workerman
-
يدعم جميع المشاريع المطورة على أساس workerman، بما في ذلك Webman و GatewayWorker و PHPSocket.io وغيرها
-
يُفضل الاحتفاظ بكائن العميل لإعادة استخدامه، مما يمكن أن يعزز الأداء من خلال الاستفادة من حوض الاتصال، وعدم إنشاء كائن جديد في كل مرة
new Workerman\Http\Client().
استخدام في webman
إذا كنت بحاجة إلى استخدام طلبات http غير المتزامنة في webman وإرجاع النتيجة للواجهة الأمامية، يرجى الرجوع إلى الاستخدام التالي
<?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('')); // إرسال جزء فارغ للدلالة على انتهاء الاستجابة
});
return response()->withHeaders([
"Transfer-Encoding" => "chunked",
]);
}
}
النموذج أعلاه يقوم أولاً بإرجاع رأس HTTP مع chunked للعميل، ثم يرسل البيانات بشكل جزئي، بالطبع يمكن أيضًا الرجوع إلى الاستخدام أعلاه باستخدام طريقة التزامن.
ملاحظة
تم تخزين الكود أعلاه في المتغير الثابت الذي يحتفظ بكائن العميل لإعادة استخدامه، ويمكن أيضًا تخزينه في عضو ثابت من الصف أو داخل كائن عالمي.
طلب واجهة OpenAI في webman والإرجاع التدريجي
يرجى الرجوع إلى https://www.workerman.net/plugin/157