PHPコードを「コンパイル」して、バイナリコードのファイルをアップロードできますか。これは、バイトコードインタープリターによって実行されます。


224

PHPはサーバーで実行される前にバイトコードにコンパイルされ、そのバイトコードをキャッシュできるので、すべてのWebアクセスでスクリプト全体を再解釈する必要がありません。

しかし、PHPコードを「コンパイル」して、バイナリコードのファイルをアップロードできます。これは、バイトコードインタープリターによって実行されます。


関連する質問:Windows用のPHPコンパイラ
Palec

3
これにhhvmhiphopのタグを付けないでください。HHVMは質問の本質的な部分ではなく、可能な回答です。meta.stackexchange.com/a/149347/238706
Palec 14

@HalayemAnis間違ったリンクが記載されていると思います。そのチュートリアルの正しいリンクを提供できますか?または最新のアップデート担当者はいますか?
CJ Ramki 2015年

申し訳ありません@CJRamki、このリンクを使用してくださいCOMPILE_PHP
Halayemアニス

この質問は実際にはかなりあいまいです。ソースコードとPHPインタープリターを(完全な意味で)コンパイルして、ELF、EXE、またはその他のものに「単純に」PHPコンパイラーを構築できます。
Sebastian Mach

回答:


234

この質問がなされた後、FacebookはHipHop for PHPリリースしました。これは、おそらくこれまでで最もテストされたPHPコンパイラです(世界で10の最大のWebサイトの1つを実行していたため)。しかしFacebookは、コンパイラーではなく仮想マシンであるHHVMを支持してそれを中止しました。

それ以上に、グーグルPHP compilerは多くのサードパーティソリューションを生み出します。

ピーチパイ

  • PeachPie GitHub
  • PHPを.NETおよび.NET Coreにコンパイルします
  • 自己完結型のバイナリファイルにコンパイル可能
  • Mac、Linux、Windows、Windows Core、ARMなどで動作します

ファランジャー

  • GitHub(ダウンロード)、ウィキペディア
  • .NET(CIL)にコンパイルすると、2017年7月に廃止されたように見え、PHP 7をサポートしていないようです。

phc

  • ネイティブバイナリにコンパイルする
  • 現在あまり活発ではない(2014年2月)– 2011年の最後のバージョン、2013年夏の最後の変更

Roadsend PHPコンパイラ

bcompiler

  • PHPのPECL拡張機能
  • 実験的
  • PHPバイトコードにコンパイルしますが、PHPインタープリターをロードするWindowsバイナリーでラップできます(bcompiler_write_exe_footer()マニュアルを参照)
  • 現在廃止されているようです(2014年2月)– 2011年の最後の変更

プロジェクトゼロ

  • ウィキペディアIBM
  • WebSphere sMashの変更のインキュベーター
  • IBMがサポート
  • Javaバイトコードにコンパイルする
  • 現在廃止されているようです(2014年2月)– Webサイトがダウンしており、2008年と2009年に大きな誇大広告のように見えます

バンバラム

  • スタンドアロンのWindowsバイナリにコンパイル
  • バイナリにはバイトコードとランチャーが含まれています
  • 現在廃止されているようです(2014年2月)– 2006年の最後の変更

BinaryPHP

  • C ++にコンパイル
  • 現在廃止されているようです(2014年2月)– 2003年の最後の変更

共有ウェブホストはどうですか?これらのコンパイラーの1つでPHPスクリプトをコンパイルしてから、LinuxベースのWebホストにアップロードできますか?
SaidbakR 2013年

2
@sємsємそれはあなたのホストに依存しますが、私が推測しなければならなかった場合、私は多くのホストがそれを許可しないと思います。
Frank Farmer

2
上記のプロジェクトのいずれも、もはや維持されていないようです。過去2年間から一般に受け入れられているコンパイラーはありますか、それともこれらすべてのプロジェクトが無視/放棄されているのですか?
Preexo 2013

PHPコンパイラの素敵なリストは thefreecountry.comです。そこで言及されているすべてのツールは、この回答に含まれています。
パレック

1
これらはすべて死んでいるように見えるため、答えは「いいえ」のようです。
Ira Baxter

22

短い答えは「いいえ」です。

