Rumah >pembangunan bahagian belakang >tutorial php >Cara menggunakan Fibers untuk mencapai konkurensi dalam PHP8.0

Cara menggunakan Fibers untuk mencapai konkurensi dalam PHP8.0

PHPz
PHPzasal
2023-05-14 09:01:352068semak imbas

Dengan pembangunan berterusan teknologi Internet moden, bilangan lawatan tapak web semakin meningkat, yang juga mengemukakan keperluan yang lebih tinggi untuk keupayaan pemprosesan serentak pelayan. Bagaimana untuk meningkatkan keupayaan pemprosesan serentak pelayan adalah masalah yang perlu dihadapi oleh setiap pembangun. Dalam konteks ini, PHP8.0 memperkenalkan ciri baharu Fibers, membolehkan pembangun PHP menguasai cara baharu pemprosesan serentak.

Apakah itu Fibers?

Pertama, kita perlu faham apa itu Fiber. Gentian ialah benang ringan yang menyokong pemprosesan tak segerak kod PHP dengan cekap. Kod PHP tradisional adalah satu-benang dan tidak boleh benar-benar melaksanakan operasi tak segerak Ia selalunya perlu menunggu untuk menyelesaikan operasi I/O, mengakibatkan sekatan yang tidak perlu. Kemunculan Fibers menyelesaikan masalah ini, membenarkan kod PHP menyokong pemprosesan serentak seperti bahasa lain seperti Node.js.

Menggunakan Fibers untuk mencapai konkurensi

Mari kita bincangkan tentang cara menggunakan Fibers untuk mencapai konkurensi.

  1. Pasang sambungan Swoole

Dalam PHP8.0, Fibers dilaksanakan berdasarkan sambungan Swoole, jadi anda perlu memasang sambungan Swoole terlebih dahulu. Ia boleh dipasang melalui PECL:

pecl install swoole 
  1. Mencipta objek Fiber

Menggunakan Fiber untuk mencapai konkurensi memerlukan mencipta objek Fiber. Mencipta objek Fiber boleh dicapai dengan mencipta fungsi tanpa nama atau kaedah kelas. Contohnya:

$fiber = new SwooleFiber(function() {
  // 这里是并发要执行的代码
});

或

class MyClass {
  public function onReceive($server, $fd, $reactor_id, $data) {
    // 这里是并发要执行的代码
  }
}
$fiber = new SwooleFiber([$myClass, 'onReceive']);
  1. Mulakan Fiber

Selepas mencipta objek Fiber, anda perlu memulakan Fiber. Anda boleh menggunakan kaedah start atau kaedah suspend untuk memulakan Fiber. Gunakan kaedah start untuk segera memulakan Fiber dan laksanakan kod yang ditakrifkan dalam Fiber. Contohnya:

$fiber->start();

dan kaedah suspend boleh menjeda pelaksanaan Fiber dan menunggu pelaksanaan seterusnya. Contohnya:

$fiber->suspend();
  1. Tukar Fiber

Dalam Fiber, gunakan fungsi swoole_fiber_switch untuk menukar pelaksanaan Fiber. Contohnya:

function foo() {
  echo 'foo ';
  yield;
  echo 'bar ';
  yield;
  echo 'baz';
}
$fiber1 = new SwooleFiber($foo);
$fiber2 = new SwooleFiber($foo);
$fiber1->start();
$fiber2->start();
while ($fiber1->getStatus() !== SwooleFiber::STATUS_DEAD || $fiber2->getStatus() !== SwooleFiber::STATUS_DEAD) {
  if ($fiber1->getStatus() !== SwooleFiber::STATUS_DEAD) {
    swoole_fiber_switch($fiber1);
  }
  if ($fiber2->getStatus() !== SwooleFiber::STATUS_DEAD) {
    swoole_fiber_switch($fiber2);
  }
}

Dalam contoh di atas, kami mencipta dua objek Fiber dan biarkan ia dilaksanakan secara berselang-seli dan mengeluarkan foobarbaz.

  1. Menggunakan API coroutine

Selain menukar Fiber secara manual, sambungan Swoole juga menyediakan beberapa API coroutine untuk pemprosesan serentak yang mudah. Contohnya, gunakan kaedah Co::create untuk mencipta objek coroutine dan gunakan Co::parallel untuk membenarkan berbilang coroutine dilaksanakan secara selari. Contohnya:

$urls = [
  'http://example.com/foo',
  'http://example.com/bar',
  'http://example.com/baz',
];
$coros = [];
foreach ($urls as $url) {
  $coros[] = Co::create(function() use ($url) {
    $html = file_get_contents($url);
    return strlen($html);
  });
}
$results = Co::parallel($coros);

Dalam contoh di atas, kami mencipta tiga objek coroutine, masing-masing mengakses tiga URL dan akhirnya menggunakan kaedah Co::parallel untuk melaksanakan ketiga-tiga coroutine ini secara selari, mendapatkan keputusan dan mengembalikannya.

Ringkasan

Fibers ialah ciri baharu yang diperkenalkan dalam PHP8.0, yang menggunakan sepenuhnya keupayaan pemprosesan serentak Swoole yang dilanjutkan. Menggunakan Fibers boleh melaksanakan pemprosesan tak segerak kod PHP dengan mudah dan meningkatkan keupayaan pemprosesan serentak pelayan. Sudah tentu, Fibers juga perlu digunakan dengan berhati-hati dan perhatian harus diberikan untuk mengelakkan persaingan sumber dan isu lain. Saya berharap pengenalan artikel ini dapat membantu pembangun PHP memahami Fibers dengan lebih baik dan melaksanakan pemprosesan serentak yang lebih baik.

Atas ialah kandungan terperinci Cara menggunakan Fibers untuk mencapai konkurensi dalam PHP8.0. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn