Pouvez-vous «compiler» du code PHP et télécharger un fichier binaire, qui sera simplement exécuté par l'interpréteur de code d'octet?

225

Je sais que PHP est compilé en code octet avant d'être exécuté sur le serveur, puis ce code octet peut être mis en cache afin que le script entier ne doive pas être réinterprété à chaque accès Web.

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

Carson Myers
la source
Une question connexe: compilateur PHP pour Windows
Palec
3
Veuillez ne pas marquer cela avec hhvm ni hiphop . HHVM n'est pas une partie inhérente de la question, juste une réponse possible. meta.stackexchange.com/a/149347/238706
Palec
@HalayemAnis Je pense que vous avez mentionné un mauvais lien .. Pouvez-vous fournir le lien correct pour ce tutoriel? ou tout dernier gars de mise à jour?
CJ Ramki
@CJRamki désolé, veuillez utiliser ce lien COMPILE_PHP
Halayem Anis
Cette question est en fait assez vague. Vous pouvez "simplement" construire un compilateur PHP qui compile (dans son sens le plus complet) votre code source et un interpréteur PHP en ELF, EXE ou autre.
Sebastian Mach

Réponses:

234

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

Au-delà de cela, la recherche sur Google propose PHP compilerun certain nombre de solutions tierces.

Tarte aux pêches

  • 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

  • GitHub (téléchargement), Wikipedia
  • compile en .NET (CIL) semble arrêté depuis juillet 2017 et ne semble pas prendre en charge PHP 7.

phc

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

Compilateur PHP Roadsend

bcompiler

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

Project Zero

  • Wikipédia , IBM
  • incubateur de changements pour WebSphere sMash
  • pris en charge par IBM
  • compile en bytecode Java
  • semble abandonné maintenant (février 2014) - site Web en panne, ressemble à un grand battage médiatique en 2008 et 2009

Bambalam

  • se 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) - dernière modification en 2003
Frank Farmer
la source
Qu'en est-il de l'hébergeur Web partagé? Puis-je compiler mon script PHP avec l'un de ces compilateurs puis le télécharger sur mon hébergeur basé sur Linux?
SaidbakR
2
@ sємsєм cela dépend de votre hôte, mais si je devais deviner, je suppose que beaucoup d'hôtes ne le permettraient pas.
Frank Farmer
2
Aucun de ces projets ci-dessus ne semble plus être maintenu. Existe-t-il un compilateur généralement accepté depuis les 2 dernières années ou pourquoi tous ces projets sont-ils ignorés / abandonnés?
Preexo
Une belle liste de compilateurs PHP est sur thefreecountry.com. Tous les outils mentionnés ici sont inclus dans cette réponse maintenant.
Palec
1
Étant donné que tous semblent morts, la réponse semble être «non».
Ira Baxter
22

La réponse courte est non".

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

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

zombat
la source
3
C'est souvent le cas où vous avez besoin d'un interpréteur pour exécuter correctement les programmes PHP, mais cela ne signifie pas qu'un compilateur ne peut pas le fournir dans le code compilé. phc (phpcompiler.org) gère tous les problèmes que vous décrivez. À ma connaissance, Roadsend (RoadSend.com) le fait aussi.
Paul Biggar
28
Cette réponse est obsolète - HipHop a été publié 6 mois après sa publication, en février 2010.
Frank Farmer
1
@FrankFarmer Avez-vous une expérience avec HipHop? HipHop fonctionne-t-il correctement avec includeet require? Par exemple, si un script PHP est généralement inclus avec include( 'controller/' . $controller_name . '.php' ), cela fonctionnera-t-il automatiquement avec HipHop? cheers
Lea Hayes
2
En fait, vous pouvez compiler du code PHP, en utilisant des compilateurs PHP réguliers. Cela dépend simplement de la plate-forme cible; vous pouvez compiler en opcode Zend, en langage C ou en assemblys .NET (en utilisant Phalanger php-compiler.net )
Jakub Míšek
1
The short answer is "no". The current implementation of PHP is that of an interpreted language. You can argue the theoretical aspects…Il n'y a rien de théorique là-dedans, beaucoup de langages interprétés ont des compilateurs; à savoir AutoIt / AutoHotkey, ou même aussi loin que BASIC. Il existe de nombreux programmes qui y ont été écrits, puis compilés pour être utilisés par le public en tant que programmes autonomes. PHP n'a rien de spécial pour l'empêcher d'être compilable, c'est pourquoi il existe un tas de compilateurs, mais contrairement à AHK, il n'y a pas de compilateur officiel, testé, Zend Guard ne compte pas tout à fait.
Synetech
16

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

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

Hip Hop pour PHP était un compilateur qui a pris du code PHP et l'a transformé en C ++ hautement optimisé. Apparemment, certaines fonctions ne sont pas prises en charge (par exemple 'exploser')

J'ai trouvé cette question en cherchant plus d'informations sur la façon d'implémenter HipHop et j'ai pensé parler franchement :)

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