PHPの現在の実装は、インタプリタ言語の実装です。どの言語も技術的に解釈またはコンパイルできるという事実の理論的側面を主張できますが、現状では、現在の実装ではPHPコードの実行にインタープリターが必要であり、インタープリターが実行環境を管理しています。

コンパイル済みのPHPバイトコードのアップロードに関する質問に答えるには、おそらく可能ですが、PHPインタープリターがそのようなファイルを読み取って操作する方法を実装する必要があります。既存のオペコードキャッシュはすでに存在しているため、多くの報酬を得るタスクのようには見えません。


3
多くの場合、PHPプログラムを適切に実行するためにインタープリターが必要ですが、それは、コンパイラーがコンパイルされたコードでそれを提供できないことを意味しません。phc(phpcompiler.org)は、記述されたすべての問題を処理します。私の知る限り、Roadsend(roadsend.com)も同様です。
ポールビガー

28
この回答は古くなっています-HipHopは、投稿されてから6か月後に2010
Frank Farmer

1
@FrankFarmer HipHopの経験はありますか?HipHopはincludeおよびで正しく動作しrequireますか?たとえば、PHPスクリプトが通常含まれている場合、include( 'controller/' . $controller_name . '.php' )これは自動的にHipHopで動作しますか?歓声
Lea Hayes

2
実際には、通常のPHPコンパイラを使用してPHPコードをコンパイルできます。ターゲットプラットフォームに依存します。Zend opcode、C言語、または.NETアセンブリにコンパイルできます(Phalanger php-compiler.netを使用)
JakubMíšek

1
The short answer is "no". The current implementation of PHP is that of an interpreted language. You can argue the theoretical aspects…理論的なことは何もありません。多くのインタプリタ言語にはコンパイラがあります。つまり、AutoIt / AutoHotkey、またはBASICまでさかのぼります。それらで書かれたプログラムがたくさんあり、スタンドアロンプ​​ログラムとして一般に使用するためにコンパイルされています。PHPがコンパイルできないようにする特別なことは何もありません。そのため、多くのコンパイラが存在しますが、AHKとは異なり、テスト済みの公式なコンパイラはありません。ZendGuardはそれほど重要ではありません。
Synetech 2015

16

質問が最初に出されてから、その答えは「ノー」から「カインド」に変わった。

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

PHPのHip Hopは、PHPコードを取得して高度に最適化されたC ++に変換したコンパイラーでした。明らかに、一部の関数はサポートされていません(たとえば、 'explode')。

HipHopの実装方法に関する詳細情報を探しているときにこの質問を見つけ、私は発言すると思いました:)

ただし、2013年以降Facebookはこれを使用せず、コンパイラではないHHVMのために廃止されました:https : //en.wikipedia.org/wiki/HipHop_for_PHP


3
これはFacebookが使用しているものだと思います
Richard H

「種類」は現在数年遅れており、HHVM(HipHop Php)は毎日ますます良くなっているので、最終的に方法があります(私はそう思います)。HHVMを使用すると、現在ではpre-analyzePHPコードを使用できます。その結果、バイナリキャッシュファイルを取得します。このファイルと正しいHHVM構成を使用すると、バイトコードのみでWebページを実行でき、ソースファイルは不要になります;)<br>正しく理解できたと思います。
PKeidel 2014

@ Andrea、HHVMが廃止されるとはどういう意味ですか?プロジェクトとして維持され、生きているように見えます。それとも、名前がHip Hop for PHPからHHVMに変わったということですか?次に、廃止の話は誤解を招くものです。
Palec、2016年

1
@Palec HipHop for PHPは廃止されました。これはFacebookが使用するPHP-to-C ++コンパイラでしたが、扱いにくい出力(マルチGBバイナリ)を生成し、完全な言語をサポートできませんでした。HHVMは、同じコードの一部を共有する後続プロジェクトですが、コンパイラーではありません。HHVMは仮想マシンです。FacebookはHipHopをサポートしなくなりました。
Andrea

11

もあります

目指している

  • 独自のPHPアプリケーションでスクリプト全体をエンコードするには
  • 独自のPHPアプリケーションでいくつかのクラスや関数をエンコードするには
  • php.exeを使用せずに、クライアントデスクトップで使用できるphp-gtkアプリケーションの生成を有効にする。
  • PHP to Cコンバーターの実現可能性調査を行うには

