0Pricing
PHP Academy · Pelajaran

Fiber PHP 8.1

Jeda dan lanjutkan eksekusi dengan Fiber bawaan.

Fiber PHP 8.1 adalah pelajaran PHP Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar PHP Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus PHP Academy mencakup 4 pelajaran total.

Manfaat Fiber

PHP 8.1 menambahkan Fiber: primitif inti yang memungkinkan Anda menjeda tumpukan pemanggilan yang sedang berjalan dan melanjutkannya nanti dari tempat yang sepenuhnya berbeda. Fiber adalah tumpukan mandiri yang lengkap, yang dapat Anda tangguhkan pada titik mana pun dan lanjutkan tanpa membongkarnya. Inilah bagian yang hilang sehingga pustaka dapat mengganti rantai janji dengan await yang tampak sinkron — dasar API modern ReactPHP dan Amp.

Fiber Pertama Anda

Buat Fiber dengan panggilan balik, jalankan start(), lalu biarkan Fiber menangguhkan dirinya sendiri dengan suspend(). Kendali kembali ke pemanggil pada titik penangguhan; resume() melanjutkan eksekusi tepat dari titik tersebut.

<?php
$fiber = new Fiber(function (): void {
    echo "A: inside fiber\n";
    $received = Fiber::suspend('paused');
    echo "C: resumed with '$received'\n";
});

$value = $fiber->start();          // prints A, returns 'paused'
echo "B: fiber suspended, got '$value'\n";
$fiber->resume('hello');           // prints C
echo "D: fiber done\n";

Empat Metode Inti

API-nya sederhana:

  • $fiber->start(...$args) — memulai eksekusi; mengembalikan nilai penangguhan pertama.
  • Fiber::suspend($value) — menjeda fiber saat ini, lalu menyerahkan $value kepada pelanjut.
  • $fiber->resume($value) — melanjutkan eksekusi; $value menjadi nilai yang dikembalikan oleh suspend().
  • $fiber->getReturn() — nilai yang dikembalikan panggilan balik setelah fiber dihentikan.

Nilai mengalir ke dua arah melewati batas penangguhan.

Penerusan Nilai Dua Arah

Fiber dapat menghasilkan permintaan ke luar lalu menerima respons kembali — inti cara perulangan peristiwa memasukkan hasil masukan/keluaran ke tugas yang ditangguhkan.

<?php
$fiber = new Fiber(function (): int {
    $a = Fiber::suspend('need first number');
    $b = Fiber::suspend('need second number');
    return $a + $b;
});

$fiber->start();        // suspends: 'need first number'
$fiber->resume(10);     // a = 10, suspends: 'need second number'
$fiber->resume(32);     // b = 32, fiber returns
echo $fiber->getReturn(), PHP_EOL; // 42

Keadaan dan Introspeksi Fiber

Anda dapat menanyakan siklus hidup sebuah fiber. Memanggil resume() pada fiber yang sudah dihentikan akan melempar FiberError, jadi lindungi kode dengan pemeriksaan ini saat membangun penjadwal.

<?php
$fiber = new Fiber(function () { Fiber::suspend(); });
var_dump($fiber->isStarted());     // false
$fiber->start();
var_dump($fiber->isStarted());     // true
var_dump($fiber->isSuspended());   // true
var_dump($fiber->isRunning());     // false (we're outside it)
$fiber->resume();
var_dump($fiber->isTerminated());  // true

Membangun Penjadwal Mini

Fiber ditambah antrean menghasilkan penjadwal kooperatif. Setiap tugas menangguhkan diri untuk menyerahkan kendali; penjadwal menjalankan tugas secara bergiliran sampai semuanya selesai. Inilah kerangka dasar di dalam setiap runtime asinkron.

<?php
$tasks = [];
foreach (['X', 'Y', 'Z'] as $name) {
    $tasks[] = new Fiber(function () use ($name) {
        for ($i = 1; $i <= 2; $i++) {
            echo "$name step $i\n";
            Fiber::suspend();   // give others a turn
        }
    });
}
foreach ($tasks as $t) { $t->start(); }
while ($tasks) {
    foreach ($tasks as $k => $t) {
        if ($t->isTerminated()) { unset($tasks[$k]); continue; }
        $t->resume();
    }
}

Pengecualian di Seluruh Batas

throwInto() (disebut throw() dalam API sebagai $fiber->throw()) menyisipkan pengecualian pada titik penangguhan — inilah cara perulangan melaporkan operasi masukan/keluaran yang gagal kembali ke tugas yang sedang menunggu. Pengecualian tersebut muncul tepat di tempat fiber dijeda.

<?php
$fiber = new Fiber(function () {
    try {
        Fiber::suspend();
    } catch (RuntimeException $e) {
        echo 'caught: ' . $e->getMessage() . PHP_EOL;
    }
});
$fiber->start();
$fiber->throw(new RuntimeException('io failed')); // prints: caught: io failed

Fiber dibandingkan Generator

