2010-06-05 7 views
0

Je dois exécuter une commande Linux more en PHP à partir d'un décalage particulier, formater le résultat et afficher le résultat dans le navigateur.L'exécution de la commande système en PHP diffère en utilisant le navigateur et en utilisant la ligne de commande

Mon code ci-dessus est:

<html> 
<head> 
    <META HTTP-EQUIV=REFRESH CONTENT=10> 
    <META HTTP-EQUIV=PRAGMA CONTENT=NO-CACHE> 
    <title>Runtime Access log</title> 
</head> 
<body> 
    <?php 
    $moreCommand = "more +3693 /var/log/apache2/access_log | grep -v -e '.jpg' -e '.jpeg' -e '.css' -e '.js' -e '.bmp' -e '.ico'| wc -l"; 
    exec($moreCommand, $accessDisplay); 
    echo "<br/>No of lines are : $accessDisplay[0] <br/>"; 
    ?> 
</body> 
</html> 

La sortie du navigateur est: Nombre de lignes sont les suivantes: 3428 (Ceci est faux)

Lors de l'exécution de la même commande en ligne de commande donne un sortie différente. Mon extrait de code pour le même est:

<?php 
    $moreCommand = "more +3693 /var/log/apache2/access_log | grep -v -e '.jpg' -e '.jpeg' -e '.css' -e '.js' -e '.bmp' -e '.ico'| wc -l"; 

    exec($moreCommand, $accessDisplay); 
    echo "No of lines are : $accessDisplay[0] \n"; 
?> 

La sortie à la ligne de commande est: Non de lignes sont: 279 (Ceci est correct)

Lors de l'exécution de la même commande directement en ligne de commande, me donne sortie de 279.

Je n'arrive pas à comprendre pourquoi la sortie de la même commande est incorrecte dans le navigateur. C'est en fait donner le nombre de lignes, en ignorant le paramètre offset.

Répondre

0

Quelle serait la différence dans:

$moreCommand = "more -f -99999 +3693 /var/log/apache2/access_log | grep -v -e '.jpg' -e '.jpeg' -e '.css' -e '.js' -e '.bmp' -e '.ico' -c" 

(-f & -num plus, -c à grep au lieu de | wc -l)

Dans le débogage, il pourrait aussi être utile à Examinez la sortie exacte sans compter le 2 (peut-être en utilisant la tête ou la queue), car il peut y avoir des différences de shell entre les utilisateurs du serveur web cli &.


OK, qui a eu tort, peut reproduire plus ne pas obtenir le '+', alternative:

$moreCommand = "tail --lines=`wc -l /var/log/apache2/access_log | awk '{print $1 - 3693}' | grep -v -e '.jpg' -e '.jpeg' -e '.css' -e '.js' -e '.bmp' -e '.ico' ` 
+0

Salut Wrikken, merci pour votre réponse. Ici mon intention n'est pas de compter les lignes mais d'obtenir les lignes mêmes. La commande de mon programme est: $ moreCommand = "more + $ existingWordCount/var/log/apache2/access_log | grep -v -e '.jpg' -e '.jpeg' -e '.css' -e '. js '-e' .bmp '-e' .ico '". J'ai utilisé "wc -l" juste pour faciliter la mise en évidence de mon problème et pour montrer la différence b/w ma ligne de commande o/p et navigateur o/p J'ai essayé d'utiliser l'option -f & -num mais elle a pas aidé à servir le but. Le script php ignore toujours le paramètre + linenum. Y a-t-il une autre option disponible? – Amit

+0

Ah, maintenant je vois. Je peux reproduire le problème ici, aucune idée pourquoi ce serait. Ajout de la seule autre solution qui fonctionne que je pourrais penser à la réponse. – Wrikken

1

Je vous recommande de laisser tomber le pipeline shell et d'analyser le fichier journal en PHP directement. Beaucoup plus de contrôle. Beaucoup moins de tracas et certainement plus robuste.

+0

Salut Noufal, merci pour votre réponse. Le problème sur lequel je dois travailler est, je dois afficher le journal d'accès, mais d'un décalage (compteur de la dernière ligne affichée), à ​​la position actuelle du curseur. Comment puis-je y parvenir en php? Pouvez-vous s'il vous plaît m'aider avec l'extrait de code exemple? Thanx – Amit

+0

Vous pouvez simplement lire ligne par ligne jusqu'à votre décalage désiré en sautant toutes les lignes jusque là, puis commencer le traitement. Je ne suis pas sûr de ce que vous entendez par "position du curseur" car ce n'est pas interactif. –

Questions connexes