التعاون
التعاون هو آلية تعاونية على مستوى المستخدم أخف وزناً من الخيوط ، مما يتيح جدولة مهام متعددة في العملية. إنه يحقق التبديل بين التعاون من خلال التحكم اليدوي في التعليق والاستئناف ، مما يتجنب تكلفة تبديل سياق العملية.
يوفر workerman واجهة تعاون عامة تتوافق تلقائيًا مع محركات Swoole / Swow / Fiber.
تنبيه
هذه الميزة تتطلب workerman >= 5.1.0
ملاحظة
- التعاون يدعم فقط محركات
SwooleوSwowوFiber - إذا كنت تستخدم محرك
Fiber، يجب تثبيتcomposer require revolt/event-loop - يمكن لمحرك
SwooleأوSwowتحويل وظائف PHP المحظورة تلقائيًا إلى تعاون ، مما يحقق تنفيذ الشيفرة المتزامنة الأصلية بشكل غير متزامن - ولكن
Fiberلا يمكن أن يقوم بالتعاون تلقائيًا مثلSwooleوSwow، وعند مواجهة وظائف PHP المحظورة ، سيحظر العملية بأكملها ولن يحدث تبديل التعاون - عند استخدام محركات
SwooleوSwowوFiber، يقومworkermanتلقائيًا بإنشاء تعاون لتنفيذ كل مرة يعمل فيهاonWorkerStartوonMessageوonConnectوonCloseوما إلى ذلك - يمكنك استخدام
$worker->eventLoop=xxx;لتعيين محرك تعاون مختلف لعاملين مختلفين
<?php
use Workerman\Connection\TcpConnection;
use Workerman\Coroutine;
use Workerman\Events\Swoole;
use Workerman\Events\Fiber;
use Workerman\Protocols\Http\Request;
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
$worker1 = new Worker('http://0.0.0.0:8001');
$worker1->eventLoop = Swoole::class; // استخدام تعاون Swoole
$worker1->onMessage = function (TcpConnection $connection, Request $request) {
Coroutine::create(function () {
echo file_get_contents("http://www.example.com/event/notify");
});
$connection->send('ok');
};
$worker2 = new Worker('http://0.0.0.0:8001');
$worker2->eventLoop = Fiber::class; // استخدام التعاونات المدمجة Fiber
$worker2->onMessage = function (TcpConnection $connection, Request $request) {
Coroutine::create(function () {
echo file_get_contents("http://www.example.com/event/notify");
});
$connection->send('ok');
};
Worker::runAll();
واجهة التعاون المقدمة
interface CoroutineInterface
{
/**
* إنشاء التعاون وتشغيله فوراً
*/
public static function create(callable $callable, ...$data): CoroutineInterface;
/**
* بدء تشغيل التعاون
*/
public function start(mixed ...$args): mixed;
/**
* استئناف تشغيل التعاون
*/
public function resume(mixed ...$args): mixed;
/**
* الحصول على id التعاون
*/
public function id(): int;
/**
* تعيين الاستدعاء عند تدمير التعاون
*/
public static function defer(callable $callable): void;
/**
* تعليق التعاون الحالي
*/
public static function suspend(mixed $value = null): mixed;
/**
* الحصول على التعاون الحالي
*/
public static function getCurrent(): CoroutineInterface|Fiber|SwowCoroutine|static;
/**
* التحقق مما إذا كانت البيئة الحالية هي بيئة تعاون
*/
public static function isCoroutine(): bool;
}
حول التعاون
المزايا
أكبر فائدة من إدخال التعاون في PHP هي القدرة على كتابة الشيفات غير المتزامنة بطريقة متزامنة ، مما يتجنب الجحيم الاستدعائي ويحسن من قابلية قراءة الشيفرات وصيانتها.
يمكن أن تعزز التعاون بشكل كبير من مرونة الأعمال الكثيفة المدخلات / المخرجات ، حيث يمكن استخدام عدد أقل من العمليات لتوفير قدرة تحمل أكبر.
العيوب
ومع ذلك ، بعد إدخال التعاون ، يحتاج المطورون إلى مراقبة تلوث المتغيرات العالمية ، وتنافس الموارد ، وتأثير مكتبات الطرف الثالث باستمرار ، مما يزيد من تكلفة التطوير والصيانة ويزيد من العبء الذهني.
ينتج عن إدخال التعاون تكاليف إضافية تتعلق بإنشاء التعاون وتجدوله وتدميره وحمامات الاتصال.
من خلال بيانات اختبارات الضغط الكبيرة ، لوحظ أنه مع الاستفادة الكاملة من وحدة المعالجة المركزية ، فإن أداء المدى الأقصى بعد إدخال التعاون ينخفض بحوالي 10%-20% مقارنةً بإدخال الإدخال / الإخراج المحظور.