Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الألياف (PHP 8.1)

جزء من قسم البرمجة كائنية التوجه في رحلة PHP على Coddy. الدرس 60 من 91.

Fibers هي ميزة في PHP 8.1 تتيح تنفيذ التعليمات البرمجية القابل للمقاطعة. بخلاف الدوال العادية التي تعمل من البداية إلى النهاية، يمكن لـ fiber إيقاف نفسه مؤقتًا أثناء التنفيذ واستئنافه لاحقًا، مع الحفاظ على حالته بين مرات الإيقاف المؤقت.

أنشئ fiber بتمرير callable إلى الصنف Fiber، ثم ابدأه باستخدام start():

<?php
$fiber = new Fiber(function(): void {
    echo "Step 1\n";
    Fiber::suspend();
    echo "Step 2\n";
});

$fiber->start();
echo "Between steps\n";
$fiber->resume();

المخرجات:

Step 1
Between steps
Step 2

يستمر الـ fiber في التنفيذ حتى يصل إلى Fiber::suspend()، ثم تعود السيطرة إلى الكود الرئيسي. يؤدي استدعاء resume() إلى متابعة التنفيذ من حيث توقّف.

يمكن لـ Fibers أيضًا تمرير قيم عند الإيقاف المؤقت والاستئناف:

<?php
$fiber = new Fiber(function(): string {
    $value = Fiber::suspend("paused");
    return "Received: $value";
});

$suspended = $fiber->start();
echo "$suspended\n";

$result = $fiber->resume("hello");
echo $result;

الخرج:

paused
Received: hello

تُعدّ Fibers الأساس لأطر عمل PHP غير المتزامنة. ومع أنك لن تستخدمها مباشرةً في معظم التطبيقات، فإن فهمها يساعدك عند العمل مع مكتبات غير متزامنة تتعامل مع العمليات المتزامنة، مثل طلبات HTTP أو استعلامات قاعدة البيانات، من دون حظر.

challenge icon

التحدي

سهل

لنَبْنِ مُجدوِل مهام يوضّح كيف يمكن للألياف إيقاف التنفيذ مؤقتًا واستئنافه أثناء تمرير البيانات بين الليف والشيفرة الرئيسية. ستنشئ نظامًا يمكن فيه مقاطعة المهام، مما يتيح تنفيذ عمل آخر في الأثناء.

ستنظّم شيفرتك عبر ملفين:

  • TaskRunner.php: أنشئ TaskRunner class يغلّف وظائف الليف لتشغيل المهام. يجب أن يقوم class بما يلي:
    • امتلاك خاصية private لتخزين مثيل من Fiber
    • قبول اسم مهمة (من النوع string) في الباني باستخدام ترقية معاملات الباني
    • امتلاك أسلوب createTask(callable $task) ينشئ Fiber جديدًا باستخدام callable المُعطى ويخزّنه
    • امتلاك أسلوب start() يبدأ الليف ويُرجع أي قيمة يعلّق الليف التنفيذ بها (أو قيمة الإرجاع النهائية)
    • امتلاك أسلوب continue(mixed $value) يستأنف الليف باستخدام القيمة المُعطاة ويُرجع القيمة التالية التي يعلّق التنفيذ بها (أو قيمة الإرجاع النهائية)
    • امتلاك أسلوب isFinished(): bool يُرجع ما إذا كان الليف قد أنهى تنفيذه
  • main.php: أدرِج ملف TaskRunner. ستتلقى مدخلين: اسم مهمة ورسالة لإرسالها إلى الليف.

    أنشئ TaskRunner باستخدام اسم المهمة المُعطى، ثم استخدم createTask() لتعريف مهمة تقوم بما يلي:

    1. تعلّق التنفيذ أولًا باستخدام السلسلة النصية "Waiting for input"
    2. تتلقى قيمة عند استئناف التنفيذ
    3. تُرجع "Completed: [received value]"

    ابدأ المهمة واطبع ما تُرجعه عند تعليقها أول مرة. ثم اطبع "Processing..." لإظهار تنفيذ العمل بين فترات إيقاف الليف مؤقتًا. وأخيرًا، استأنف الليف بتمرير إدخال الرسالة، واطبع النتيجة النهائية.

يوضح هذا التحدي كيف تتيح الألياف تعدد المهام التعاوني. توقف مهمتك تنفيذها عند نقطة مناسبة، وتنّفذ الشيفرة الرئيسية عملًا آخر، ثم تستأنف المهمة باستخدام بيانات جديدة. ويحافظ الليف على حالته طوال الوقت، مستأنفًا التنفيذ من النقطة نفسها التي توقف عندها تمامًا.

جرّب بنفسك

<?php

require_once 'TaskRunner.php';

// قراءة المدخلات
$taskName = trim(fgets(STDIN));
$message = trim(fgets(STDIN));

// TODO: أنشئ TaskRunner باسم المهمة المعطى

// TODO: استخدم createTask() لتعريف مهمة تقوم بـ:
// 1. First suspends with the string "Waiting for input"
// 2. تستقبل قيمة عند استئنافها
// 3. تُرجع "Completed: [received value]"

// TODO: ابدأ المهمة واطبع ما تُرجعه عند تعليقها لأول مرة

// TODO: اطبع "Processing..." لإظهار العمل الجاري بين توقفات الـ fiber

// TODO: تابع الـ fiber بتمرير مدخل الرسالة

// TODO: اطبع النتيجة النهائية

?>
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم PHP عبر الإنترنت