TypePHP adalah compiler Ahead-Of-Time atau AOT dari Swoole yang menerjemahkan source code PHP menjadi C++, lalu mengompilasinya menjadi machine code native. Pendekatan ini membuat aplikasi dapat dikirim sebagai executable, PHP extension, atau shared library tanpa mengeksekusi user function sebagai opcode Zend setelah proses compile.
Proyek ini tetap menggunakan sintaks PHP yang familiar, tetapi menyediakan informasi tipe saat compile agar jalur kode tertentu dapat dioptimalkan. TypePHP masih aktif dikembangkan dan mendukung subset PHP yang terdefinisi, sehingga bukan berarti semua aplikasi PHP dinamis dapat langsung dipindahkan tanpa perubahan.
Bagaimana TypePHP bekerja?
Alur TypePHP dimulai dari source PHP, deklarasi stub opsional, serta source C/C++ bila diperlukan. Compiler mem-parsing dan memvalidasi deklarasi, menurunkan function body serta konstanta ke C++17, lalu memakai compiler native dan cache object atau precompiled header sebelum menghasilkan output.
Output yang tersedia meliputi executable native, PHP extension, shared library, dan target WASI component. Mode yang dipilih bergantung pada cara aplikasi akan didistribusikan.
Keunggulan dibanding runtime PHP biasa
- Binary dapat berjalan tanpa proses interpreter PHP CLI terpisah pada mode executable.
- Jalur numerik dan container bertipe dapat diturunkan menjadi operasi native.
- Source code tidak dikirim sebagai file PHP yang mudah dibaca.
- Startup dan warm-up JIT dapat dikurangi karena binary sudah dikompilasi.
- Kode PHP dan C++ dapat diintegrasikan untuk kernel yang membutuhkan performa.
Perlindungan source bukan pengganti keamanan aplikasi. Binary masih perlu didistribusikan dengan aman, dependency harus dipindai, dan secret tidak boleh ditanam ke dalam source atau artefak build.
Kebutuhan environment
README resmi mencantumkan PHP CLI 8.4–8.5, development headers, php-config, PHP embed library untuk binary atau shared-library build di Unix, GCC 9 atau Clang dengan C++17, CMake 3.24+, Composer 2, serta GMP dan MPFR untuk fitur numerik tertentu.
Ketersediaan target tetap bergantung pada sistem operasi, toolchain, PHP embed, dan library pihak ketiga. Linux x64 menjadi platform development dan CI utama, sementara repository juga mencantumkan target Linux ARM64, macOS ARM64, Windows x64, dan WASI.
Instalasi melalui Composer
Untuk mencoba compiler pada project, README resmi menyediakan instalasi development dependency berikut:
composer require --dev swoole/typephp
vendor/bin/tpc.php project.ymlJika bekerja dari repository TypePHP sendiri, entry point lokalnya adalah bin/tpc.php. Pastikan versi PHP, compiler C++, CMake, dan library yang digunakan cocok dengan target build.
Contoh program PHP sederhana
Mode binary membutuhkan fungsi global main(): void. Statement executable tidak diletakkan langsung di global scope. Contoh berikut mengikuti quick start resmi:
<?php
function main(): void
{
echo "Hello World!\n";
var_dump(PHP_VERSION);
var_dump(php_uname());
}Simpan sebagai hello.php, kemudian compile dan jalankan:
bin/tpc.php hello.php
./helloVersi PHP dan informasi platform pada output bergantung pada runtime yang terhubung. Contoh ini menunjukkan perbedaan penting TypePHP: executable binary memiliki entry point yang eksplisit.
Contoh fitur code generation
TypePHP juga menyediakan attribute untuk menghasilkan method bertipe seperti getter, setter, constructor, printer, dan array conversion. Contoh berikut berasal dari pola yang dijelaskan di dokumentasi resmi:
<?php
#[Printer(fields: ['id', 'name'])]
#[Arrayable(fields: ['id', 'name'])]
final class User
{
#[Constructor, Getter, With]
public int $id;
#[Constructor, Getter, Setter]
public string $name = 'guest';
}
function main(): void
{
$user = new User(7);
$user->setName('Alice');
$copy = $user->withId(8);
echo $user->getId();
echo $copy->getId();
echo $user;
echo $user->toArray()['name'];
}Attribute seperti #[Getter], #[Setter], #[With], dan #[Constructor] membantu mengurangi boilerplate. Developer tetap perlu membaca batasan versi dan kompatibilitas karena fitur tersebut bergantung pada compiler TypePHP, bukan PHP runtime standar.
Tiga mode kompilasi
1. Binary
Mode default menghasilkan executable native dan membutuhkan fungsi main(). Cocok untuk CLI tool, service, atau aplikasi standalone.
bin/tpc.php app.php -o myapp2. PHP Extension
Mode extension menghasilkan file extension yang dapat dimuat oleh PHP SAPI. Mode ini tidak membutuhkan main().
bin/tpc.php extension/ -m ext -o my_extension3. Shared Library
Mode library menghasilkan shared library serta file .stub.php untuk memakai API TypePHP dari project lain.
bin/tpc.php lib/ -m lib -o mylibProject multi-file dengan project.yml
Untuk build yang dapat diulang, konfigurasi dapat disimpan dalam project.yml. Contoh minimal dari dokumentasi:
name: myapp
mode: bin
php-version: "8.5"
optimize: 2
job: 8
build-dir: build
cxx-std: c++17
sources:
- src
ext-deps:
- pdo_mysql
- curlPath dibaca relatif terhadap file YAML. CLI argument dapat menimpa konfigurasi YAML. Library linker native diletakkan di link-libs, sedangkan dependency extension Zend menggunakan ext-deps.
Batasan kompatibilitas
TypePHP secara sengaja mendukung subset PHP yang dapat dikompilasi secara AOT. Global scope bersifat declaration-only, binary membutuhkan signature main(), dan use native_types membuat deklarasi scalar memakai storage bertipe tetap.
Pola dynamic reference, closure, reflection, declaration, dan fitur dinamis tertentu dapat belum didukung. Sebelum memindahkan framework atau aplikasi lama, baca daftar incompatible features dan lakukan proof of concept kecil.
Apakah TypePHP cocok untuk Laravel?
TypePHP menarik untuk aplikasi PHP yang memiliki jalur komputasi intensif, CLI tool, atau kebutuhan distribusi binary. Namun framework yang sangat dinamis dan dependency yang mengandalkan reflection atau runtime behavior perlu diuji satu per satu.
Pendekatan realistis adalah memulai dari komponen terisolasi, bukan langsung mengompilasi seluruh aplikasi. Bandingkan waktu build, ukuran artefak, performa, penggunaan memori, kemampuan debugging, dan kompleksitas deployment dengan OPcache atau PHP JIT.
Lisensi dan keamanan distribusi
Repository resmi TypePHP menggunakan lisensi GPL-3.0. Tim bisnis perlu meninjau kewajiban lisensi sebelum mendistribusikan hasil build bersama software proprietary. Selain itu, artefak binary harus memiliki provenance, checksum, pipeline build, dan akses registry yang terlindungi.
Kesimpulan
TypePHP membawa pendekatan baru untuk ekosistem PHP: source code PHP dikompilasi secara AOT menjadi machine code native, dengan mode binary, extension, dan library. Potensinya menarik untuk performa, startup, dan distribusi source, tetapi kompatibilitasnya masih perlu dibuktikan melalui pengujian nyata.
Developer sebaiknya memulai dari project kecil, mengikuti dokumentasi resmi, memeriksa lisensi GPL-3.0, dan tidak menganggap TypePHP sebagai drop-in replacement untuk seluruh aplikasi PHP dinamis.
Sumber referensi:
Laravel News — Compile PHP to Native Binaries with TypePHP
Repository resmi Swoole TypePHP