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;

キー/値のmemcacheを検索します。キーが見つからない場合は、FTPでコンテンツを取得し、memcacheに5分間保存します。5分ごとにすべてのユーザーに対して1人のユーザーがこれを実行する必要があるだけです。最後に、「parseXml()」関数を使用してXMLをphp配列に解析し、次に「gatherHtml()」を使用してPHP配列をHTMLに変換し、これを返します。

それは長い間働いていました、しかし突然それは私のサイトを本当に遅くし始めました。私は長い間コードを変更していません。2台のサーバーで負荷分散を行っており、内部スイッチの発信帯域幅も急増しています。負荷を確認しましたが、最大スレッド数で平均してDOS攻撃も発生していません。

何かアイデアをお願いします(FTP、memcache、PHP、XML)?

4

1 に答える 1

2

うーん
、DNS 層やネットワーク層に何もないとすれば、サードパーティ (この場合はXMLファイル) からの何かである可能性があるように思えます。XMLのサイズが大きくなった
場合は、現在Memcache 値の最大サイズである 1 MB を超えている可能性があります。ソースはこちら。Filezilla などの FTP クライアント経由 (またはコマンド ライン経由) で確認することをお勧めします。

ファイルが 1MB を超える場合、以下が発生している可能性があります。

ウェブサイトが遅い:
この場合、すべてのユーザーがキャッシュ内のキーを見つけられないだけでなく、Memcache を叩いて保存しようとしますが、ファイルが大きすぎて失敗するたびに、ユーザーページのリクエストを完了する前にMemcache をタイムアウトにします。

高帯域幅:
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;

それが正しいかどうかはわかりませんが、お役に立てば幸いです

于 2013-03-04T15:22:30.943 に答える