Menu
CoddyTech

Fiber (PHP 8.1)

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 60 dari 91.

Fiber adalah fitur PHP 8.1 yang memungkinkan eksekusi kode dihentikan sementara. Tidak seperti fungsi biasa yang berjalan dari awal hingga akhir, fiber dapat menjeda eksekusinya sendiri di tengah jalan dan melanjutkannya nanti, sambil mempertahankan statusnya di antara jeda.

Buat fiber dengan meneruskan callable ke class Fiber, lalu mulai dengan 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();

Output:

Step 1
Between steps
Step 2

Fiber berjalan sampai mencapai Fiber::suspend(), lalu kendali kembali ke kode utama. Memanggil resume() melanjutkan eksekusi dari tempatnya berhenti.

Fiber juga dapat meneruskan nilai saat ditangguhkan dan dilanjutkan kembali:

<?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;

output:

paused
Received: hello

Fiber adalah dasar bagi framework PHP asinkron. Meskipun kamu tidak akan menggunakannya secara langsung di sebagian besar aplikasi, memahaminya akan membantu saat bekerja dengan library asinkron yang menangani operasi bersamaan, seperti permintaan HTTP atau query database, tanpa memblokir proses.

challenge icon

Tantangan

Mudah

Mari kita buat penjadwal tugas yang menunjukkan cara fiber dapat menjeda dan melanjutkan eksekusi sambil meneruskan data antara fiber dan kode utama. Kamu akan membuat sistem yang memungkinkan tugas dihentikan sementara, sehingga pekerjaan lain dapat dilakukan di antaranya.

Kamu akan mengatur kodemu dalam dua file:

  • TaskRunner.php: Buat class TaskRunner yang membungkus fungsionalitas fiber untuk menjalankan tugas. Class ini harus:
    • Memiliki property privat untuk menyimpan instance Fiber
    • Menerima nama tugas (string) di constructornya menggunakan constructor promotion
    • Memiliki method createTask(callable $task) yang membuat Fiber baru dengan callable yang diberikan dan menyimpannya
    • Memiliki method start() yang memulai fiber dan mengembalikan nilai yang digunakan fiber saat menjeda eksekusi (atau nilai kembalian akhir)
    • Memiliki method continue(mixed $value) yang melanjutkan fiber dengan nilai yang diberikan dan mengembalikan nilai berikutnya saat fiber menjeda eksekusi (atau nilai kembalian akhir)
    • Memiliki method isFinished(): bool yang mengembalikan apakah fiber telah berhenti
  • main.php: Sertakan file TaskRunner. Kamu akan menerima dua input: nama tugas dan pesan untuk dikirim ke fiber.

    Buat TaskRunner dengan nama tugas yang diberikan, lalu gunakan createTask() untuk mendefinisikan tugas yang:

    1. Awalnya menjeda eksekusi dengan string "Waiting for input"
    2. Menerima nilai saat eksekusi dilanjutkan
    3. Mengembalikan "Completed: [received value]"

    Mulai tugas dan cetak nilai yang dikembalikannya saat pertama kali menjeda eksekusi. Lalu cetak "Processing..." untuk menunjukkan pekerjaan yang berlangsung di antara jeda fiber. Terakhir, lanjutkan fiber dengan meneruskan input pesan, lalu cetak hasil akhirnya.

Tantangan ini menunjukkan cara fiber memungkinkan multitasking kooperatif. Tugasmu menjeda dirinya sendiri pada titik yang sesuai, kode utama melakukan pekerjaan lain, lalu tugas dilanjutkan dengan data baru. Fiber mempertahankan statusnya selama proses tersebut dan melanjutkan tepat dari titik terakhirnya.

Coba sendiri

<?php

require_once 'TaskRunner.php';

// Baca input
$taskName = trim(fgets(STDIN));
$message = trim(fgets(STDIN));

// TODO: Buat TaskRunner dengan nama tugas yang diberikan

// TODO: Gunakan createTask() untuk mendefinisikan tugas yang:
// 1. Pertama-tama berhenti sementara dengan string "Waiting for input"
// 2. Menerima nilai saat dilanjutkan
// 3. Mengembalikan "Completed: [received value]"

// TODO: Mulai tugas dan cetak nilai yang dikembalikan saat tugas pertama kali berhenti sementara

// TODO: Cetak "Processing..." untuk menunjukkan pekerjaan yang berlangsung di antara jeda fiber

// TODO: Lanjutkan fiber dengan memasukkan input pesan

// TODO: Cetak hasil akhir

?>
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler PHP online