我的网站上有以下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;
不知道这是否正确,但希望能有所帮助