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?
Réponses:
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 compiler
un certain nombre de solutions tierces.Tarte aux pêches
Phalanger
phc
Compilateur PHP Roadsend
bcompiler
bcompiler_write_exe_footer()
manuel )Project Zero
Bambalam
BinaryPHP
la source
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.
la source
include
etrequire
? Par exemple, si un script PHP est généralement inclus avecinclude( 'controller/' . $controller_name . '.php' )
, cela fonctionnera-t-il automatiquement avec HipHop? cheersThe 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.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
la source
pre-analyze
le 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.Il y a aussi
qui a pour but
L'extension est disponible auprès de PECL.
la source
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
eval
s,include
s et l'ensemble de la bibliothèque standard PHP.la source
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 .
la source
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".
la source
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.
la source
voir 5.5.x avec le module OPcache intégré, volatile dans une mémoire partagée, bien plus de performances et le principe de dynamisme de php restent intacts.
http://www.php.net/manual/en/opcache.installation.php
la source
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.
la source
PHP n'est pas vraiment compilé comme avec de nombreux programmes. Vous pouvez cependant utiliser l'encodeur de Zend pour le rendre illisible.
la source
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 (
clang
et 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 unclang
compilateur 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".
la source
Il y a aussi bcgen (un port PHP7 de bcompiler):
https://github.com/vjardin/bcgen/
(PHP7.2 uniquement)
la source