PHPは、サーバーで実行される前にバイトコードにコンパイルされ、そのバイトコードをキャッシュできるため、すべてのWebアクセスでスクリプト全体を再解釈する必要がありません。
しかし、PHPコードを「コンパイル」して、バイトコードインタープリターによって実行されるバイナリ風のファイルをアップロードできますか?
この質問がなされた後、FacebookはHipHop for PHPを立ち上げました。これは、おそらくこれまでで最もテストされたPHPコンパイラです(世界で最大の10のWebサイトの1つを実行していることを確認してください)。ただし、Facebookは、コンパイラではなく仮想マシンであるHHVMを優先して、これを中止しました。
それを超えて、グーグルPHP compiler
は多くのサードパーティソリューションを生み出します。
bcompiler_write_exe_footer()
マニュアルを参照) 。簡単な答えは「いいえ」です。
PHPの現在の実装は、インタプリタ言語の実装です。どの言語も技術的に解釈またはコンパイルできるという事実の理論的側面について議論することができますが、現状では、PHPコードの実行にはインタープリターが必要であり、インタープリターが実行環境を管理します。
コンパイル済みのPHPバイトコードのアップロードに関する質問に答えるには、おそらく可能ですが、PHPインタープリターがそのようなファイルを読み取って操作する方法を実装する必要があります。既存のオペコードキャッシュがすでに存在するため、多くの見返りを得るタスクのようには思えません。
質問が最初に行われて以来、その回答は一律の「いいえ」から「種類」に変更されました。
http://github.com/facebook/hiphop-php/wiki
Hip Hop for PHPは、PHPコードを取得し、高度に最適化されたC ++に変換したコンパイラでした。どうやら、一部の関数はサポートされていません(たとえば、「explode」)。
HipHopの実装方法に関する詳細情報を探しているときにこの質問を見つけ、私が発言すると思いました:)
ただし、2013年以降、Facebookはこれを使用しなくなり、コンパイラーではないHHVMを優先して廃止されました:https://en.wikipedia.org/wiki/HipHop_for_PHP
もあります
目的
- 独自のPHPアプリケーションでスクリプト全体をエンコードするには
- プロプライエタリPHPアプリケーションで一部のクラスや関数をエンコードする
- php.exeを必要とせずに、クライアントデスクトップで使用できるphp-gtkアプリケーションの作成を有効にします。
- PHPからCへのコンバーターの実現可能性調査を行うには
拡張機能はPECLから入手できます。
phcを使用すると、PHPプログラムを共有ライブラリにコンパイルして、サーバーにアップロードできます。PHPプログラムはバイナリにコンパイルされます。eval
これは、s、include
s、およびPHP標準ライブラリ全体をサポートするような方法で行われます。
ええと、誰もがこの人が求めていることを正確に実行するZendGuardについて聞いたことがあります。PHPコードを「マシンコード」にエンコード/難読化します。
PHPスクリプトからバイナリ実行可能ファイルを作成するだけの場合は、必要なものを正確に理解しているように見えるため、質問を非常に正確にしようとしないでください。その上、ほとんどのPHP開発者は、バイトコードが何であるかについてまったく手がかりがありません。
そうは言っても、答えはイエスです。PHPスクリプトをバイナリにコンパイルし終えたところです。そして、バイナリだけではありません。私はCDEアプリケーション(Wayback Machineへのリンク、元のリンクは壊れています)を使用して、すべての依存関係とともに配布し、問題なく実行できるポータブルバイナリに変換しました...そしてそれは美しく動作します。
必要なのはphcを使用することだけです。
PHPコードにはいくつかの「コンパイラ」があります。これらのほとんどは、実行時に解釈する必要があるため、すべてのPHP機能をサポートしているわけではありません。
Phalanger(http://www.php-compiler.net/ )を使用しています。これは、これらのダーティなPHP動的機能もサポートしており、スタンドアロンDLLとして配布できる.NETアセンブリとしてコンパイルできます。
統合されたOPcacheモジュールを備えた5.5.xを参照してください。共有メモリ内で揮発性であり、はるかに高いパフォーマンスとphpのダイナミズムの原則はそのままです。
php 7には、バイトコードを特定のフォルダーに保存するphpiniオプションopcache.file_cacheがあります。Inは、最適化された再利用のために「コンパイル」されて特定のフォルダーに保存されるphpcliスクリプトで役立つ可能性があります。
Opcacheはコンパイルされていませんが、似たようなものです。
実際のネイティブバイナリの実行が許可されている場合、これはコンパイラです。
https://github.com/ircmaxell/php-compiler
PHPで書かれたPHPコンパイラです!
PHPコードを独自のVMコードにコンパイルします。このVMコードは、独自のインタープリター(PHPで記述されていますが、それほどクレイジーではありませんか?)で解釈することも、ビットコードに変換することもできます。また、LLVMコンパイラフレームワーク(clang
およびco)を使用して、このビットコードをLLVMがサポートするすべてのプラットフォーム(現在重要なほとんどすべてのプラットフォーム)のネイティブバイナリにコンパイルできます。これを静的に実行するか、コードが実行される直前に毎回実行するかを選択できます(JITスタイル)。したがって、このコンパイラがシステムで動作するための2つの要件は、インストールされているPHPインタプリタとインストールされているclang
コンパイラだけです。
ネイティブバイナリの実行が許可されていない場合は、上記のコンパイラをインタープリターとして使用して、独自のVMコードを解釈させることができますが、それ自体がPHPエンジンで実行されているPHPインタープリターを実行しているため、これは遅くなります。あなたには「二重の解釈」があります。
PHPは、多くのプログラムのように実際にはコンパイルされません。ただし、Zendのエンコーダーを使用して読み取り不能にすることができます。
実際、PHP8で導入されたJust-In-Timeコンパイラは実際にPHPをコンパイルします。不思議なことに、CMSベースのWebサイト(WordPressなど)を実際に高速化するわけではありませんが、PHPがC++などと競合するための扉を開きます。詳細については、JIT実装の背後にあるRFCを参照してください:https ://wiki.php.net/rfc/jit 。また、Matthew Weir O'Phinneyは、その機能に光を当てる洞察に満ちたブログを多数投稿しています。ここから読み始めてください:https ://www.zend.com/blog/exploring-new-php-jit-compiler 。