0Pricing
PHP Academy · Pelajaran

Server Berkinerja Tinggi dengan Swoole

Layani ribuan koneksi dengan Swoole berbasis korutin.

Server Berkinerja Tinggi dengan Swoole adalah pelajaran PHP Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.

Apa Itu Swoole

Swoole (dan turunannya, OpenSwoole) adalah ekstensi C yang mengubah PHP menjadi lingkungan eksekusi berkinerja tinggi berbasis korutin dan digerakkan oleh peristiwa. Alih-alih PHP-FPM membuat satu proses untuk setiap permintaan, peladen Swoole memulai aplikasi Anda sekali dan membiarkannya tetap berada di memori, melayani permintaan dari kumpulan pekerja berumur panjang dengan korutin bawaan. Hasilnya adalah peningkatan kapasitas pemrosesan berlipat-lipat dan konkurensi bawaan dalam satu permintaan.

Peladen HTTP Persisten

Contoh klasiknya adalah peladen HTTP lengkap dalam sebuah skrip. Peladen ini mendengarkan, meneruskan setiap permintaan ke pekerja, dan tidak pernah memulai ulang kerangka kerja. Perhatikan bahwa ini memerlukan ext-swoole — ini tidak berjalan pada PHP CLI standar.

<?php
$server = new Swoole\Http\Server('0.0.0.0', 9501);
$server->set(['worker_num' => 4]);

$server->on('request', function ($request, $response) {
    $response->header('Content-Type', 'application/json');
    $response->end(json_encode(['hello' => $request->server['request_uri']]));
});

echo "listening on :9501\n";
$server->start();

Korutin, Bukan Panggilan Balik

Fitur unggulan Swoole adalah korutin: Anda menulis kode sekuensial bergaya pemblokiran yang dijadwalkan lingkungan eksekusi secara kooperatif. Coroutine\run() membuka konteks korutin; go() meluncurkan korutin baru. Setiap korutin memiliki tumpukannya sendiri, seperti serat, tetapi Swoole menjadwalkannya secara otomatis pada titik-titik I/O.

<?php
use Swoole\Coroutine as Co;

Co\run(function () {
    go(function () { Co::sleep(1); echo "A done\n"; });
    go(function () { Co::sleep(1); echo "B done\n"; });
    // Both sleep concurrently -> total ~1s, not 2s
});

Fungsi Pemblokir dengan Pengait

Inilah keajaiban yang membuat korutin mudah digunakan: pengait lingkungan eksekusi. Swoole secara transparan mengubah panggilan pemblokir — PDO, Redis, curl, sleep, file_get_contents — menjadi versi nonblokir yang sadar korutin. Panggilan biasa seperti $pdo->query() menangguhkan korutin alih-alih membekukan pekerja.

<?php
use Swoole\Runtime;
use Swoole\Coroutine as Co;

Runtime::enableCoroutine(SWOOLE_HOOK_ALL); // hook PDO, curl, sleep, etc.

Co\run(function () {
    go(function () { sleep(1); echo "task 1\n"; }); // sleep() is now async!
    go(function () { sleep(1); echo "task 2\n"; });
}); // finishes in ~1s because sleep was hooked

I/O Bersamaan dengan WaitGroup

Untuk menyebarkan pekerjaan dan menggabungkan hasilnya, Swoole menyediakan WaitGroup (seperti sync.WaitGroup milik Go). Luncurkan korutin, panggil add() untuk setiap tugas, panggil done() saat selesai, lalu panggil wait() untuk menunggu sampai semuanya selesai — secara bersamaan.

<?php
use Swoole\Coroutine as Co;
use Swoole\Coroutine\WaitGroup;

Co\run(function () {
    $wg = new WaitGroup();
    $results = [];
    foreach (['eu', 'us', 'asia'] as $region) {
        $wg->add();
        go(function () use ($wg, $region, &$results) {
            Co::sleep(0.5);              // simulated API call
            $results[$region] = "ok-$region";
            $wg->done();
        });
    }
    $wg->wait();                         // all three ran in parallel (~0.5s)
    var_dump($results);
});

Saluran untuk Komunikasi

Korutin berkoordinasi melalui saluran — antrean bertipe dengan kapasitas terbatas yang menangguhkan produsen saat penuh dan konsumen saat kosong. Ini adalah perpesanan bergaya CSP yang sepenuhnya menghindari kunci pada status bersama.

<?php
use Swoole\Coroutine as Co;
use Swoole\Coroutine\Channel;

Co\run(function () {
    $chan = new Channel(2);
    go(function () use ($chan) {
        foreach (range(1, 3) as $n) $chan->push($n);
        $chan->push(null); // sentinel
    });
    go(function () use ($chan) {
        while (($v = $chan->pop()) !== null) echo "got $v\n";
    });
});

Pengumpulan Koneksi

