Bisakah Anda "mengkompilasi" kode PHP dan mengunggah file binary-ish, yang hanya akan dijalankan oleh penerjemah kode byte?

224

Saya tahu bahwa PHP dikompilasi ke kode byte sebelum dijalankan di server, dan kemudian kode byte itu bisa di-cache sehingga seluruh skrip tidak harus ditafsirkan ulang dengan setiap akses web.

Tetapi bisakah Anda "mengkompilasi" kode PHP dan mengunggah file biner-ish, yang hanya akan dijalankan oleh penerjemah kode byte?

Carson Myers
sumber
Pertanyaan terkait: Kompiler PHP untuk Windows
Palec
3
Tolong jangan memberi tag ini dengan hhvm atau hiphop . HHVM bukan bagian yang melekat dari pertanyaan, hanya jawaban yang mungkin. meta.stackexchange.com/a/149347/238706
Palec
@HalayemAnis Saya pikir Anda disebutkan tautan yang salah .. Bisakah Anda memberikan tautan yang benar untuk tutorial itu? atau ada pembaruan terbaru kawan?
CJ Ramki
@CJRamki maaf, silakan gunakan tautan ini COMPILE_PHP
Halayem Anis
Pertanyaan ini sebenarnya agak kabur. Anda bisa "cukup" membangun kompiler PHP yang mengkompilasi (dalam arti sepenuhnya) kode sumber Anda dan juru bahasa PHP menjadi ELF, EXE atau apa pun.
Sebastian Mach

Jawaban:

234

Setelah pertanyaan ini diajukan, Facebook meluncurkan HipHop untuk PHP yang mungkin merupakan kompiler PHP teruji terbaik hingga saat ini (mengingat ia menjalankan salah satu dari 10 situs web terbesar di dunia). Namun, Facebook menghentikannya demi HHVM, yang merupakan mesin virtual, bukan kompiler.

Selain itu, googling PHP compilermenemukan sejumlah solusi pihak ketiga.

Pai Persik

  • PeachPie GitHub
  • mengkompilasi PHP ke .NET dan .NET Core
  • dapat dikompilasi menjadi file biner mandiri
  • berjalan di Mac, Linux, Windows, Windows Core, ARM, ...

Phalanger

  • GitHub (unduh), Wikipedia
  • kompilasi ke .NET (CIL) terlihat dihentikan dari Juli 2017 dan sepertinya tidak mendukung PHP 7.

phc

  • kompilasi ke binari asli
  • tidak terlalu aktif sekarang (Februari 2014) - versi terakhir di 2011, perubahan terakhir di musim panas 2013

Roadsend PHP Compiler

bcompiler

  • Perpanjangan PECL dari PHP
  • eksperimental
  • mengkompilasi ke bytecode PHP, tetapi dapat membungkusnya dalam binary Windows yang memuat interpreter PHP (lihat bcompiler_write_exe_footer()manual )
  • tampak dihentikan sekarang (Februari 2014) - perubahan terakhir pada 2011

Project Zero

  • Wikipedia , IBM
  • inkubator perubahan untuk WebSphere sMash
  • didukung oleh IBM
  • kompilasi ke bytecode Java
  • tampak dihentikan sekarang (Februari 2014) - situs web turun, tampak seperti sensasi besar pada 2008 dan 2009

Bambalam

  • mengkompilasi ke binari Windows yang berdiri sendiri
  • binari berisi bytecode dan peluncur
  • tampak dihentikan sekarang (Februari 2014) - perubahan terakhir pada 2006

BinaryPHP

  • mengkompilasi ke C ++
  • tampak dihentikan sekarang (Februari 2014) - perubahan terakhir pada tahun 2003
Frank Farmer
sumber
Bagaimana dengan host Web bersama? Bisakah saya mengkompilasi skrip PHP saya dengan salah satu dari kompiler dan kemudian mengunggah ke host web berbasis linux saya?
SaidbakR
2
@ sємsєм tergantung pada host Anda, tetapi jika saya harus menebak, saya rasa banyak host tidak mengizinkannya.
Frank Farmer
2
Tidak satu pun dari proyek-proyek di atas yang tampaknya dipertahankan lagi. Apakah ada kompiler yang diterima secara umum sejak 2 tahun terakhir atau mengapa semua proyek tersebut diabaikan / ditinggalkan?
Preexo
Sebuah daftar dari kompiler PHP adalah pada thefreecountry.com. Semua alat yang disebutkan di sana termasuk dalam jawaban ini sekarang.
Palec
1
Karena ini semua tampak mati, jawabannya tampaknya "tidak".
Ira Baxter
22

Jawaban singkatnya adalah "tidak".

Implementasi PHP saat ini adalah bahasa yang ditafsirkan. Anda dapat memperdebatkan aspek teoritis dari fakta bahwa bahasa apa pun secara teknis dapat diartikan atau dikompilasi, tetapi sebagaimana adanya, implementasi saat ini sedemikian rupa sehingga kode PHP memerlukan penerjemah untuk dijalankan, dan penerjemah mengelola lingkungan pelaksana.