拡張機能はPECLから入手できます。


8

phcを使用すると、サーバーにアップロードできる共有ライブラリにPHPプログラムをコンパイルできます。PHPプログラムはバイナリにコンパイルされます。これはevalincludes、s、およびPHP標準ライブラリ全体をサポートするような方法で行われます。


8

PHPスクリプトからバイナリ実行可能ファイルを作成するだけの場合は、質問を非常に正確にしようとしないでください。必要なものが正確にわかっているように見えるためです。その上、ほとんどのPHP開発者は、バイトコードが何であるかについてまったく手掛かりをまったく持っていません。

そうは言っても、答えはYESです。PHPスクリプトをバイナリにコンパイルしたところです。バイナリだけではありません。私はCDEアプリケーション(Wayback Machineへのリンク元のリンクは今は壊れています)を使用して、すべての依存関係で配布して問題なく実行できるポータブルバイナリに変換しました。

必要なのはphcを使用することだけです。


7

ええと、誰かがZend Guardについて聞いたことがあります。これはまさにこの人が求めていることを実行します。PHPコードを「マシンコード」にエンコード/難読化します。


1
ソースではなくバイトコードを解釈することによるスピードアップほど、難読化を望んでいたとは思いません。
スティーブン

@Stephen Zend Guardもそうすることを意図しています。
Gajus 2013年

Zend GuardはPHP 7をサポートしないことにしましたが、これは欠点です-blog.zend.com/2016/10/10/zend-guard-and-php-7/#.W7YISnszaM8
vj

2

PHPコードにはいくつかの「コンパイラ」があります。これらのほとんどは、実行時に解釈する必要があるだけなので、すべてのPHP機能をサポートしているわけではありません。

私たちはPhalanger- http: //www.php-compiler.net/-を使用しています。これは、これらの汚いPHP動的機能もサポートしており、スタンドアロンDLLとして配布できる.NETアセンブリとしてそれらをコンパイルできます。



1

php 7には、特定のフォルダーにバイトコードを保存するphp iniオプションopcache.file_cacheがあります。「コンパイル」され、最適化された再利用のために特定のフォルダーに保存されるphp cliスクリプトで役立ちます。

Opcacheはコンパイルされていませんが、似ています。


「php 7」では、PHP7だけではなく、PHP 5.5.0以降
Raymond Nijland

0

多くのプログラムのように、PHPは実際にはコンパイルされません。ただし、Zendのエンコーダーを使用して、読みにくくすることができます。


Perlがコンパイルされるのと同じ方法でコンパイルされませんか?
カーソンマイヤーズ

PHPはサーバー上で即座にコンパイルされると思います。私はエンコーダーを使ってソースコードを隠しています。もしそれがあなたが心配していることなら。彼らは本当にうまくいきます。
Joe

いや、私はそれの理論的な側面に興味を持っていました
カーソンマイヤーズ

2
PHPは準拠しておらず、インタプリタ言語です。キャッシュはwhitch PHPの解釈(テキストを読むために持っていない)「オペコード」を含んでいるあなたは、Cと同じように、PHPのコードは、直接「RUN」することはできません
borrel

0

実際のネイティブバイナリの実行が許可されている場合、これはコンパイラです。

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

PHPコンパイラです 書かれです。

PHPコードを独自のVMコードにコンパイルします。このVMコードは、独自のインタープリター(PHPでも作成されていますが、クレイジーではありませんか)で解釈することも、ビットコードに変換することもできます。そして、LLVMコンパイラフレームワークclangおよびco)を使用して、このビットコードは、LLVMがサポートする任意のプラットフォーム(今日重要なほとんどすべてのプラットフォーム)のネイティブバイナリにコンパイルできます。静的に実行するか、コードを実行する直前に実行するかを選択できます(JITスタイル)。したがって、このコンパイラーがシステムで動作するための2つの要件は、インストールされているPHPインタープリターとインストールされているclangコンパイラーのみです。

ネイティブバイナリの実行が許可されていない場合は、上記のコンパイラをインタープリタとして使用して独自のVMコードを解釈させることができますが、PHPエンジンで実行されているPHPインタープリタを実行しているため、これは遅くなります。あなたは「二重解釈」を持っています。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.