2010-08-30 8 views
8

J'ai un script php qui gère une entrée de formulaire. Pour des raisons de conception à la fois un peu hors de mon contrôle, et que je ne souhaite pas entièrement changer, je dois appeler un script perl avec les paramètres spécifiés dans le formulaire html.Appel de perl à partir de php?

J'ai assaini toutes les entrées, puis les ai sorties dans un fichier appelé input, qui est lu par le script perl nommé, par souci de brièveté dans cette question, script.pl. Script.pl devrait faire quelques choses et ensuite écrire toutes les sorties dans un fichier nommé output.

J'appelle le script perl de php comme ceci:

system('perl script.pl 2>errors'); 

Pas bon, rien ne se passe. la sortie n'est pas créée, les erreurs ne sont pas créées et l'effet secondaire ne se produit pas.

Mon apache s'exécute en tant qu'ID utilisateur et groupe www-data. Mon répertoire est défini avec 775 paramètres avec la propriété comme moi: www-data. (Mon nom d'utilisateur est remplacé par "moi" pour des raisons d'intimité).

Ma question est double: 1) Est-ce que je fais mal? Si oui, comment devrais-je améliorer le code? 2) Existe-t-il un moyen plus sain de détecter les erreurs dans l'exécution du système?

Après avoir programmé en perl pendant un moment, php se sent comme une douleur dans le cul.

OS: édition serveur Ubuntu

+2

Pour des fins de test: Avez-vous obtenir une sortie avec 'passthru ('perl script.pl 2> &1');' – VolkerK

+0

passthru() fait tout comme prévu Que se passe ??? –

+0

Lire:. Http://php.net/manual/fr/function.passthru.php –

Répondre

1

popen peut être utilisé pour obtenir la réponse du shell. c'est votre meilleur pari. Ce qui peut vous aider à déboguer pourquoi le système est en colère. aussi, si votre pl dit "bonjour" et "au revoir", popen peut même lire cela.

Si la commande à exécuter n'a pas pu être trouvée, une ressource valide est renvoyée. Cela peut sembler étrange, mais cela a du sens; il vous permet d'accéder à n'importe quel message d'erreur retourné par le shell

Idéalement, j'aurais pris des données de stdin et écrit sur stdout. popen permettrait un accès net aux deux.

popen('pwd;perl script.pl 2>errors;echo done');

alors vous pouvez voir où étiez-vous (répertoire) lorsque le système se est appelé et l'a fait « fait ».

+0

Dans le même ordre d'idées, j'ai récemment découvert que 'proc_open' est incroyablement puissant quand on exécute d'autres processus via php, et ce n'est pas aussi difficile à utiliser que ça peut l'être en premier. – grossvogel

0

est-perl dans le chemin? Peut-être avez-vous besoin de le spécifier complètement (par exemple,/usr/bin/perl). System() renvoie false, indiquant un échec? Si vous essayez quelque chose de plus simple, comme system('/usr/bin/true', $retval), est-ce que $retval est réglé sur 1?

+0

Le chemin perl est défini, exécutant la commande manuellement sur le terminal. Cependant, je viens de mettre une vérification, et l'appel système retourne false. –

+0

Peut-être que la commande perl est dans le chemin de votre login/shell interactif mais pas pour le processus du serveur web? – VolkerK

+0

J'ai spécifié le chemin absolu et il renvoie toujours faux, y at-il un moyen de vérifier l'erreur de system()? –

0

Jetez un coup d'œil au PHP system() documentation. Ce qui suit est le prototype de la fonction du système():

string system (string $command [, int &$return_var ]) 

passe dans un 2ème argumentation et ensuite imprimer la chaîne de retour, ainsi que la deuxième variable. Voyez ce que l'erreur dit.

1

Dans le passé, j'ai utilisé shell_exec() ou les guillemets pour effectuer cela.

La documentation de la valeur de retour de shell_exec indique qu'il est identique à l'opérateur backtick:

Valeurs de retour

La sortie de la commande exécutée.

Espérons que ça aide. System() renvoie uniquement le code d'état.

$var = shell_exec ("ls"); 
print $var; 
$var = `ls -l`; 
print $var;