Untuk menjawab pertanyaan Anda tentang mengunggah bytecode PHP yang sudah dikompilasi, mungkin saja, tetapi Anda harus menerapkan cara agar penerjemah PHP membaca dalam file seperti itu dan bekerja dengannya. Dengan cache opcode yang ada di luar sana, sepertinya bukan tugas yang akan menuai banyak hadiah.

zombat
sumber
3
Seringkali Anda membutuhkan penerjemah untuk menjalankan program PHP dengan benar, tetapi itu tidak berarti kompiler tidak dapat menyediakannya dalam kode yang dikompilasi. phc (phpcompiler.org) menangani semua masalah yang Anda jelaskan. Sepengetahuan saya, Roadsend (roadsend.com) juga.
Paul Biggar
28
Jawaban ini sudah ketinggalan zaman - HipHop dirilis 6 bulan setelah diposting, pada Februari 2010.
Frank Farmer
1
@FrankFarmer Apakah Anda punya pengalaman dengan HipHop? Apakah HipHop berfungsi dengan baik includedan require? Misalnya jika skrip PHP biasanya disertakan dengan include( 'controller/' . $controller_name . '.php' )apakah ini akan bekerja secara otomatis dengan HipHop? Cheers
Lea Hayes
2
Sebenarnya Anda dapat mengkompilasi kode PHP, menggunakan kompiler PHP biasa. Itu hanya tergantung pada platform target; Anda dapat mengkompilasi ke dalam opend Zend, bahasa C atau ke majelis .NET (menggunakan Phalanger php-compiler.net )
Jakub Míšek
1
The short answer is "no". The current implementation of PHP is that of an interpreted language. You can argue the theoretical aspects…Tidak ada yang teoritis tentang hal itu, banyak bahasa yang ditafsirkan memiliki penyusun; yaitu AutoIt / AutoHotkey, atau bahkan sejauh BASIC. Ada banyak program yang telah ditulis di dalamnya, kemudian disusun untuk digunakan oleh publik sebagai program mandiri. Tidak ada yang istimewa tentang PHP untuk mencegahnya dapat dikompilasi, itulah sebabnya ada banyak kompiler, tetapi tidak seperti AHK, tidak ada kompiler yang resmi, teruji, kompiler — Zend Guard tidak cukup diperhitungkan.
Synetech
16

Sejak pertanyaan pertama kali diajukan, ada perubahan pada jawaban itu dari flat out "tidak" menjadi "semacam"

http://github.com/facebook/hiphop-php/wiki

Hip Hop untuk PHP adalah kompiler yang mengambil kode PHP dan mengubahnya menjadi C ++ yang sangat dioptimalkan. Rupanya, beberapa fungsi tidak didukung (misalnya 'meledak')

Saya menemukan pertanyaan ini sambil mencari informasi lebih lanjut tentang cara menerapkan HipHop dan berpikir saya akan angkat bicara :)

Sejak 2013 Facebook tidak lagi menggunakannya, dan telah dihentikan demi HHVM, yang bukan kompiler: https://en.wikipedia.org/wiki/HipHop_for_PHP

Alex C
sumber
3
inilah yang menurut saya menggunakan facebook
Richard H
"Jenis" terletak sekarang beberapa tahun di belakang dan karena HHVM (HipHop Php) semakin baik dan semakin baik setiap hari, akhirnya ada jalan (saya pikir). Menggunakan HHVM saat ini dimungkinkan untuk pre-analyzekode php. Akibatnya Anda mendapatkan File Biner-Cache. Dengan file ini dan konfigurasi HHVM yang benar, dimungkinkan untuk menjalankan halaman Web hanya dengan bytecode, tidak perlu lagi untuk file sumber;) <br> Saya harap saya sudah benar.
PKeidel
@ Andrea, apa yang Anda maksud dengan HHVM yang ditinggalkan? Itu terlihat dipertahankan dan hidup sebagai proyek. Atau maksud Anda bahwa nama diubah dari Hip Hop untuk PHP ke HHVM? Maka berbicara tentang penghinaan itu menyesatkan.
Palec
1
@Palec HipHop untuk PHP dihentikan. Itu adalah kompiler PHP-ke-C + + yang digunakan Facebook, tetapi itu menghasilkan output yang sulit (binari multi-GB) dan tidak dapat mendukung bahasa lengkap. HHVM adalah proyek penerus yang berbagi beberapa kode yang sama, tetapi bukan kompiler. HHVM adalah mesin virtual. Facebook tidak lagi mendukung HipHop.
Andrea
11

Ada juga

yang bertujuan

  • Untuk menyandikan seluruh skrip dalam aplikasi PHP berpemilik
  • Untuk menyandikan beberapa kelas dan / atau fungsi dalam aplikasi PHP berpemilik
  • Untuk mengaktifkan produksi aplikasi php-gtk yang dapat digunakan di desktop klien, tanpa perlu php.exe.
  • Untuk melakukan studi kelayakan untuk konverter PHP ke C

Ekstensi tersedia dari PECL.

Gordon
sumber
8

