236

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

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

4

14 に答える 14

244

この質問がなされた後、FacebookはHipHop for PHPを立ち上げました。これは、おそらくこれまでで最もテストされたPHPコンパイラです(世界で最大の10のWebサイトの1つを実行していることを確認してください)。ただし、Facebookは、コンパイラではなく仮想マシンであるHHVMを優先して、これを中止しました。

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

ピーチパイ

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

ファレンジャー

  • GitHub(ダウンロード)、ウィキペディア
  • .NET(CIL)へのコンパイルは2017年7月から廃止されたようで、PHP7をサポートしていないようです。

phc

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

RoadsendPHPコンパイラ

bcompiler

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

プロジェクトゼロ

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

バンバラム

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

BinaryPHP

  • C++にコンパイルします
  • 現在廃止されているようです(2014年2月)–2003年の最後の変更
于 2009-09-11T00:52:18.127 に答える
21

簡単な答えは「いいえ」です。

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

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

于 2009-09-11T00:31:33.203 に答える
15

質問が最初に行われて以来、その回答は一律の「いいえ」から「種類」に変更されました。

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

于 2010-10-06T13:12:51.663 に答える
11

もあります

目的

  • 独自のPHPアプリケーションでスクリプト全体をエンコードするには
  • プロプライエタリPHPアプリケーションで一部のクラスや関数をエンコードする
  • php.exeを必要とせずに、クライアントデスクトップで使用できるphp-gtkアプリケーションの作成を有効にします。
  • PHPからCへのコンバーターの実現可能性調査を行うには

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

于 2010-12-18T23:54:02.613 に答える
8

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

于 2009-09-26T13:00:45.167 に答える
8

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

于 2011-01-27T15:47:51.970 に答える
8

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

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

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

于 2011-11-05T20:55:11.437 に答える
2

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

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

于 2011-05-11T21:08:42.367 に答える
1

統合されたOPcacheモジュールを備えた5.5.xを参照してください。共有メモリ内で揮発性であり、はるかに高いパフォーマンスとphpのダイナミズムの原則はそのままです。

http://www.php.net/manual/en/opcache.installation.php

于 2013-12-11T20:57:52.493 に答える
1

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

Opcacheはコンパイルされていませんが、似たようなものです。

于 2017-09-15T07:21:12.647 に答える
1

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

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

PHPで書かれたPHPコンパイラです!

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

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

于 2020-04-01T09:58:52.323 に答える
0

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

于 2009-09-11T00:25:25.900 に答える
0

bcgen(bcompilerのPHP7ポート)もあります:

https://github.com/vjardin/bcgen/

(PHP7.2のみ)

于 2020-06-26T12:37:18.207 に答える
0

実際、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 。

于 2021-06-03T14:51:36.030 に答える