Shell interactif à l'aide de PHP
Me demandais, est-il possible de créer un shell interactif, à l'aide de PHP seul. Je veux dire quelque chose que vous avez avec les bases de données, python, etc.
Si elle l'est, comment?
Vous devez vous connecter pour publier un commentaire.
Oui, c'est possible. Pour être interactif, le programme doit être en mesure d'attendre et de lire les données saisies par l'utilisateur à partir de stdin. En PHP, vous pouvez lire stdin par l'ouverture d'un fichier descripteur de
'php://stdin'
. Prises de une réponse à une autre question, voici un exemple d'un utilisateur interactif invite dans PHP (lorsqu'il est exécuté depuis la ligne de commande, bien sûr):Bien sûr, pour obtenir une gamme complète d'entrée, plutôt que d'un seul caractère, vous auriez besoin de
fgets()
au lieu defgetc()
. Selon ce que votre programme/shell va faire, l'ensemble du programme peut être structurée comme une grande boucle continue. J'espère que ça vous donne une idée de la façon d'obtenir commencé. Si vous vouliez obtenir vraiment fantaisie (CLI pseudo-GUI), vous pourriez l'utilisation de ncurses.Depuis que cette question a été posée et répondue, une meilleure solution a été ajouté en PHP. Dans toutes les dernières versions de PHP, vous pouvez facilement obtenir la saisie de l'utilisateur de la manière suivante:
$input = rtrim(fgets(STDIN));
fgets(STDIN)
maintenant.La façon dont je le comprends votre question, vous voulez juste le PHP à exécuter sur la ligne de commande qui vous permettra d'évaluer le code PHP que vous tapez. J'ai utiliser cette fonctionnalité de Python tout le temps de tester les extraits de code. Dans ce cas, je crois que la réponse que vous cherchez est à exécuter (à partir de la ligne de commande):
En supposant que PHP est dans votre chemin ce sera vous laisser tomber dans le PHP interprète, comme il le fait sur la mienne:
À partir de là, vous pouvez commencer à évaluer PHP arbitraire d'expressions et de voir les résultats:
Voici une élargi prendre sur cette. J'ai ajouté une
isCLI()
vérifier dans le cas où vous êtes exécuter votre script à la fois dans l'interface de ligne et sur un serveur web. Sinon, le serveur pourrait boucle à l'aide de ma fonction. Cette solution demande de l'utilisateur, vérifiez l'entrée, et re-invite l'utilisateur fixe à l'entrée si nécessaire. Jertrim()
l'entrée parce que si l'utilisateur utilise le retour à soumettre leur entrée, qui peut être ajouté à l'entrée. La Validation n'est pas nécessaire, il suffit de ne pas passer une fonction dans ce cas.Il n'est pas entièrement claire de la question de savoir si vous voulez CRÉER l'environnement à l'aide de PHP seul, ou si vous souhaitez que le shell interactif pour traiter les commandes PHP. Je vais supposer ce dernier, et dans ce cas en est un exemple phpsh qui a apparemment été créé sur Facebook, mais il est écrit en python.
Je sais que l'interlocuteur ne voulait pas la deuxième option, mais pour ceux qui veulent la deuxième option que j'ai fait, en plus de
phpsh
, PHP c'est propre shell:Il suffit d'exécuter
php -a
.Ctrl
+Z
Enter
). Assez ennuyeux.Découvrez:
https://github.com/shaneharter/sheldon
Il est assez facile d'obtenir commencé. Il comprend Symfony2 et Zend Framework bibliothèques qui font beaucoup de base de la console I/O de travail et vous donne un plus haut niveau d'abstraction construite autour d'objets de Commande (avec la regex routes) et Contextes (qui détiennent état immuable).
L'une des choses que j'aime, c'est que "out of the box" de votre application peut fonctionner soit comme un shell interactif, ou en tant que norme de script que vous pouvez exécuter à partir de la ligne de commande, spécifier une commande, passer des arguments, et quand la commande est terminée, l'application se ferme.
Depuis PHP dispose d'un unix uniquement fonction
readline()
de faire exactement cela, ici en laissant les notes suivantes.Nous pouvons utiliser et de conserver le résultat de
readline
dans une var.Exemple de sortie:
l
ls résultath
«bonjour»q
sortiectrl+c
sortie.ctrl+d
avec entrée vide, passez à la prochaine séquence. «Merci».$user
est défini et vide, pas d'erreur.ctrl+d
avec certaines d'entrée: Aucune action. Toujours en attente pour l'entrée.ctrl+m
Continuer et prendre le courant d'entrée en$user
.ctrl+j
Continuer et prendre le courant d'entrée en$user
, même comportement quectrl+m
.Return
continuer à la prochaine séquence de «Grâce».$user
peut rester vide, pas d'erreur.ctrl+z
peut être utilisé pour annuler une boucle et le déplacer vers le haut.$user
sera unset si la var n'est pas défini dans ce champ d'application.En fonction de l'entrée, on peut définir des valeurs vides à l'aide de
!empty
ou faire plus d'chirurgicale des tests (la readline réponse peut être beaucoup de caractères).$user
peut être testé avec!isset
si pas encore demandé.Il est également intégré dans
readline_add_history()
pour stocker la saisie de l'utilisateur dans un objet, où les valeurs peuvent être récupérées directement par leur nom (Nice code pour plus de clarté):Très utile pour construire un vrai complexe fourre!
http://php.net/manual/en/function.readline.php