2

我的网站上有以下 PHP。

$xml = $my_memcache->load('the_xml');
if(empty($xml)){
        $username = 'username';
        $password = 'password';
        $host = 'ftp.thirdpartysite.co.uk';
        $file = 'file.xml';
        $xml = file_get_contents("ftp://$username:$password@$host/$file");

        $my_memcache->save( $xml, 'the_xml' , array(), '1800' );

} 
$php_array = $this->parseXml($xml);

$html = $this->gatherHtml($php_array);
return $html;

它在内存缓存中查找键/值。如果找不到密钥,它将执行 FTP 获取内容,然后将其保存到内存缓存 5 分钟。我只希望 1 个用户必须每 5 分钟为所有用户执行此操作。最后,它使用我的 'parseXml()' 函数将 XML 解析为 php 数组,然后使用我的 'gatherHtml()' 将 PHP 数组转换为 HTML 并返回。

它已经工作了很长时间,但突然间它开始让我的网站变得非常缓慢。好久没改代码了。我在 2 台服务器上进行了负载平衡,并且我的内部交换机上的传出带宽也猛增。我已经检查了负载,并且在最大线程下平均没有 DOS 攻击。

请问有什么想法吗(FTP、memcache、PHP、XML)?

4

1 回答 1

2

嗯嗯
,如果它在 DNS 或网络层上什么都没有,听起来它可能是第三方的东西,在这种情况下是XML文件。
如果XML的大小增加了,那么它现在可能超过了 Memcache 值的 1MB 最大大小。来源在这里。我建议现在通过像 Filezilla 这样的 FTP 客户端(或通过命令行)进行检查。

如果文件大于 1MB,则可能会发生以下情况。

网站慢:
如果这样的话,不仅每个用户在缓存中都找不到key,还会锤击Memcache去尝试存储,每次都会因为文件太大而失败,必须等待Memcache在完成用户页面请求之前超时。

带宽高:
我注意到您使用 Memcache,可能在每个 Web 服务器上都有一个节点?如果这是真的,那么数据可能会尝试跨两个 Memcache 节点写入,这可能会导致内部交换机上的带宽峰值。要确认这一点,请尝试使用 tcpdump 检查 Memcache 是否是高带宽的罪魁祸首。

#tcpdump -vvxXs 1500 -i bond0 'port 11211'

用您称为 NIC 的任何名称替换 bond0。

可能的解决方案:
尝试先解析 XML,然后在您拥有所需的内容后将其写入/存储在 Memcache 中。这应该确保您始终将 Memcache 的最大大小保持在 1MB 以下。

$php_array = $my_memcache->load('the_php');
if(empty($php_array)){
        $username = 'username';
        $password = 'password';
        $host = 'ftp.thirdpartysite.co.uk';
        $file = 'file.xml';
        $xml = file_get_contents("ftp://$username:$password@$host/$file");

        $php_array = $this->parseXml($xml);

        $my_memcache->save( $php_array, 'the_php' , array(), '1800' );
} 

$html = $this->gatherHtml($php_array);
return $html;

不知道这是否正确,但希望对您有所帮助

于 2013-03-04T15:22:30.943 回答