0Pricing
PHP Academy · Pelajaran

Menulis Ekstensi PHP Dasar dalam C

Bangun dan muat ekstensi native Anda sendiri.

Menulis Ekstensi PHP Dasar dalam C 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.

Kode Native dalam PHP

Jika PHP murni terlalu lambat atau Anda perlu mengikat pustaka C, tulislah ekstensi PHP dalam C menggunakan Zend API. Ekstensi tersebut menyediakan fungsi/kelas native yang dipanggil langsung oleh PHP tanpa biaya tambahan dari VM.

Pelajaran ini membuat ekstensi hello minimal dari awal hingga akhir: kerangka, fungsi, pembangunan, pemuatan, dan pengujian.

Rangkaian Alat Pembangunan

Ekstensi dibangun dengan phpize milik PHP, yang menyiapkan pembangunan autoconf menggunakan header PHP yang terpasang. Anda memerlukan php-dev/php-devel (menyediakan phpize dan php-config), serta kompiler C dan make.

# Install build prerequisites (Debian/Ubuntu)
sudo apt install php-dev build-essential

# Confirm the tools exist
phpize --version
php-config --extension-dir   # where the .so will be installed

config.m4

Setiap ekstensi memerlukan config.m4 yang mendaftarkan tanda pembangunan dan menyatakan berkas sumber. phpize menggunakannya untuk membuat skrip configure.

dnl config.m4 for the 'hello' extension
PHP_ARG_ENABLE([hello],
  [whether to enable hello support],
  [AS_HELP_STRING([--enable-hello], [Enable hello])],
  [no])

if test "$PHP_HELLO" != "no"; then
  PHP_NEW_EXTENSION(hello, hello.c, $ext_shared)
fi

Header Ekstensi

Kode sumber C menyertakan header Zend/PHP dan menyatakan entri modul. php.h menyertakan API inti; ext/standard/info.h digunakan untuk keluaran phpinfo(). Setiap ekstensi mendefinisikan zend_module_entry.

/* hello.c — includes */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "php.h"
#include "ext/standard/info.h"
#include "hello_arginfo.h"   /* generated from stub */

Stub Informasi Argumen

PHP modern menghasilkan metadata argumen dari berkas .stub.php. Anda menulis tanda tangan fungsi dengan sintaks mirip PHP; gen_stub.php menghasilkan hello_arginfo.h. Dengan begitu, informasi refleksi dan tipe tetap akurat.

<?php
// hello.stub.php — describes the native function's signature
/** @generate-class-entries */

function hello_greet(string $name): string {}
?>

Mengimplementasikan Fungsi

Fungsi asli adalah fungsi C yang diberi tanda PHP_FUNCTION. Anda mengurai argumen yang masuk dengan makro ZEND_PARSE_PARAMETERS dan mengembalikan nilai melalui makro RETURN_*. Di sini, kita membuat string sapaan.

/* hello.c — the native function */
PHP_FUNCTION(hello_greet)
{
    char *name;
    size_t name_len;

    ZEND_PARSE_PARAMETERS_START(1, 1)
        Z_PARAM_STRING(name, name_len)
    ZEND_PARSE_PARAMETERS_END();

    /* Build "Hello, <name>!" into a new zend_string */
    zend_string *result = strpprintf(0, "Hello, %s!", name);
    RETURN_STR(result);   /* hands ownership to the engine */
}

Entri Modul

zend_module_entry menghubungkan semuanya: nama, versi, tabel fungsi (dari informasi argumen), dan pengait siklus hidup (MINIT, RINIT, MINFO). ZEND_GET_MODULE mengekspor simbol entri yang dicari oleh pemuat.

/* hello.c — module wiring */
zend_module_entry hello_module_entry = {
    STANDARD_MODULE_HEADER,
    "hello",                 /* extension name */
    ext_functions,           /* function table from arginfo */
    NULL,                    /* MINIT  (module startup)  */
    NULL,                    /* MSHUTDOWN */
    NULL,                    /* RINIT  (per-request)     */
    NULL,                    /* RSHUTDOWN */
    PHP_MINFO(hello),        /* phpinfo section */
    "0.1.0",
    STANDARD_MODULE_PROPERTIES
};

