C ile Temel PHP Uzantısı Yazma
Kendi yerel uzantınızı oluşturup yükleyin.
C ile Temel PHP Uzantısı Yazma, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, PHP Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. PHP Academy kursu toplamda 4 dersten oluşur.
PHP'de Yerel Kod
Saf PHP çok yavaş olduğunda veya bir C kitaplığına bağlanmanız gerektiğinde, Zend API'yi kullanarak C dilinde bir PHP eklentisi yazarsınız. Eklenti, PHP'nin VM ek yükü olmadan doğrudan çağırdığı yerel işlevleri/sınıfları sunar.
Bu derste uçtan uca en küçük bir hello eklentisi oluşturacaksınız: iskelet, işlev, derleme, yükleme ve sınama.
Derleme Araç Zinciri
Uzantılar, kurulu PHP'nizin başlık dosyalarını kullanarak bir autoconf derlemesi hazırlayan PHP'nin phpize aracılığıyla derlenir. php-dev/php-devel (phpize ve php-config sağlar) ile birlikte bir C derleyicisine ve make'e ihtiyacınız vardır.
# 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
Her uzantının, bir derleme bayrağını kaydeden ve kaynak dosyalarını bildiren bir config.m4 dosyasına ihtiyacı vardır. phpize, yapılandırma betiğini oluşturmak için bu dosyayı kullanır.
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)
fiUzantı Başlık Dosyaları
C kaynak kodu Zend/PHP başlık dosyalarını içerir ve modül giriş noktasını bildirir. php.h temel API'yi içeri alır; ext/standard/info.h ise phpinfo() çıktısı için kullanılır. Her uzantı bir zend_module_entry tanımlar.
/* 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 */Argüman Bilgisi Taslakları
Modern PHP, bağımsız değişken üst verilerini bir .stub.php dosyasından üretir. İşlev imzasını PHP benzeri bir söz dizimiyle yazarsınız; gen_stub.php, hello_arginfo.h dosyasını oluşturur. Böylece yansıtma ve tür bilgileri doğru kalır.
<?php
// hello.stub.php — describes the native function's signature
/** @generate-class-entries */
function hello_greet(string $name): string {}
?>İşlevi Uygulama
Yerel bir işlev, PHP_FUNCTION ile işaretlenmiş bir C işlevdir. Gelen bağımsız değişkenleri ZEND_PARSE_PARAMETERS makrolarıyla ayrıştırır, değerleri ise RETURN_* makrolarıyla döndürürsünüz. Burada bir selamlama metni oluşturuyoruz.
/* 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 */
}Modül Giriş Noktası
zend_module_entry, her şeyi bir araya getirir: ad, sürüm, işlev tablosu (argüman bilgisinden) ve yaşam döngüsü kancaları (MINIT, RINIT, MINFO). ZEND_GET_MODULE, yükleyicinin aradığı giriş simgesini dışa aktarır.
/* 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)
#endifBellek: emalloc ve malloc karşılaştırması
Bir uzantının içinde, istek ömrü boyunca kullanılacak belleği emalloc/efree ile ayırın (Zend Bellek Yöneticisi tarafından izlenir ve isteğin sonunda serbest bırakılır); ham malloc kullanmayın. Kalıcı (istekler arası) ayırmalar için pemalloc kullanın. Bir zend_string'i RETURN_STR aracılığıyla döndürmek, sahipliği onu serbest bırakacak olan motora aktarır.
/* 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); */Derlemek
Klasik üç adımlı derleme şöyledir: iskelet oluşturmak için phpize, etkinleştirme bayrağınızla ./configure, ardından make. Argüman bilgisi başlığını oluşturmak için önce gen_stub.php dosyasını çalıştırmayı unutmayın.
# 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.soYükleme ve Sınama
Derlenmiş .so dosyasını -d extension=... ile yükleyin (veya bir ini dosyasına ekleyin). Ardından yerel işlevi, yerleşik bir işlevi çağırır gibi tam olarak PHP'den çağırın. Uzantı kurulduktan sonra sınama/doğrulama betiğiniz böyle görünür.
<?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)
?>Ne Zaman Yazılmalı, Ne Zaman Yazılmamalı
Yerel uzantıların bakım maliyeti vardır: C kaynaklı bellek hataları, PHP'nin her alt sürümü için yeniden derleme ve ABI uyumluluğunun bozulması. Yerel koda geçmeden önce FFI'yi (uzantı derlemeden C kütüphanelerini PHP'den çağırma olanağı) veya yalnızca PHP kullanarak iyileştirme yapmayı değerlendirin. En yüksek hıza, motorla derin bütünleşmeye veya karmaşık bir C kütüphanesini temiz biçimde sarmalamaya ihtiyacınız olduğunda C uzantısını tercih edin.
<?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
?>Hızlı Kontrol
Bir uzantının içinde, istek ömrü boyunca kullanılacak belleği hangi bellek ayırıcısı tutmalıdır?
Özet
En küçük C uzantınızı oluşturdunuz: config.m4 derlemeyi kaydeder, bir .stub.php argüman bilgisi üretir, PHP_FUNCTION mantığı ZEND_PARSE_PARAMETERS ile bağımsız değişkenleri ayrıştırıp RETURN_STR aracılığıyla değer döndürerek uygular ve bir zend_module_entry yaşam döngüsü kancalarını birbirine bağlar. phpize → configure → make ile derleyin, .so dosyasını yükleyin ve PHP'den sınayın. İstek belleği için emalloc kullanın; yerel koda karar vermeden önce FFI'yi değerlendirin.
Sıkça Sorulan Sorular
“C ile Temel PHP Uzantısı Yazma” dersi ücretsiz mi?
Evet — “C ile Temel PHP Uzantısı Yazma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve PHP Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. PHP Academy kursu toplamda 4 dersten oluşur.
“C ile Temel PHP Uzantısı Yazma” dersinde ne öğreneceğim?
Kendi yerel uzantınızı oluşturup yükleyin. PHP Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
PHP Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te PHP Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“C ile Temel PHP Uzantısı Yazma” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu PHP Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her PHP Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Zend Engine Nasıl Çalışır
- Bellek Yönetimi ve Çöp Toplama
- OPcache ve JIT Derlemesi
- C ile Temel PHP Uzantısı Yazma