اذهب إلى المحتوى

السؤال

نشر

السلام عليكم

أريد أن أتعلم كيفية استخدام Fibers في لغة PHP لذلك قمت بإنشاء تطبيق بسيط يُفترض به أن يقوم بجلب البيانات من رابط API وهو كالتالي:

$fiber = new Fiber(function () {
    $curl = curl_init("https://jsonplaceholder.typicode.com/todos/1");
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    Fiber::suspend(curl_exec($curl));
});

echo "1" . "<br>";
$fiber->start();
echo "2" . "<br>";

$response = $fiber->resume();
echo $response . "<br>";
echo "3";

لكنه لم يعمل, فأين الخلل؟

Recommended Posts

  • 0
نشر

بسبب أنك تقوم بتعليق الـ Fiber باستخدام Fiber::suspend(curl_exec($curl)).

المشكلة هنا أن curl_exec غير متوافقة مع الـ Fibers، أي عند استدعاء curl_exec، فيتم محاولة تنفيذ الطلب بالكامل بشكل متزامن، مما يؤدي إلى حظر الـ Fiber وعدم استئنافها.

بالتالي، لا يتم الوصول إلى $fiber->resume() أبدًا، ولا يتم طباعة الاستجابة.

الصحيح هو التالي:

<?php

$fiber = new Fiber(function () {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://jsonplaceholder.typicode.com/todos/1');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch);

    $data = json_decode($response, true);
    print_r($data);
});

$fiber->start();

لاحظ تنفيذ curl_exec بالكامل داخل الـ Fiber، ثم فك تشفير JSON وطباعة البيانات قبل انتهاء الـ Fiber.

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...