Alex C
la source
3
c'est ce que Facebook utilise, je crois
Richard H
Le "genre de" se situe maintenant quelques années en arrière et comme le HHVM (HipHop Php) s'améliore de jour en jour, il y a enfin un moyen (je pense). En utilisant HHVM, il est aujourd'hui possible d'utiliser pre-analyzele code php. En conséquence, vous obtenez un fichier de cache binaire. Avec ce fichier et la configuration HHVM correcte, il est possible d'exécuter une page Web uniquement avec du bytecode, plus besoin des fichiers source;) <br> J'espère que j'ai bien compris.
PKeidel
@Andrea, qu'entendez-vous par obsolescence de HHVM? Il semble maintenu et vivant comme un projet. Ou voulez-vous dire que le nom est passé de Hip Hop pour PHP à HHVM? Parler de dépréciation est alors trompeur.
Palec
1
@Palec HipHop pour PHP a été interrompu. C'était un compilateur PHP vers C ++ que Facebook utilisait, mais il produisait une sortie lourde (binaires de plusieurs Go) et ne pouvait pas prendre en charge le langage complet. HHVM est un projet successeur qui partage une partie du même code, mais n'est pas un compilateur. HHVM est une machine virtuelle. Facebook ne prend plus en charge HipHop.
Andrea
11

Il y a aussi

qui a pour but

  • Pour encoder un script entier dans une application PHP propriétaire
  • Pour coder certaines classes et / ou fonctions dans une application PHP propriétaire
  • Pour permettre la production d'applications php-gtk qui pourraient être utilisées sur les postes clients, sans avoir besoin d'un php.exe.
  • Faire l'étude de faisabilité d'un convertisseur PHP vers C

L'extension est disponible auprès de PECL.

Gordon
la source
8

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. Il est fait de manière à prendre en charge evals, includes et l'ensemble de la bibliothèque standard PHP.

Paul Biggar
la source
8

Si vous cherchez simplement à produire un exécutable binaire à partir d'un script PHP, alors évitez d'essayer de rendre votre question extrêmement précise car cela donnera l'impression que vous savez exactement ce dont vous avez besoin. De plus, la plupart des développeurs PHP n'ont absolument aucune idée de ce qu'est un bytecode.

Cela dit, les réponses sont OUI . Je viens de terminer la compilation d'un script PHP en binaire. Et pas n'importe quel binaire. J'ai utilisé l' application CDE (lien vers Wayback Machine, le lien d'origine est maintenant rompu) pour le transformer en un binaire portable qui peut ê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 .

asiby
la source
7

Hum, tout le monde a entendu parler de Zend Guard , qui fait exactement ce que cette personne demande. Il code / obscurcit le code PHP en "code machine".

John Dillick
la source
1
Je ne pense pas qu'ils voulaient l'obscurcissement autant que les accélérations résultant de l'interpolation de bytecode plutôt que de source.
Stephen
@Stephen Zend Guard est également censé le faire.
Gajus
Zend Guard a décidé de ne pas supporter PHP 7, ce qui est un inconvénient - blog.zend.com/2016/10/10/zend-guard-and-php-7/#.W7YISnszaM8
vj
2

Il existe plusieurs "compilateurs" de code PHP. La plupart d'entre eux ne prennent pas en charge toutes les fonctionnalités PHP, car elles doivent simplement être interprétées pendant l'exécution.

Nous utilisons Phalanger - http://www.php-compiler.net/ - qui supporte même ces fonctionnalités dynamiques PHP sales, et est toujours capable de les compiler en tant qu'assemblage .NET, qui peut être distribué en tant que DLL autonome.

Jakub Míšek
la source
1

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

Opcache n'est pas en train de compiler mais c'est quelque chose de similaire.

caiofior
la source
"En php 7" ce n'est pas seulement PHP7, c'est PHP 5.5.0 et plus tard
Raymond Nijland
0

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

Joe
la source
n'est-il pas compilé de la même manière que perl est compilé?
Carson Myers
PHP est compilé sur le serveur à la volée je crois. J'ai cependant utilisé un encodeur pour masquer le code source. Si c'est ce qui vous inquiète. Ils fonctionnent vraiment bien.
Joe
non, je m'intéressais juste à l'aspect théorique
Carson Myers
2
PHP n'est pas respecté, c'est un langage interprété. le cache contient des «opcodes» que php interprète (sans avoir à lire le texte), le code php ne peut pas être «exécuté» directement comme vous le feriez avec c
borrel
0

Si vous êtes autorisé à exécuter de vrais binaires natifs, voici votre compilateur:

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

C'est un compilateur PHP écrit en PHP!

Il compile du code PHP dans son propre code VM. Ce code VM peut ensuite être interprété par son propre interpréteur (également écrit en PHP, n'est-ce pas fou?) Ou il peut être traduit en Bitcode. Et en utilisant le framework de compilateur LLVM ( clanget co), ce Bitcode peut être compilé en un binaire natif pour n'importe quelle plateforme prise en charge par LLVM (à peu près n'importe quelle plateforme qui compte aujourd'hui). Vous pouvez choisir de le faire de manière statique ou à chaque fois juste avant l'exécution du code (style JIT). Ainsi, les deux seules conditions requises pour que ce compilateur fonctionne sur votre système sont un interpréteur PHP installé et un clangcompilateur installé .

Si vous n'êtes pas autorisé à exécuter des binaires natifs, vous pouvez utiliser le compilateur ci-dessus comme interpréteur et le laisser interpréter son propre code VM, mais cela sera lent car vous exécutez un interpréteur PHP qui s'exécute lui-même sur un moteur PHP, donc vous avez une "double interprétation".

Mecki
la source