2009-07-10 6 views
1

J'essaye de coder un url_rewriter personnalisé pour calamar. & également en utilisant d'autres programmes url_rewriter comme squidGuard donc devez utiliser un wrapper pour pouvoir utiliser les deux ou n'importe quel autre programme.PHP cli Optimisation de l'utilisation de la mémoire

lorsque j'essaie de boucler avec php. (c'est ainsi comment calmars communique avec des programmes externes. STDIN/STDOUT. Il vous donne une url & vous devez envoyer le nouveau ou ancien arrière.)

il a une utilisation de la mémoire dévastatrice faisant même rien. J'ai changé pour l'envelopper avec un autre script bash ce n'est que quelques lignes. & il boucle au lieu de php. appelle php en externe. Lorsque le script php est terminé avec l'URL, il retourne &. de cette façon est beaucoup plus préférable qu'au lieu de boucler le script PHP.

dans le script PHP presque il n'y a rien maintenant. (coz je le développe toujours.) il remplace seulement video.yahoo.com sur youtube.com. et quelques variables et un explode() pour analyser la chaîne d'entrée qui est tout ... mais le script utilise encore énorme quantité de mémoire


est ici la sortie supérieure:

PID USER VIRT RES SHR S %CPU %MEM TIME+ COMMAND 

32059 squid 19720 7432 4396 R 0.9 2.9 0:00.02 php  
32063 squid 19720 7436 4396 R 0.9 2.9 0:00.02 php  
32066 squid 19720 7436 4396 R 0.9 2.9 0:00.02 php  
32068 squid 19460 6188 3472 R 0.9 2.4 0:00.02 php  
32070 squid 19720 7432 4396 R 0.9 2.9 0:00.02 php  
32074 squid 19588 6792 3924 R 0.9 2.6 0:00.02 php  
32077 squid 19720 7436 4396 R 0.9 2.9 0:00.02 php 

ici est le script PHP

#!/opt/lampp/bin/php -q 
<php 
ini_set('html_errors',false); 
ini_set('implicit_flush',true); 
ini_set('max_execution_time',0); 
ini_set('register_argc_argv',true); 

$nl="\n"; $tab="\t"; 
$ds=DIRECTORY_SEPARATOR; 
$lamppdir='/opt/lampp/'; 
$htdocsdir='/opt/lampp/htdocs/'; 
$wdir='/opt/lampp/htdocs/bin/'; 
$incdir=$htdocsdir.'inc/'; 
$logfile=$wdir.'log.txt'; 

if ($argc>1){ 
    $return=$argv[1]; 
    $return=explode(' ',trim($return)); 
    $url=$return[0]; 
    $sourceip=$return[1]; 
    $user=$return[2]; 
    $method=$return[3]; 
    $urlgroup=$return[4]; 
    $myip=$return[5]; 
    $myport=$return[6]; 

    $logdata=$argv[1]; 

    // if(strlen($logdata)>50){ file_put_contents($logfile,$logdata.$nl,FILE_APPEND); } 

    fwrite(STDOUT,$return[0]."\r\n"); 
} 

exit(0); 

Et voici le script bash

#!/bin/bash 
lamppdir=/opt/lampp/ 
phpexecpath=/opt/lampp/bin/php 
phpredirectorpath=/opt/lampp/htdocs/bin/redir.php 
logdfile=/opt/lampp/htdocs/bin/log.txt 
forcedexit=false 

while [ "${forcedexit}" != "true" ] 
do 
    read squidinput 
    phpout=`"${phpexecpath}" "${phpredirectorpath}" "${squidinput}"` 
    echo "${phpout}" 
done 

echo "\r\n" 

exit 0 

i déjà googlé pour trouver toute la documentation utile sur l'utilisation des sources PHP cli & mais pas de chance.

Avez-vous des conseils pour diminuer l'utilisation de la source?

+0

désolé pour le code de vue problème. Je n'ai pas pu corriger via différentes méthodes de collage :( – risyasin

+0

Façon facile de coller le code: copiez et collez-le, puis sélectionnez le code et appuyez sur le bouton 101010 dans la barre d'outils (ou appuyez sur Ctrl-K). code –

+0

Merci John. :) cela a fonctionné. Je veux dire ctrl + K au lieu d'essayer de coller le texte sélectionné. – risyasin

Répondre

0

Je parie que vous en rirez. Je regardais au mauvais endroit.

après un long chemin stdin/stdout de calmar. Je viens d'ajouter une instruction if dans la boucle. pour contrôler la longueur de la chaîne sous forme d'URL.

while [ "${forcedexit}" != "true" ] 
do 
    read squidinput 
    if [ -n squidinput ] 
     then 
     phpout=`"${phpexecpath}" "${phpredirectorpath}" "${squidinput}"` 
     echo "${phpout}" 
    fi 
done 

résultat: il n'y a plus de processus php en attente à l'arrière-plan. car il gère & se terminant juste en millisecondes.

sans l'instruction IF squid envoie des espaces vides et des sauts de ligne au script afin qu'il ne s'arrête jamais. J'ai coupé la chaîne d'entrée avec php c'est pourquoi je ne pouvais pas obtenir plus tôt stdins étranges de squid. couper $ argv est juste une habitude apportée. la version squid était 2.6stable7, c'est probablement la même chose dans les versions précédentes. je viens de perdre une demi-journée :( merci pour tout le monde lire