0

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

我们尝试了 2 次:

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

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

你可以帮我们吗?

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

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

我们也可以支付这份工作的费用,如果有人愿意写的话。

4

2 回答 2

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. 我们将其发回给客户

但是:当我们等待响应数据时,我们会收到它,但我们不知道什么时候关闭 PHP 和 SQUID 之间的连接。这导致工作缓慢,并且几乎每次都超时。

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

于 2013-04-05T10:40:38.650 回答
0

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

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

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

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

图像识别和自然语言处理在编程中不是微不足道的练习——所以你的团队中必须有一些优秀的程序员。真正解决您的问题超出了堆栈溢出答案的范围,并且吹捧承包商绝对是题外话。

于 2013-04-04T21:18:58.467 回答