php - 通过 FTP 和 Memcache 的 XML 突然减慢了我的 PHP 网站速度......从今天开始

标签 php xml ftp memcached

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

相关文章:

php - 我可以在将 html 文件加载到 DOMDocument 时 try catch PHP 警告吗?

php - php文件之间的变量

java - 如何将xml文件数据添加到ArangoDb中?

xml - 如何使用 emacs nxml 模式使用 xsd 模式验证某些 xml 文件?

python - 带有身份验证数据的公共(public) FTP 站点的 scrapy,出现 FTP 错误

php - Magento SOAP WebService -> 用户登录

php - 在集合 laravel 中使用查询范围

xml - 使用 perl + LibXML 将 XSLT 样式表声明添加到给定的 XML

c# - FTP ://prompts for app 的 Process.Start

c++ - FTP 如何删除一个文件夹?