XML通过FTP和Memcache突然减慢了我的PHP站点的速度…从今天开始


XML via FTP and Memcache slowing my PHP site down all of a sudden....starting today

我的网站上有以下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;

在memcache中查找键/值。如果没有找到密钥,它将做一个FTP获取内容,然后保存到memcache 5分钟。我只希望1个用户每5分钟为所有用户这样做。最后,它使用我的'parseXml()'函数将XML解析为php数组,然后使用我的'gatherHtml()'将php数组转换为HTML并返回这个。

它已经工作了很长一段时间,但突然它开始使我的网站真的很慢。我已经很长时间没有更改代码了。我让它在2台服务器上负载均衡,我的内部交换机上的传出带宽也飙升了。我已经检查了负载,它很低,也没有DOS攻击,因为在最大线程下平均。

有什么想法吗(FTP, memcache, PHP, XML) ?


好吧,如果不是在DNS或网络层上,那么听起来可能是来自第三方的东西,在这个例子中是XML文件。如果XML的大小增加了,那么它现在可能超过了Memcache值的最大大小1MB。源。我建议现在通过FTP客户端(如Filezilla)(或通过命令行)检查。

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

网站缓慢:
如果是这种情况,不仅每个用户都不会在缓存中找到键,而且还会敲打Memcache来尝试存储它,每次都会失败,因为文件太大,并且必须等待Memcache 超时才能完成用户页面请求。

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

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

将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;

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