我的网站上有以下 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;
它在内存缓存中查找键/值。 如果找不到 key ,它将执行 FTP 获取内容,然后将其保存到内存缓存 5 分钟。我只希望 1 个用户每 5 分钟为所有用户执行一次此操作。 最后,它使用我的“parseXml()”函数将 XML 解析为 php 数组,然后使用我的“gatherHtml()”将 PHP 数组转换为 HTML 并返回。
它已经工作了很长时间,但突然间它开始使我的网站变得非常慢。我已经很久没有更改代码了。我让它在 2 台服务器上进行负载平衡,并且我的内部交换机上的传出带宽也猛增。 我检查了负载,在最大线程下平均负载很低,也没有 DOS 攻击。
有什么想法吗(FTP、memcache、PHP、XML)?
最佳答案
嗯嗯
好吧,如果 DNS 或网络层上什么都没有,听起来可能是第三方的东西,在本例中是 XML 文件。
如果 XML 的大小有所增加,那么它现在可能超过了 Memcache 值的最大大小 1MB。来源here 。我建议现在通过 Filezilla 等 FTP 客户端(或通过命令行)进行检查。
如果文件大于 1MB,则可能会发生以下情况。
网站速度慢:
如果是这样的话,每个用户不仅在缓存中找不到 key ,还会锤击 Memcache 来尝试存储它,每次都会因为文件太大而失败,并且必须等待 Memcache < em>完成用户页面请求之前超时。
带宽高:
我注意到您使用 Memcache,可能每个 Web 服务器上都有一个节点?如果这是真的,那么数据可能会尝试跨两个 Memcache 节点写入,这可能会导致内部交换机上的带宽出现峰值。
要确认这一点,请尝试使用 tcpdump 检查 Memcache 是否是高带宽的罪魁祸首。
#tcpdump -vvxXs 1500 -i bond0 'port 11211'
将 bond0 替换为您所说的 NIC。
可能的解决方案:
首先尝试解析 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;
不知道这是否正确,但希望有所帮助
关于php - 通过 FTP 和 Memcache 的 XML 突然减慢了我的 PHP 网站速度......从今天开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15204474/