Generator (yield) juga dapat ditangguhkan — tetapi hanya fungsi teratas. Untuk menunggu dari pembantu bertingkat dengan generator, Anda harus meneruskan yield from sampai ke atas tumpukan, sehingga setiap fungsi harus mengikuti pola tersebut. Fiber menangguhkan seluruh tumpukan dari kedalaman mana pun, sehingga pemanggilan yang sangat bertingkat dapat menjalankan Fiber::suspend() tanpa diketahui pemanggilnya. Inilah alasan await dapat menjadi pemanggilan fungsi biasa, bukan yield.

<?php
function deep(): string {
    // No yield needed in the call chain — suspends the whole fiber
    return Fiber::suspend('awaiting from deep');
}
$f = new Fiber(fn() => print(deep() . PHP_EOL));
$f->start();
$f->resume('value injected at depth');

Batasan Penangguhan

Ada satu aturan penting: Anda hanya dapat menjalankan Fiber::suspend() dari dalam fiber. Menangguhkan dari utas utama, atau melalui panggilan balik tingkat C yang tidak mendukung fiber (beberapa pembanding usort lama dan panggilan balik internal tertentu), akan melempar FiberError: Cannot suspend outside of a fiber. Pustaka menyembunyikan hal ini dengan memastikan semua kode pengguna berjalan di dalam fiber yang digerakkan oleh perulangan.

<?php
try {
    Fiber::suspend(); // main thread — illegal
} catch (FiberError $e) {
    echo $e->getMessage(), PHP_EOL; // Cannot suspend outside of a fiber
}

Cara Pustaka Menggunakan Fiber

Anda jarang menulis Fiber mentah dalam kode aplikasi. Kerangka kerja seperti Amp v3 dan ReactPHP (melalui fiber) membungkusnya: await($promise) secara internal menjalankan Fiber::suspend(), mendaftarkan kelanjutan pada perulangan peristiwa, lalu memanggil resume() pada fiber Anda ketika operasi masukan/keluaran selesai. Kode Anda tampak sinkron; runtime menangani penempatan sementara dan penjadwalan.

<?php
// Conceptual: what an await() helper does under the hood
function await(Promise $p): mixed {
    $fiber = Fiber::getCurrent() ?? throw new Error('await() outside fiber');
    $p->then(fn($v) => $fiber->resume($v),
             fn($e) => $fiber->throw($e));
    return Fiber::suspend(); // parked until the promise settles
}

Catatan Memori dan Siklus Hidup

Setiap fiber mengalokasikan tumpukannya sendiri, sehingga membuat ratusan ribu fiber memiliki biaya memori, meskipun jauh lebih ringan daripada utas OS. Fiber yang ditangguhkan selamanya tidak akan pernah dikumpulkan oleh pengumpul sampah jika sesuatu masih menyimpan referensi padanya — kebocoran tersembunyi dalam server yang berjalan lama. Selain itu, panggilan balik fiber yang melempar pengecualian yang tidak tertangkap akan meneruskannya keluar dari pemanggilan resume()/start(), sehingga penjadwal harus membungkus pemanggilan lanjutan dalam blok try/catch.

<?php
$fiber = new Fiber(function () {
    throw new RuntimeException('boom inside fiber');
});
try {
    $fiber->start(); // exception surfaces here, at the resumer
} catch (RuntimeException $e) {
    echo 'scheduler caught: ' . $e->getMessage() . PHP_EOL;
}

Pemeriksaan Singkat

Apa keunggulan utama Fiber dibandingkan generator untuk pemrograman asinkron?

Rangkuman

Fiber adalah primitif konkurensi tingkat rendah milik PHP:

  • start(), Fiber::suspend(), resume(), dan getReturn() menjeda serta melanjutkan seluruh tumpukan pemanggilan, dengan meneruskan nilai ke dua arah.
  • Metode keadaan (isSuspended, isTerminated) dan throw() memungkinkan Anda membangun penjadwal kooperatif serta menyisipkan galat masukan/keluaran.
  • Berbeda dari generator, fiber dapat ditangguhkan dari kedalaman mana pun — sehingga memungkinkan await() yang transparan.
  • Anda hanya dapat menangguhkan fiber di dalam fiber; kerangka kerja seperti Amp dan ReactPHP membungkus fiber sehingga kode asinkron Anda terbaca secara sinkron.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Fiber PHP 8.1” gratis?

Ya — teks lengkap “Fiber PHP 8.1” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus PHP Academy, upgrade ke CoddyKit PRO. Kursus PHP Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Fiber PHP 8.1”?

Jeda dan lanjutkan eksekusi dengan Fiber bawaan. Kamu berlatih PHP Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai PHP Academy?

Tidak diperlukan pengalaman sebelumnya. PHP Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Fiber PHP 8.1” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran PHP Academy ini?

Ya. Setiap pelajaran PHP Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Model Konkurensi PHP
  2. Fiber PHP 8.1
  3. Perulangan Peristiwa dengan ReactPHP
  4. Server Berkinerja Tinggi dengan Swoole
← Kembali ke PHP Academy