2016-08-04 1 views
6

Je le code suivant:Comment lancer vi depuis Symfony Process?

 
     $process = new Process('vi'); 

     try { 
      $process->setPty(true); 
      $process->mustRun(function ($type, $buffer) { 
       echo $buffer; 
      }); 
      //echo $process->getOutput(); 
     } catch (ProcessFailedException $e) { 
      echo $e->getMessage(); 
     } 

Cependant, il meurt pour moi avec les informations suivantes:

 
The command "vi" failed. 

Exit Code: 1(General error) 

Working directory: [path] 

Output: 
================ 
Vim: Error reading input, exiting... 
Vim: Finished. 


Error Output: 
================ 
Vim: Warning: Output is not to a terminal 
Vim: Warning: Input is not from a terminal 

MISE À JOUR

On peut dire qu'elle n'a pas été clair pour certaines personnes ce que je Je vais faire. Je vais expliquer. Ce script est en cours d'exécution dans la console. La même chose fonctionne via passthru (bien que Vim avertisse encore de la sortie). Je veux avoir un processus interactif qui permettra aux utilisateurs de modifier un fichier avant son envoi quelque part. Je ne veux pas implémenter mon propre éditeur et c'est pourquoi je veux qu'ils utilisent vi. vi est disponible sur mon serveur (il est clairement visible depuis la sortie fournie).

+1

Eh bien, êtes-vous certain que vous pouvez exécuter vi par php? (Au moins si vous parlez de l'éditeur de texte linux) – Epodax

+0

Je suis certain. Il est possible de l'exécuter en utilisant passthru(). Mon but est d'exécuter un processus interactif dans lequel un utilisateur aura la possibilité de modifier un fichier qui sera envoyé quelque part après ses modifications. –

Répondre

4

Ici on m'a donné une bonne réponse: https://github.com/symfony/symfony/issues/19528

Fondamentalement, je devais utiliser $process->setTty(true).Ainsi, l'exemple complet sera:

$process = new Process('vi'); 

    try { 
     $process->setTty(true); 
     $process->mustRun(function ($type, $buffer) { 
      echo $buffer; 
     }); 
    } catch (ProcessFailedException $e) { 
     echo $e->getMessage(); 
    } 
-2

Pourquoi voudriez-vous faire cela? vi est quelque chose qui est contrôlé par le clavier. Si vous en avez besoin, vous devrez peut-être vérifier le chemin complet et si php/symfony a accès à ce chemin. Probablement votre script php n'a pas accès à ce script, et le serveur web (je suppose que vous parlez d'une application web ici) peut ne pas être autorisé à démarrer un shell de connexion sur le serveur n'importe où. Ce serait génial si vous pouviez fournir plus de détails sur votre objectif + environnement.

Si vous souhaitez simplement éditer/manipuler le fichier, la commande sed peut être une option. Ou ouvrir/manipuler le fichier directement avec php pourrait être encore mieux.

+0

Mon but est d'exécuter un processus de console interactive dans lequel un utilisateur aura la possibilité de modifier un fichier qui sera envoyé quelque part après ses modifications. Et je n'ai pas de serveur web du tout. PHP a accès à vi (à coup sûr, comme passthru fonctionne). Il est autorisé de démarrer le shell de connexion, puisque je le lance depuis la console. –

+1

@DenisV Vous pouvez vérifier s'il existe un jeu de variables d'environnement 'EDITOR' et l'utiliser à la place s'il est défini. De cette façon, si un utilisateur a configuré son éditeur de cli par défaut pour être 'nano',' emacs', 'vi',' vim', 'neovim', ou autre chose, cela fonctionnera. Si 'EDITOR' n'est pas défini, vous pouvez bien entendu supposer qu'ils ont' vi' par défaut. – Paulpro

+0

@Paulpro oui, merci pour vos conseils. En fait, c'était la prochaine chose que j'allais faire, mais sans pouvoir lancer 'vi', cela n'avait aucun sens. En tout cas, merci. :) –

0

Votre question prend tout son sens par la façon ..

Mes pensées sont:

  • Vous pouvez obtenir un code de sortie: 1 -> Ce qui signifie que le nom du fichier à modifier n'a pas été spécifié . Bien que je puisse me tromper. Il affiche "Répertoire de travail: [chemin]". Ce qui me dit, peut-être que le chemin manque.
  • En outre, je ne sais pas quel utilisateur (sur le système) exécute le composant de processus Symfony.

Alors peut-être essayer:

$process = new Process('vi /tmp/temp.file'); 

Utilisez/tmp parce que tout le monde devrait avoir accès, également possible un dossier Web qui est accessible en écriture. Une autre pensée, est de lancer le processus avec sudo et spécifiez l'utilisateur vimrc:

$process = new Process('sudo vim -u ~user/.vimrc /tmp/temp.file'); 

Mais vous pourriez avoir besoin de passer l'entrée (comme mot de passe sudo):

$process->setInput('someSudoPassword'); 

Mais qui passe sudo Je don 't sais. Encore une fois, je ne suis pas sûr quel utilisateur exécute le composant de processus.

Ce ne sont là que quelques réflexions, et je ne suis pas certain que cela résoudra quoi que ce soit mais j'espère que cela pourrait vous aider, ou même aider à réfléchir à une autre façon de gérer cela.

+0

Merci pour votre réponse. 'vi' peut être exécuté sans spécifier le chemin ou le nom de fichier. '[chemin]' ici était juste mon répertoire local qui n'était pas pertinent à la question, donc je l'ai sauté. J'ai aussi essayé cela sous root, donc 'sudo 'n'est pas le cas ici. –