phc memungkinkan Anda untuk mengompilasi program PHP ke dalam pustaka bersama, yang dapat diunggah ke server. Program PHP dikompilasi menjadi binari. Ini dilakukan sedemikian rupa untuk mendukung evals, includes, dan seluruh pustaka standar PHP.

Paul Biggar
sumber
8

Jika Anda hanya mencari untuk menghasilkan biner yang dapat dieksekusi dari skrip PHP, maka hindari mencoba membuat pertanyaan Anda sangat tepat karena akan membuatnya tampak bahwa Anda tahu persis apa yang Anda butuhkan. Selain itu, sebagian besar pengembang PHP sama sekali tidak memiliki petunjuk tentang apa bytecode itu.

Dengan mengatakan itu, jawabannya adalah YA . Saya baru saja selesai mengkompilasi skrip PHP ke dalam biner. Dan bukan sembarang biner. Saya telah menggunakan aplikasi CDE (tautan ke Wayback Machine, tautan asli sekarang rusak) untuk mengubahnya menjadi biner portabel yang dapat didistribusikan dengan semua dependensi dan dieksekusi tanpa masalah apa pun ... dan berfungsi dengan baik.

Yang Anda butuhkan hanyalah menggunakan phc .

asiby
sumber
7

Um, ada yang mendengar tentang Zend Guard , yang melakukan persis apa yang diminta orang ini. Ini mengkodekan / mengaburkan kode PHP menjadi "kode mesin".

John Dillick
sumber
1
Saya tidak berpikir mereka menginginkan kebingungan sebanyak speedup yang dihasilkan dari interperting bytecode daripada sumber.
Stephen
@Stephen Zend Guard juga dimaksudkan untuk melakukan itu.
Gajus
Zend Guard memutuskan untuk tidak mendukung PHP 7 yang merupakan kekurangan - blog.zend.com/2016/10/10/zend-guard-and-php-7/#.W7YISnszaM8
vj
2

Ada beberapa "kompiler" kode PHP. Sebagian besar dari mereka tidak mendukung semua fitur PHP, karena ini hanya harus ditafsirkan pada saat run time.

Kami menggunakan Phalanger - http://www.php-compiler.net/ - yang mendukung bahkan fitur dinamis PHP yang kotor, dan masih dapat mengkompilasi mereka sebagai .NET assembly, yang dapat didistribusikan sebagai DLL mandiri.

Jakub Míšek
sumber
1

Di php 7 ada opsi php ini opcache.file_cache yang menyimpan bytecode di folder tertentu. In dapat berguna dalam skrip php cli yang "dikompilasi" dan disimpan dalam folder tertentu untuk digunakan kembali secara optimal.

Opcache itu tidak mengkompilasi tetapi sesuatu yang serupa.

caiofior
sumber
"Dalam php 7" bukan hanya PHP7, itu PHP 5.5.0 dan yang lebih baru
Raymond Nijland
0

PHP tidak bisa dikompilasi dengan banyak program. Anda dapat menggunakan encoder Zend untuk membuatnya tidak dapat dibaca.

Joe
sumber
bukankah itu dikompilasi dengan cara yang sama dengan perl dikompilasi?
Carson Myers
PHP dikompilasi di server dengan cepat saya percaya. Saya telah menggunakan encoder untuk menyembunyikan kode sumbernya. Jika itu yang Anda khawatirkan. Mereka bekerja dengan sangat baik.
Joe
nah, saya hanya tertarik pada aspek teoretisnya
Carson Myers
2
PHP tidak dipenuhi, ini merupakan bahasa yang diartikan. cache berisi 'opcodes' whitch interprets php (tidak harus membaca teks), kode php tidak dapat 'dijalankan' secara langsung seperti yang Anda lakukan dengan c
borrel
0

Jika Anda diizinkan menjalankan binari asli asli, maka ini adalah kompiler Anda:

https://github.com/ircmaxell/php-compiler

Ini adalah kompiler PHP yang ditulis dalam PHP!

Ini mengkompilasi kode PHP ke kode VM sendiri. Kode VM ini kemudian dapat ditafsirkan oleh penerjemahnya sendiri (juga ditulis dalam PHP, bukankah itu gila?) Atau dapat diterjemahkan ke Bitcode. Dan menggunakan kerangka kerja compiler LLVM ( clangdan co), Bitcode ini dapat dikompilasi menjadi biner asli untuk setiap platform yang didukung LLVM (hampir semua platform yang penting saat ini). Anda dapat memilih untuk melakukan itu secara statis atau setiap kali tepat sebelum kode dijalankan (gaya JIT). Jadi, hanya dua persyaratan agar kompiler ini bekerja pada sistem Anda adalah juru bahasa PHP yang diinstal dan clangkompiler yang diinstal .

Jika Anda tidak diizinkan menjalankan binari asli, Anda bisa menggunakan kompiler di atas sebagai juru bahasa dan membiarkannya mengartikan kode VM sendiri, namun ini akan lambat karena Anda menjalankan juru bahasa PHP yang sendiri berjalan di mesin PHP, jadi Anda memiliki "interpretasi ganda".

Mecki
sumber