动态修改HTML内容=>慢

时间:2013-04-04 20:54:57

标签: http networking header proxy protection

我们正在开发基于PROXY的保护软件。它捕获用户的http请求,执行代理内容,捕获http响应,修改其内容并将其发送回原始用户。

我们有两次尝试:

  1. SQUID代理和PHP外观SQUID。 这很有希望,但是在PHP流中,我们不知道我们预期的响应数据的长度,所以每次都是超时=> SLOW

  2. 现在,我们编写了一个.net应用程序。它可以完成我们需要的一切,而且速度非常快,甚至不会修改内容。如果我们需要GZIP / GUNZIP,或者只是修改内容,它会变得很慢。

  3. 你能帮助我们吗?

    我们在匈牙利的大学工作了近一年。我们编写了一个自动,自学习的完整语义分析器引擎,可以用所有语言进行分析和解释,并可以检测和筛选目标内容。我们还构建了一个图像识别软件,可以在所有图像中以90%的置信度检测目标对象。

    所以一切准备就绪,但我们的代理应用程序被卡住了。

    如果有人写的话,我们也可以为这份工作买单。

2 个答案:

答案 0 :(得分:0)

我花了很多时间用PHP编程 - 是的,作为一种解释型语言,它可能很慢 - 并且有大量编写得很糟糕的代码 - 但即使在你开始触摸代码之前,调整环境也可以将执行时间缩短5-10倍。然后更改代码可以使它更快地运行;最大的胜利来自于对架构和数据结构的良好选择(任何语言都是如此 - 不仅仅是PHP)。

我不知道你从哪里开始,但令人惊讶的是你无法相对于生成内容并通过网络发送内容所花费的时间来处理流。因为它是超时的东西是非常错误的。 (你不是试图使用XML解析器解析HTML吗?)。除非您尝试将所有内容同时映射到PHP的地址空间,否则内容的长度对脚本的性能几乎没有影响。

然而,AFAIK,使用PHP直接在Squid中实现内容过滤器是不可能的(如果你这样做,我很想知道你是怎么做的,如果你已经实现了ICAP,那就非常有趣了)。我猜你正在使用URL重定向器通过用PHP编写的代理脚本来路由请求。

可以用C / C ++编写ECAP模块。

图像识别和自然语言处理在编程中不是一件容易的事 - 所以你必须让一些优秀的程序员在你的团队中工作。真正解决你的问题远远超出了堆栈溢出答案的范围,并且对承包商的兜售绝对不是主题。

答案 1 :(得分:0)

感谢您的回复!

首先:我们的PHP非常快,fsockopen很慢,因为它无法知道何时从SQUID关闭响应连接。

这是我们的代码:

$buffer = socket_read($client, 4096);
    if ( !($handle = fsockopen(HOST, SQUIDPROXYPORT, $errno, $error, 1)) ) {
        Log::write($this->log, 'Errno: ' . $errno . ' Error: ' . $error . "\n" . $buffer);
        exit('Nem sikerült csatlakozni! ' . $errno . ':' . $error);
    }
    stream_set_timeout($handle, 0, 100000);

    fwrite($handle, $buffer);

    $result = '';
    do {
        $tmp = fgets($handle, 1024);
        if ( $tmp ) {
            $result .= $tmp;
        }
    } while ( !feof($handle) && $tmp != false );

    socket_write($client, $result, strlen($result));

    fclose($handle);
    socket_close($client);

再次,它如何运作:

  1. 客户端向我们发送HTTP请求
  2. 我们的PHP获取请求,并将其标头发送到SQUID代理
  3. Squid完成它的工作,并将响应数据发送回我们的PHP
  4. 我们的PHP通过fsockopen获取来自squid的响应数据
  5. 我们分析响应数据或修改它
  6. 我们将其发回客户
  7. BUT: 当我们等待响应数据时,我们会收到它,但我们无法知道在什么时候关闭PHP和SQUID之间的连接。这导致工作缓慢,几乎每次都超时。

    如果您有任何想法,请与我们分享!