PHP cli Оптимизация использования памяти

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

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

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

в php-скрипте почти ничего нет. (coz я все еще разрабатываю его.) он только заменяет 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 

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

У вас есть советы по сокращению использования источника?

я уверен, вы будете смеяться над этим. я смотрел на неправильное место.

после длинной трассировки stdin / stdout кальмара. Я только что добавил оператор 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, вероятно, это все равно в более ранних версиях. Я только что потерял полдня 🙁 спасибо, что прочитали все.