#ifdef COMPILE_DL_HELLO
ZEND_GET_MODULE(hello)
#endif

Memori: emalloc dibandingkan dengan malloc

Di dalam ekstensi, alokasikan memori sepanjang masa hidup permintaan dengan emalloc/efree (dilacak oleh Pengelola Memori Zend dan dibebaskan saat permintaan berakhir), bukan malloc mentah. Untuk alokasi persisten (lintas permintaan), gunakan pemalloc. Mengembalikan zend_string melalui RETURN_STR memindahkan kepemilikan ke mesin, yang akan membebaskannya.

/* Request-scoped buffer the engine will clean up on error/shutdown */
char *buf = emalloc(64);
/* ... use buf ... */
efree(buf);

/* Persistent allocation surviving the request (rare) */
/* char *cfg = pemalloc(128, 1);  ...  pefree(cfg, 1); */

Membangunnya

Pembangunan klasik tiga langkah: gunakan phpize untuk membuat kerangka, ./configure dengan tanda pengaktifan Anda, lalu make. Ingatlah untuk menjalankan gen_stub.php terlebih dahulu guna menghasilkan header informasi argumen.

# Generate arginfo from the stub
php /path/to/php-src/build/gen_stub.php hello.stub.php

# Scaffold + configure + compile
phpize
./configure --enable-hello
make

# Result lands in modules/hello.so
ls -la modules/hello.so

Memuat dan Menguji

Muat .so yang telah dikompilasi dengan -d extension=... (atau tambahkan ke berkas ini). Kemudian panggil fungsi asli dari PHP persis seperti fungsi bawaan. Inilah bentuk skrip pengujian/verifikasi Anda setelah ekstensi terpasang.

<?php
// After:  php -d extension=./modules/hello.so test.php
if (!extension_loaded('hello')) {
    fwrite(STDERR, "hello extension not loaded\n");
    exit(1);
}

echo hello_greet('Zend') . PHP_EOL;   // Hello, Zend!
var_dump(extension_loaded('hello'));  // bool(true)
?>

Kapan Sebaiknya Tidak Menulisnya

Ekstensi asli memerlukan pemeliharaan: bug memori C, pembangunan ulang untuk setiap versi minor PHP, dan kerusakan ABI. Sebelum menggunakan kode asli, pertimbangkan FFI (memanggil pustaka C dari PHP tanpa mengompilasi ekstensi) atau optimasi PHP murni. Gunakan ekstensi C ketika Anda memerlukan kecepatan maksimum, integrasi mendalam dengan mesin, atau cara yang bersih untuk membungkus pustaka C yang kompleks.

<?php
// FFI alternative: call a C library directly, no extension build
$ffi = FFI::cdef(
    "int abs(int);",   // declare the symbol
    "libc.so.6"
);
echo $ffi->abs(-42) . PHP_EOL;   // 42
?>

Pemeriksaan Singkat

Di dalam ekstensi, pengalokasi mana yang seharusnya digunakan untuk menyimpan memori sepanjang masa hidup permintaan?

Ringkasan

Anda membangun ekstensi C minimal: config.m4 mendaftarkan pembangunan, .stub.php menghasilkan informasi argumen, PHP_FUNCTION mengimplementasikan logika dengan mengurai argumen menggunakan ZEND_PARSE_PARAMETERS dan mengembalikannya melalui RETURN_STR, serta zend_module_entry menghubungkan pengait siklus hidup. Bangun dengan phpize → configure → make, muat .so, lalu uji dari PHP. Gunakan emalloc untuk memori permintaan—dan pertimbangkan FFI sebelum memilih kode asli.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Menulis Ekstensi PHP Dasar dalam C” gratis?

Ya — teks lengkap “Menulis Ekstensi PHP Dasar dalam C” 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 “Menulis Ekstensi PHP Dasar dalam C”?

Bangun dan muat ekstensi native Anda sendiri. 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 “Menulis Ekstensi PHP Dasar dalam C” 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. Cara Kerja Zend Engine
  2. Manajemen Memori dan Pengumpulan Sampah
  3. OPcache dan Kompilasi JIT
  4. Menulis Ekstensi PHP Dasar dalam C
← Kembali ke PHP Academy