Mengkompilasi aplikasi konsol .exe cepat dengan PHP 8.1
Dengan setiap rilis, PHP semakin cepat, dan ketika kompilasi JIT (Just-In-Time) diaktifkan, ia mencapai tanda C yang hampir sama.
Banyak orang pada suatu waktu mungkin memiliki keinginan untuk dengan mudah menulis aplikasi konsol dan jendela. Cowok terkadang menulis aplikasi yang tak tergantikan untuk menyelesaikan tugas-tugas kecil dan membagikannya di forum, meskipun beberapa di antaranya berisi bug kecil.
Namun, waktu berubah, dan orang-orang mulai menyadari kesalahan mereka, beralih, katakanlah, ke OOP.
Untuk bernostalgia dan mendemonstrasikan Frankenstein baru, kami akan membangun aplikasi exe konsol lengkap dalam PHP.
PHP adalah bahasa yang ditafsirkan, jadi kita hanya perlu memiliki file binernya untuk bekerja.
Untuk membuat aplikasi, kita memerlukan file exe utama dan pustaka dll mesin. Versi 32-bit PHP 8.1 membutuhkan waktu 7 MB! Hello World dengan ukuran 7 meter tidak cocok untuk kita, setuju?
Mengikuti instruksi, saya berhasil mengkompilasi PHP tanpa modul tambahan, hanya menyisakan JIT dan FFI (ada alasannya).
Ukuran file yang dihasilkan adalah 5 MB (x64), yang tidak buruk, tetapi tidak cukup. Kami akan terus bekerja dengan x64, karena perbedaan antara itu dan x86 hanya 100kb.
PHP.exe + PHP8.dll:
Sekarang kita membutuhkan kode PHP untuk aplikasi kita.
Sebagai contoh, mari kita ambil skrip Zend Benchmark dan tambahkan beberapa argumen baris perintah untuk pengujian.
Untuk mengemas aplikasi kita ke dalam satu file, kita akan menggunakan utilitas Enigma Virtual Box gratis.
Tetapi untuk ini, Enigma membutuhkan penangan utama yang akan memanggil penerjemah.
Download gcc versi 32 bit, install, log off/masuk ke akun, ambil dan lakukan "gcc -o dabro.exe program.c", isi program.c (jangan lupa ganti nama folder ):
#include <windows.h>
#include <stdio.h>
int main(int argc, char **argv) {
char command[1024];
sprintf(command, "\"%s\\folder name\\render.exe\" -f \"%s\\folder name\\exe.c\" %s", getenv("LOCALAPPDATA"), getenv("LOCALAPPDATA"), GetCommandLineA() + strlen(argv[0]) + 1);
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
BOOL success = CreateProcess(NULL, command, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
if (!success) {
DWORD error = GetLastError();
printf("Error: %d\n", error);
return error;
}
WaitForSingleObject(pi.hProcess, INFINITE);
DWORD exitCode;
GetExitCodeProcess(pi.hProcess, &exitCode);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return exitCode;
}
Anda dapat menambahkan ikon program melalui --icon=file.ico saat mengkompilasi di gcc, atau di Resource Tuner dengan menambahkan sumber daya Icon.
Pilih handler (file input), seret binari sumber kami ke jendela Enigma, gunakan "Local, %Application Data Folder%". Dalam Opsi File, klik tanda centang kompresi.
Dalam properti file menggunakan Metode Virtualisasi, kami memakai -Write to disk, jika tidak ada-, saya menyarankan Anda untuk meletakkan skrip -Always write to disk-, sehingga akan lebih mudah untuk men-debug kode pada waktu pertama. Dalam pengaturan, kami juga menghapus semua kutu: "Petakan file yang dapat dieksekusi ke file sementara, Izinkan peluncuran mantan virtual, dll.".
Biner PHP adalah file bernama render.exe , exe.c - script.
Setelah mengkompilasi aplikasi, kami mendapatkan file portabel yang beratnya 2,7 MB!
Jika kita melangkah lebih jauh dan menghapus semua dependensi bawaan yang tidak perlu, dan juga menulis penangan ringan yang membongkar arsip sendiri, maka mungkin ukuran aplikasi akan dikurangi menjadi ratusan kilobyte (tulis di komentar, jika Anda mengetahuinya).
Arsip .7z terkompresi dengan binari saat ini beratnya hanya 1, 5 MB.
Sebagai perbandingan, biner Hello World yang dikompilasi dari aplikasi Go memiliki berat 1,2 MB.
Pengujian:
Ini bekerja seperti jarum jam sehingga Anda mengerti tentang kecepatan yang dinyatakan dari kode assembler yang dihasilkan oleh JIT, mesin saya melewati tolok ukur dalam 0,7 detik, ketika JIT dimatikan, itu melorot menjadi 2,4 detik. Menerapkan paralelisme untuk operasi komputasi intensif sumber daya bukanlah masalah (fungsi popen() / proc_open), Anda juga dapat menggunakan pustaka yang sudah jadi seperti amphp/paralel.
Peluncuran aplikasi itu sendiri cepat dan membutuhkan waktu kurang dari satu detik.
Mari kita juga menghitung hash Merkle root dari file besar:
Apakah Anda lupa tentang FFI?
Berkat ekstensi ini, kita dapat menulis kode C langsung di PHP, menghubungkan perpustakaan dll, membuat aplikasi WinAPI, berikut adalah contoh kode MessageBox:
<?php
$ffi = FFI::cdef("
int MessageBoxA(void*, const char*, const char*, int);
", "user32.dll");
$ffi->MessageBoxA(null, "Hello!", "Habr", 0);
?>
Dan inilah hasilnya:
Kesimpulan:
Anda dapat menulis aplikasi executable sederhana di PHP (aplikasi pertama yang pernah dibuat dengan metode ini). Mereka dapat bertindak sebagai utilitas backend untuk pembungkus grafis, tetapi Anda tidak boleh melakukan ini, karena PHP telah membuktikan dirinya dengan baik dalam pengembangan web, dan bukan dalam solusi desktop.
Eksperimen pada platform mentah dapat menyebabkan masalah.
Posting Komentar untuk "Mengkompilasi aplikasi konsol .exe cepat dengan PHP 8.1"