2010-08-11 31 views
4

j'ai un fichier nommé gcc.exe et j'ai une page php ... Je veux utiliser:Essayer de compiler un code C avec PHP

gcc test.c 

Et, s'il y a une erreur de compilation, je veux pour le montrer sur la page php ... Mais je ne peux pas. Qu'est-ce qui se passe est: Si le fichier est correct, il génère le fichier .exe, mais si c'est faux, rien ne se passe. Ce que je veux ici, encore une fois, c'est montrer toutes les erreurs.

Quelqu'un a une idée?

Modifier [1]: Certains code:

<?php 
exec("gcc teste.c",$results); 
print_r($results) 
?> 

Sortie:

*Nothing* 

Modifier [2]: I tryed mis sortie gcc sur un fichier texte: De cette façon (sur invite):

De manière théorique, tous les éléments de l'écran vont au fichier texte. Mais c'était sans souci!



Modifier [3]: quantumSoup: Je tryed et ...

array(0) { } int(1)

Rien ... Rien de plus?

+0

Veuillez montrer du code. –

+0

Une solution avec un fichier '.bat' est-elle possible? – Richard

+0

Il m'arrive quand le programme/commande que j'essaye de faire n'a pas les autorisations d'exécution (presque toujours d'Apache étant «personne» aux systèmes UNIX). Je ne pense pas qu'il existe une solution de contournement sans modifier la configuration du serveur, à laquelle vous n'avez peut-être pas accès –

Répondre

6

gcc est susceptible de générer une sortie d'erreur sur stderr, qu'il semble exec ne capture pas dans le tableau de résultats de $. Les solutions à ce problème sont susceptibles d'être spécifiques à une plate-forme. Si vous travaillez dans un environnement de type unix, il est possible de faire quelque chose comme gcc foo.c 2>&1 pour rediriger stderr vers stdout. Je n'ai aucune idée de comment on pourrait y parvenir sous Windows ou si des concepts analogues existaient. Peut-être que quelqu'un d'autre peut élaborer si votre question est spécifique à la plate-forme.

Ceci est supporté par le fait que la redirection vers un fichier ne fonctionnait pas non plus.

+0

Hum, je cours sous Windows (sht ... rs). Mais est temporellement ... je veux le stabiliser pour fonctionner sur Windows et sur Unix! – Richard

+0

Essayez proc_open() et configurez le troisième descriptiorspec/pipe pour obtenir la sortie stderr. – mario

+0

Exactement sur Linux! – Richard

3

exec() reference

string exec (string $command [, array &$output [, int &$return_var ]]) 

Essayez

exec('gcc test.c', $output, $return); 

var_dump($output); 
var_dump($return); 
+0

Peut-être souhaitez-vous également capturer le retour var. Si gcc ne sort rien, capturer le code de sortie de succès serait utile. –

+0

Je l'ai essayé, mais ne montre rien! – Richard

+0

@Richard: Essayez ma réponse éditée et publiez les résultats – quantumSoup

0

Utilisez proc_open pour capturer stderr:

<?php 
$process = proc_open('gcc test.c', 
    array(
     1 => array("pipe", "w"), //stdout 
     2 => array("pipe", "w") // stderr 
    ), $pipes); 

echo stream_get_contents($pipes[2]); 

donne, par exemple:

 
sh: gcc: command not found 
0

Nous utilisons un système basé sur PHP qui effectue construit et capture les résultats et les erreurs sous Windows. Nous avons eu le meilleur succès en ayant le script PHP créer un fichier de commandes contenant toutes les commandes de construction, puis exec-ce fichier batch.Lorsqu'il crée le fichier de commandes, il redirige la sortie standard du compilateur vers un fichier journal et l'erreur standard vers un autre (commandname >>log.txt 2>>err.txt). Comme votre sortie est partagée entre deux fichiers, il est également utile que le script génère des lignes qui répercutent les descriptions de ce qui se passe (comme "Bibliothèque de bibliothèques libsockets.dll") afin que vous puissiez mieux faire correspondre les deux journaux. Parfois, il est même utile de répercuter chaque commande avant qu'elle ne soit exécutée. Habituellement, votre processus de construction s'arrêtera lorsqu'une erreur est rencontrée (du moins c'est probablement devrait), donc le contenu du journal des erreurs correspond généralement à la fin du journal normal.