web-dev-qa-db-ja.com

PHPコードを「コンパイル」できますか。

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

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

212
Carson Myers

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

それを超えて、googling PHP compilerはサードパーティーの解決策を多数生み出します。

Phalanger

  • GitHub (ダウンロード)、 Wikipedia
  • .NET(CIL)にコンパイル

phc

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

Roadsend PHP Compiler

bcompiler

  • PHPのPECL拡張
  • 実験的な
  • PHPバイトコードにコンパイルしますが、PHPインタプリタをロードするWindowsバイナリでラップできます( bcompiler_write_exe_footer() manual を参照)。
  • 2014年2月に製造中止 - 2011年の最後の変更

プロジェクトゼロ

  • ウィキペディアIBM
  • WebSphere sMash への変更のインキュベーター
  • iBMがサポート
  • javaバイトコードにコンパイル
  • 今は廃止されているようです(2014年2月) - ウェブサイトは下がり、2008年と2009年には大盛況のようです

バンバラム

  • スタンドアロンのWindowsバイナリにコンパイルします。
  • バイナリにはバイトコードとランチャーが含まれています
  • 2014年2月に製造中止 - 2006年の最後の変更

BinaryPHP

  • c ++にコンパイル
  • 2014年2月に製造中止 - 2003年の最後の変更
228
Frank Farmer

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

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

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

22
zombat

その質問が最初に尋ねられて以来、その答えは一定の「いいえ」から「一種の」に変更されました。

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

16
Alex C

もあります

どちらが目的

  • 独自のPHPアプリケーションでスクリプト全体をエンコードするには
  • 独自のPHPアプリケーションでクラスや関数をエンコードする
  • Php.exeを必要とせずに、クライアントデスクトップで使用できるphp-gtkアプリケーションの作成を可能にする。
  • PHPからCへのコンバータのフィージビリティスタディを行うには

この拡張子はPECLから入手できます。

11
Gordon

PHPスクリプトからバイナリ実行可能ファイルを生成することだけを考えているのであれば、質問が非常に正確になるようにしないでください。そのうえ、ほとんどのPHP開発者はバイトコードが何であるかについての手がかりを全く持たない。

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

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

8
asiby

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

8
Paul Biggar

ええと、誰もが Zend Guard について聞いたことがありますが、これはまさにこの人が求めていることです。 PHPコードを "machine code"にエンコード/難読化します。

7
John Dillick

PHPコードの "コンパイラ"がいくつかあります。それらのほとんどはPHP機能のすべてをサポートするわけではありません。これらは単に実行時に解釈されなければならないからです。

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

2
Jakub Míšek

Php 7にはphp iniオプション opcache.file_cache があります。これはバイトコードを特定のフォルダに保存します。で最適化された再利用のために "コンパイル"され、特定のフォルダに保存されているPHPのCLIスクリプトに便利かもしれません。

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

1
caiofior

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

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

1
cplusplus

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

0
Joe