【问题标题】:PHP cli Memory usage optimizationPHP cli 内存使用优化
【发布时间】:2010-11-09 14:04:04
【问题描述】:

我正在尝试为 squid 编写自定义 url_rewriter。 以及使用其他一些 url_rewriter 程序,如 squidGuard 所以必须使用包装器才能使用两者或任何其他程序。

当我尝试使用 php 循环时。 (这就是 squid 与外部程序通信的方式。 标准输入/标准输出。它为您提供了一个网址,您必须将新网址或旧网址发回。 )

即使什么都不做,它也会消耗大量内存。 我已更改为用另一个 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 cli 和源代码使用的有用文档,但没有运气。

您对减少资源使用有什么建议吗?

【问题讨论】:

  • 抱歉代码查看问题。我无法通过不同的粘贴方法修复:(
  • 粘贴代码的简单方法:复制并粘贴,然后选择代码并按工具栏中的 101010 按钮(或按 Ctrl-K)。这会将其格式化为代码。
  • 谢谢约翰。 :) 有效。我的意思是 ctrl+K 而不是试图粘贴选定的文本。
  • 使用 php.ini 瘦身加载的 php 选项也不起作用 :( 现在没有会话支持、文件上传、没有额外的模块、没有额外的数据库选项。等等。我做了第二个php.ini & 使用 -c 参数执行新的 php.ini。没有结果。每个进程仍在使用 2.5 - 2.9 mb。顺便说一句。我没有任何编译器。因为它是一个 ipcop 框。

标签: bash optimization memory php


【解决方案1】:

我打赌你会笑的。我看错地方了。

在长时间跟踪 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 修剪输入字符串,这就是为什么我无法获得更早的 squid 奇怪的标准输入的原因。修剪 $argv 只是一种习惯。 squid 版本是 2.6stable7 可能在早期版本中都是一样的。 我刚刚失去了半天:( 谢谢大家阅读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    相关资源
    最近更新 更多