Menulis Sambungan PHP Asas dalam C
Bina dan muatkan sambungan natif anda sendiri.
Menulis Sambungan PHP Asas dalam C ialah pelajaran PHP Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran PHP Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus PHP Academy merangkumi sejumlah 4 pelajaran.
Kod Natif dalam PHP
Apabila PHP tulen terlalu perlahan atau Anda perlu mengikat pustaka C, Anda menulis sambungan PHP dalam C berdasarkan Zend API. Sambungan itu mendedahkan fungsi/kelas natif yang dipanggil terus oleh PHP tanpa overhed VM.
Pelajaran ini membina sambungan hello minimum dari hujung ke hujung: rangka asas, fungsi, binaan, pemuatan dan ujian.
Rantaian Alat Binaan
Pelanjutan dibina dengan phpize milik PHP, yang menyediakan binaan autoconf menggunakan pengepala PHP yang dipasang. Anda memerlukan php-dev/php-devel (menyediakan phpize dan php-config) serta pengkompil 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 installedconfig.m4
Setiap pelanjutan memerlukan config.m4 yang mendaftarkan bendera binaan dan mengisytiharkan fail sumber. phpize menggunakannya untuk menjana 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)
fiPengepala Pelanjutan
Sumber C menyertakan pengepala Zend/PHP dan mengisytiharkan entri modul. php.h memasukkan API teras; ext/standard/info.h digunakan untuk keluaran phpinfo(). Setiap pelanjutan mentakrifkan 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 */Rangka Maklumat Argumen
PHP moden menjana metadata argumen daripada fail .stub.php. Anda menulis tandatangan fungsi dalam sintaks seperti PHP; gen_stub.php menghasilkan hello_arginfo.h. Ini memastikan maklumat refleksi dan jenis kekal tepat.
<?php
// hello.stub.php — describes the native function's signature
/** @generate-class-entries */
function hello_greet(string $name): string {}
?>Melaksanakan Fungsi
Fungsi natif ialah fungsi C yang ditandai dengan PHP_FUNCTION. Anda menghuraikan argumen masuk dengan makro ZEND_PARSE_PARAMETERS dan mengembalikan nilai melalui makro RETURN_*. Di sini kita membina rentetan ucapan.
/* 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, jadual fungsi (daripada maklumat argumen) dan cangkuk kitar hayat (MINIT, RINIT, MINFO). ZEND_GET_MODULE mengeksport 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)
#endifMemori: emalloc berbanding malloc
Dalam pelanjutan, peruntukkan memori sepanjang hayat permintaan dengan emalloc/efree (dijejaki oleh Pengurus Memori Zend dan dibebaskan pada akhir permintaan) — bukan malloc mentah. Untuk peruntukan berterusan (merentas permintaan), gunakan pemalloc. Mengembalikan zend_string melalui RETURN_STR memindahkan pemilikan kepada enjin, 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); */Membinanya
Binaan klasik tiga langkah: phpize untuk menyediakan rangka, ./configure dengan bendera pengaktifan anda, kemudian make. Ingat untuk menjalankan gen_stub.php terlebih dahulu bagi menghasilkan pengepala maklumat 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.soMemuatkan dan Menguji
Muatkan .so yang telah dikompil dengan -d extension=... (atau tambahkan pada fail ini). Kemudian panggil fungsi natif daripada PHP sama seperti fungsi terbina dalam. Inilah rupa skrip ujian/pengesahan anda selepas pelanjutan dipasang.
<?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)
?>Bila (Tidak) Patut Menulisnya
Pelanjutan natif memerlukan penyelenggaraan: pepijat memori C, binaan semula bagi setiap versi kecil PHP dan kerosakan ABI. Sebelum menggunakan kod natif, pertimbangkan FFI (memanggil pustaka C daripada PHP tanpa mengkompil pelanjutan) atau pengoptimuman PHP tulen. Gunakan pelanjutan C apabila anda memerlukan kelajuan maksimum, integrasi mendalam dengan enjin atau cara yang kemas 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
?>Semakan Pantas
Dalam pelanjutan, pengurus peruntukan memori manakah yang patut digunakan untuk memori sepanjang hayat permintaan?
Ringkasan
Anda telah membina pelanjutan C yang minimum: config.m4 mendaftarkan binaan, .stub.php menjana maklumat argumen, PHP_FUNCTION melaksanakan logik dengan menghuraikan argumen menggunakan ZEND_PARSE_PARAMETERS dan mengembalikan nilai melalui RETURN_STR, manakala zend_module_entry menyambungkan cangkuk kitar hayat. Bina dengan phpize → configure → make, muatkan .so dan uji daripada PHP. Gunakan emalloc untuk memori permintaan — dan pertimbangkan FFI sebelum memilih kod natif.
Pelajari PHP dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 49
- Pelajaran
- 195
Soalan Lazim
Adakah pelajaran “Menulis Sambungan PHP Asas dalam C” percuma?
Ya — teks penuh “Menulis Sambungan PHP Asas dalam C” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus PHP Academy, tingkat taraf kepada CoddyKit PRO. Kursus PHP Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Menulis Sambungan PHP Asas dalam C”?
Bina dan muatkan sambungan natif anda sendiri. Anda berlatih PHP Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan PHP Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran PHP Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.
Berapa lamakah pelajaran “Menulis Sambungan PHP Asas dalam C” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran PHP Academy ini?
Ya. Setiap pelajaran PHP Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Cara Zend Engine Berfungsi
- Pengurusan Memori dan Pengumpulan Sampah
- Penyusunan OPcache dan JIT
- Menulis Sambungan PHP Asas dalam C