التعاون

التعاون هو آلية تعاونية على مستوى المستخدم أخف وزناً من الخيوط ، مما يتيح جدولة مهام متعددة في العملية. إنه يحقق التبديل بين التعاون من خلال التحكم اليدوي في التعليق والاستئناف ، مما يتجنب تكلفة تبديل سياق العملية.
يوفر 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% مقارنةً بإدخال الإدخال / الإخراج المحظور.