PHP cli Оптимизация использования памяти - PullRequest
1 голос
/ 10 июля 2009

Я пытаюсь закодировать пользовательский url_rewriter для squid. а также с использованием некоторых других программ url_rewriter, таких как squidGuard поэтому нужно использовать обертку, чтобы можно было использовать обе или любую другую программу.

когда я пытаюсь зациклить с php. (это способ взаимодействия Squid с внешними программами. STDIN / STDOUT. он дает вам URL, и вы должны отправить новый или старый обратно. )

он имеет разрушительное использование памяти, даже ничего не делая. я изменил, чтобы обернуть его другим скриптом bash, это всего лишь несколько строк. & это зацикливается вместо php. звонит php внешне. когда скрипт php завершен с URL, он возвращается и выходит. этот способ намного лучше, чем вместо того, чтобы зацикливать скрипт php.

в php скрипте почти ничего сейчас нет. (потому что я все еще развиваю это.) он заменяет только video.yahoo.com на youtube.com. и несколько переменных и explode () для разбора входной строки, вот и все ... но скрипт все еще использует огромное количество памяти


вот верхний вывод:

 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   

вот скрипт 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);

А вот и скрипт 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

Я уже погуглил, чтобы найти какую-либо полезную документацию по PHP и использованию исходного кода, но не повезло.

Есть ли у вас какие-либо рекомендации по снижению использования источника?

1 Ответ

0 голосов
/ 10 июля 2009

Бьюсь об заклад, вы будете смеяться над этим. я искал не в том месте.

после долгого отслеживания stdin / stdout squid. Я только что добавил оператор if в цикле. контролировать длину строки в качестве URL.

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

результат: в фоновом режиме больше нет ожидающих php процессов. потому что это обработка и выход всего за миллисекунды.

без оператора IF squid отправляет в скрипт пустые места и символы новой строки, поэтому он никогда не останавливается. я обрезал входную строку с помощью php, поэтому я не мог получить странные stdins ранее squid. обрезка $ argv - это просто привычка. Версия squid была 2.6stable7, вероятно, в предыдущих версиях все то же самое. Я только что потерял полдня :( Спасибо всем, кто прочитал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...