【问题标题】:Modifying HTML content on the fly => SLOW即时修改 HTML 内容 => SLOW
【发布时间】:2013-04-04 20:54:57
【问题描述】:

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

我们尝试了 2 次:

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

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

你能帮我们吗?

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

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

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

【问题讨论】:

    标签: http networking header proxy protection


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢您的回复,但是:
    • symcbean 你用 ECAP 做过这个吗?如果是,你是如何解压缩 gzip 块的?
    【解决方案2】:

    感谢您的回复!

    首先:我们的 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 之间的连接。这会导致工作缓慢,并且几乎每次都会超时。

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

    【讨论】:

    • 我已经整理了这里的格式 - 但实际上它应该已经添加并标记为问题的更新。
    • 我怀疑你的问题的很大一部分是你的架构 - 你为初学者缓冲每个请求两次,并将响应作为数据报而不是流处理(尽管这可能很难改变)。如果您的问题是不知道何时收到来自 squid 的响应,那么与其简单地将 HTTP 请求中继到代理,不如创建一个 curl 请求,它应该会更快。然而,根据服务的使用方式(例如,使用 URL 重定向器/Squid 内容重写),有更有效的方法来解决问题
    猜你喜欢
    • 2018-06-09
    • 2011-08-23
    • 2021-06-22
    • 2018-08-13
    • 1970-01-01
    • 2015-11-03
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多