Reputation: 38564
I know that PHP is compiled to byte code before it is run on the server, and then that byte code can be cached so that the whole script doesn't have to be re-interpreted with every web access.
But can you "compile" PHP code and upload a binary-ish file, which will just be run by the byte code interpreter?
Upvotes: 243
Views: 266547
Reputation: 13527
I'm surprised no one has mentioned IonCube. WHMCS uses it effectively in production and has been doing so for years. But it's not exactly what you want.
If you just want to run a PHP app on a Desktop, PHPDesktop might be for you.
Other than that, the most modern answer was already mentioned, which is OpCache.
(Maybe share a bit more as to why you want to convert it to Bytecode)
Upvotes: 0
Reputation: 509
Actually, the Just-In-Time compiler introduced with PHP 8 does in fact compile PHP. Strangely enough, it doesn't really speed up CMS based websites (e.g. WordPress), however, it does open the doors for PHP to compete with the likes of C++. For more information, see the RFC behind the JIT implementation here: https://wiki.php.net/rfc/jit. Also, Matthew Weir O'Phinney has posted a number of insightful blogs that shed light on its capabilities. Start reading here: https://www.zend.com/blog/exploring-new-php-jit-compiler.
Upvotes: 3
Reputation: 31
There is also bcgen (a PHP7 port of bcompiler):
https://github.com/vjardin/bcgen/
(PHP7.2 only)
Upvotes: 0
Reputation: 39356
After this question was asked, Facebook launched HipHop for PHP which is probably the best-tested PHP compiler to date (seeing as it ran one of the world’s 10 biggest websites). However, Facebook discontinued it in favour of HHVM, which is a virtual machine, not a compiler.
Beyond that, googling PHP compiler
turns up a number of 3rd party solutions.
bcompiler_write_exe_footer()
manual)Upvotes: 250
Reputation: 132919
If you are allowed to run real native binaries, then this is your compiler:
https://github.com/ircmaxell/php-compiler
It's a PHP compiler written in PHP!
It compiles PHP code to its own VM code. This VM code can then either be interpreted by its own interpreter (also written in PHP, isn't that crazy?) or it can be translated to Bitcode. And using the LLVM compiler framework (clang
and co), this Bitcode can be compiled into a native binary for any platform that LLVM supports (pretty much any platform that matters today). You can choose to either do that statically or each time just before the code is executed (JIT style). So the only two requirements for this compiler to work on your system is an installed PHP interpreter and an installed clang
compiler.
If you are not allowed to run native binaries, you could use the compiler above as an interpreter and let it interpret its own VM code, yet this will be slow as you are running a PHP interpreter that itself is running on a PHP engine, so you have a "double interpretation".
Upvotes: 1
Reputation: 429
In php 7 there is the php ini option opcache.file_cache that saves the bytecode in a specific folder. In could be useful to in php cli script that are "compiled" and saved in a specific folder for a optimized reuse.
Opcache it is not compiling but is something similar.
Upvotes: 1
Reputation: 17004
Since the question was first asked, there has been a change to that answer from a flat out "no" to a "kind of"
http://github.com/facebook/hiphop-php/wiki
Hip Hop for PHP was a compiler that took PHP code and turned it into highly optimized C++ Apparently, some functions are not supported (for example 'explode')
I found this question while looking for more information on how to implement HipHop and thought I'd speak up :)
Since 2013 Facebook no longer use it, however, and it has been discontinued in favour of HHVM, which is not a compiler: https://en.wikipedia.org/wiki/HipHop_for_PHP
Upvotes: 15
Reputation: 3389
If you are simply looking for producing a binary executable from a PHP script, then please avoid trying to make your question extremely precise because it will make it appear that you know exactly what you need. Besides, most PHP developer have absolutely zero clue about what a bytecode is.
With that said, the answers is YES. I have just finished compiling a PHP script into a binary. And not just any binary. I have used the CDE application (link to Wayback Machine, the original link is now broken) to turn it into an portable binary that can be distributed with all the dependencies and executed without any issue… and it works beautifully.
All you need is to use phc.
Upvotes: 8
Reputation: 19
see 5.5.x with the integrated OPcache module, volatile in a shared memory, much more performance and the dynamism principle of php remain untouched.
http://www.php.net/manual/en/opcache.installation.php
Upvotes: 1
Reputation: 1050
There are several "compilers" of PHP code. Most of them do not support all of PHP features, since these simply must be interpreted during run time.
We are using Phalanger - http://www.php-compiler.net/ - that is supporting even those dirty PHP dynamic features, and still is able to compile them as .NET assembly, that can be distributed as a standalone DLL.
Upvotes: 2
Reputation: 117
Um, anybody heard of Zend Guard, which does exactly what this person is asking. It encodes/obfuscates PHP code into "machine code".
Upvotes: 8
Reputation: 316969
There is also
which aims
- To encode entire script in a proprietary PHP application
- To encode some classes and/or functions in a proprietary PHP application
- To enable the production of php-gtk applications that could be used on client desktops, without the need for a php.exe.
- To do the feasibility study for a PHP to C converter
The extension is available from PECL.
Upvotes: 11
Reputation: 28739
phc allows you to compile PHP programs into shared libraries, which can be uploaded to the server. The PHP program is compiled into binaries. It's done in such a way as to support eval
s, include
s, and the entire PHP standard library.
Upvotes: 8
Reputation: 94157
The short answer is "no".
The current implementation of PHP is that of an interpreted language. You can argue the theoretical aspects of the fact that any language can technically be interpreted or compiled, but as it stands, the current implementations are such that PHP code requires an interpreter to run, and the interpreter manages the executing environment.
To answer your question about uploading pre-compiled PHP bytecode, it's probably possible, but you'd have to implement a way for the PHP interpreter to read in such a file and work with it. With existing opcode caches out there already, it doesn't seem like a task that would reap much reward.
Upvotes: 22
Reputation: 675
PHP doesn't really get compiled as with many programs. You can use Zend's encoder to make it unreadable though.
Upvotes: 0