Peladen persisten tidak seharusnya membuka koneksi basis data untuk setiap permintaan. Swoole menyediakan kumpulan koneksi yang aman untuk korutin, sehingga pekerja dapat menggunakan kembali sekumpulan koneksi tetap di antara ribuan korutin bersamaan dan menghilangkan pergantian koneksi yang tidak perlu.

<?php
use Swoole\Database\PDOConfig;
use Swoole\Database\PDOPool;
use Swoole\Coroutine as Co;

Co\run(function () {
    $pool = new PDOPool((new PDOConfig())
        ->withHost('127.0.0.1')->withDbname('app')
        ->withUsername('u')->withPassword('p'), 8);

    go(function () use ($pool) {
        $pdo = $pool->get();           // borrow
        $row = $pdo->query('SELECT NOW()')->fetch();
        $pool->put($pdo);              // return to pool
        var_dump($row);
    });
});

Kebocoran Status: Jebakan Memori Persisten

Karena proses tetap hidup di antara permintaan, status global dan statis tetap ada. Cache statis yang tumbuh tanpa batas, singleton yang menyimpan data khusus permintaan, atau transaksi basis data yang bocor dapat merusak permintaan berikutnya dan menghabiskan memori. Aturannya: hindari data dengan cakupan permintaan di dalam statis/singleton, setel ulang konteks untuk setiap permintaan, dan tetapkan max_request agar pekerja didaur ulang secara berkala.

<?php
$server = new Swoole\Http\Server('0.0.0.0', 9501);
$server->set([
    'worker_num'  => 8,
    'max_request' => 10000, // recycle a worker after N requests to bound leaks
]);
// Never store $request data in a static property between requests!

Konteks Lokal Korutin

Karena satu pekerja menjalankan banyak korutin secara berselang-seling, Anda tidak dapat menggunakan statis biasa untuk data per permintaan. Swoole memberi setiap korutin sebuah konteks (Coroutine::getContext()) — objek yang masa hidupnya mengikuti korutin, sehingga cocok untuk menyimpan pengguna saat ini, ID permintaan, atau pegangan transaksi.

<?php
use Swoole\Coroutine as Co;

Co\run(function () {
    go(function () {
        $ctx = Co::getContext();
        $ctx['request_id'] = 'req-123';
        // ... deep call chain can read Co::getContext()['request_id']
        echo Co::getContext()['request_id'], PHP_EOL;
    });
});

Model Proses dan Pekerja Tugas

Swoole menjalankan proses utama (mengelola utas loop peristiwa), pengelola (membuat dan memantau pekerja), proses pekerja (menjalankan penangan permintaan dan korutin Anda), serta pekerja tugas opsional untuk pekerjaan berat, pemblokir, atau yang terikat CPU dan dialihkan melalui $server->task(). Gunakan pekerja tugas untuk pemrosesan gambar atau pekerjaan CPU yang lama agar tidak menghentikan korutin permintaan — sehingga Anda memperoleh konkurensi sekaligus paralelisme.

Penundaan dan Pengatur Waktu

Swoole memungkinkan Anda menjadwalkan pekerjaan setelah korutin saat ini selesai dengan Coroutine::defer() — ideal untuk selalu melepaskan sumber daya dari kumpulan dengan benar, bahkan jika terjadi pengecualian. Pengatur waktu seluruh peladen (Timer::tick) menjalankan tugas berkala seperti penyegaran cache di dalam pekerja tanpa cron eksternal.

<?php
use Swoole\Coroutine as Co;

Co\run(function () {
    go(function () {
        $conn = 'borrowed-connection';
        Co::defer(function () use ($conn) {
            echo "released $conn\n"; // runs when coroutine exits, even on error
        });
        echo "using $conn\n";
    });
});

Pemeriksaan Singkat

Mengapa Anda harus menghindari penyimpanan data permintaan dalam properti statis di peladen Swoole?

Ringkasan

Swoole mengubah PHP menjadi peladen persisten yang digerakkan oleh korutin:

  • Aplikasi dimulai sekali; kumpulan pekerja melayani permintaan dengan korutin bawaan (Co\run/go()).
  • Pengait lingkungan eksekusi membuat PDO/curl/sleep biasa menjadi nonblokir; WaitGroup dan saluran mengoordinasikan pekerjaan bersamaan.
  • Kumpulan koneksi menggunakan kembali koneksi basis data di antara korutin.
  • Memori persisten berarti Anda harus menghindari kebocoran status: gunakan Coroutine::getContext() untuk data per permintaan, tetapkan max_request, dan alihkan pekerjaan berat ke pekerja tugas.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Server Berkinerja Tinggi dengan Swoole” gratis?

Ya — teks lengkap “Server Berkinerja Tinggi dengan Swoole” 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 “Server Berkinerja Tinggi dengan Swoole”?

Layani ribuan koneksi dengan Swoole berbasis korutin. 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 4 dari 4.

Berapa lama pelajaran “Server Berkinerja Tinggi dengan Swoole” 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