web-dev-qa-db-fra.com

Pouvez-vous "compiler" PHP code et télécharger un fichier binary-ish, qui sera simplement exécuté par l'interpréteur de code octet?

Je sais que PHP est compilé en code octet avant qu'il ne soit exécuté sur le serveur. Ce code octet peut ensuite être mis en cache afin que le script ne doive pas être réinterprété avec chaque accès Web.

Mais pouvez-vous "compiler" PHP le code et télécharger un fichier binary-ish, qui sera simplement exécuté par l'interpréteur de code octet?

215
Carson Myers

Après que cette question a été posée, Facebook a lancé HipHop pour PHP , qui est probablement le compilateur le mieux testé PHP à ce jour a dirigé l’un des 10 plus grands sites Web au monde). Cependant, Facebook l'a abandonné en faveur de HHVM, qui est une machine virtuelle, pas un compilateur.

Au-delà de cela, googler PHP compiler trouve un certain nombre de solutions tierces.

PeachPie

  • PeachPie GitHub
  • compile PHP en .NET et .NET Core
  • peut être compilé dans un fichier binaire autonome
  • fonctionne sur Mac, Linux, Windows, Windows Core, ARM, ...

Phalanger

phc

  • compile en binaires natifs
  • pas très actif maintenant (février 2014) - dernière version en 2011, dernière modification en été 2013

Roadsend PHP Compilateur

bcompiler

  • Extension PECL de PHP
  • expérimental
  • compile en PHP bytecode, mais peut l'envelopper dans un binaire Windows qui charge un interpréteur PHP (voir manuel de bcompiler_write_exe_footer() )
  • semble abandonné maintenant (février 2014) - dernier changement en 2011

Project Zero

  • Wikipedia , IBM
  • incubateur de modifications pour WebSphere sMash
  • soutenu par IBM
  • compile en Java bytecode
  • semble abandonné (février 2014) - le site Web est en panne

Bambalam

  • compile en binaires Windows autonomes
  • les binaires contiennent du bytecode et un lanceur
  • semble abandonné maintenant (février 2014) - dernier changement en 2006

BinaryPHP

  • compile en C++
  • semble abandonné maintenant (février 2014) - dernier changement en 2003
230
Frank Farmer

La réponse courte est non".

L'implémentation actuelle de PHP est celle d'un langage interprété. Vous pouvez argumenter les aspects théoriques du fait que n'importe quel langage peut être interprété ou compilé techniquement, mais dans l'état actuel des choses, les implémentations actuelles sont telles que le code PHP nécessite l'exécution d'un interprète, qui gère l'exécution. environnement.

Pour répondre à votre question sur le téléchargement de bytecode PHP pré-compilé, il est probablement possible, mais vous devrez implémenter un moyen permettant à l'interprète PHP de lire un tel fichier et de l'utiliser. il. Avec les caches d'opcode existants, cela ne semble pas être une tâche qui rapporterait beaucoup.

22
zombat

Depuis que la question a été posée pour la première fois, cette réponse est passée d’un "non" catégorique à une "sorte de"

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

Hip Hop for PHP était un compilateur qui prenait PHP code et le transformait en C++ hautement optimisé. Apparemment, certaines fonctions ne sont pas prises en charge (par exemple, "éclaté")

J'ai trouvé cette question en cherchant plus d'informations sur la mise en œuvre de HipHop et je pensais parler plus haut :)

Cependant, depuis 2013, Facebook ne l'utilise plus et il a été abandonné en faveur de HHVM, qui n'est pas un compilateur: https://en.wikipedia.org/wiki/HipHop_for_PHP

16
Alex C

Il y a aussi

qui a pour but

  • Pour encoder l'intégralité du script dans une application propriétaire PHP
  • Pour encoder des classes et/ou des fonctions dans une application propriétaire PHP
  • Pour permettre la production d'applications php-gtk pouvant être utilisées sur des postes de travail clients, sans avoir besoin d'un php.exe.
  • Réaliser l'étude de faisabilité pour un convertisseur PHP en C

L'extension est disponible auprès de PECL.

11
Gordon

Si vous cherchez simplement à produire un exécutable binaire à partir d'un script PHP, évitez donc de tenter de rendre votre question extrêmement précise, car cela ferait apparaître que vous savez exactement ce dont vous avez besoin. En outre, la plupart des PHP développeurs n'ont absolument aucune idée de ce qu'est un bytecode.

Cela dit, la réponse est OUI. Je viens de terminer la compilation d'un script PHP en binaire. Et pas n'importe quel binaire. J'ai utilisé le application CDE (lien vers Wayback Machine, le lien d'origine est maintenant cassé) pour le transformer en un binaire portable pouvant être distribué avec toutes les dépendances et exécuté sans aucun problème… et cela fonctionne à merveille.

Tout ce dont vous avez besoin est d'utiliser phc .

8
asiby

phc vous permet de compiler des programmes PHP dans des bibliothèques partagées, qui peuvent être téléchargées sur le serveur. Le programme PHP est compilé en binaires. Ceci est fait de manière à supporter evals, includes et toute la bibliothèque standard PHP.

8
Paul Biggar

Euh, n'importe qui a entendu parler de Zend Guard , qui fait exactement ce que cette personne demande. Il code/obscurcit le code PHP en "code machine".

7
John Dillick

Il existe plusieurs "compilateurs" de PHP code. La plupart d'entre eux ne supportent pas toutes les fonctionnalités de PHP, celles-ci devant simplement être interprétées lors de l'exécution.

Nous utilisons Phalanger - http://www.php-compiler.net/ - qui prend en charge même les fonctionnalités dynamiques sales PHP et est toujours en mesure de les compiler. NET Assembly, qui peut être distribué en tant que DLL autonome.

2
Jakub Míšek

Dans php 7, il y a l'option inp (php) ini opcache.file_cache qui enregistre le bytecode dans un dossier spécifique. In pourrait être utile dans php script cli qui sont "compilés" et enregistrés dans un dossier spécifique pour une réutilisation optimisée.

Opcache ne compile pas mais est quelque chose de similaire.

1
caiofior

voir 5.5.x avec le module OPcache intégré, volatile dans une mémoire partagée, beaucoup plus de performances et le principe de dynamisme de php restent inchangés.

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

1
cplusplus

PHP n'est pas vraiment compilé comme avec beaucoup de programmes. Vous pouvez cependant utiliser l'encodeur de Zend pour le rendre illisible.

0
Joe