カテゴリー別アーカイブ: LAMP[Linux, Apache, MySQL, PHP]

VPS上のHTTPで通信帯域を節約する01 – apache httpd deflate mod_deflate vps

 VPS上でHTTPdを利用しているときに、通信帯域の頭打ちで応答が低下することがある。
 さくらのVPSだと、割り当て帯域は100Mbpsなので、重いページを提供していると結構かつかつになる。
 そんなときに便利なのが、Apacheのmod_deflateモジュール。
 こいつを使うと、データ本文をgzip等で圧縮して転送できる。 HTMLは辞書が有効に働きやすく(タグであるとか、style等の属性等が定形なので)、これを適用すると100KBのページを10KB弱の転送で済ませたり出来る。

 とりあえず、.htaccessで使う場合の設定。

SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/html

#1 DEFLATEフィルタを有効にする。
#2 MIMEタイプがtext/htmlである物に対してDEFLATEフィルタを適用にする。
httpd.confでmod_deflateを読み込んでいてAllowOverrideされていれば、.htaccessで制御できる。

 VPSではネットワーク帯域が狭いことがあるので、CPUパワーに余裕があれば活用したいモジュールだ。

(274)

カテゴリー: サーバ設定 | コメントをどうぞ

MySQL最適化メモ02 – MySQL EXPLAIN type 開発

 MySQL最適化メモ01の続きで、typeの残り。 ref_or_nullより遅いタイプ。

・index_merge
 複数のインデックスを結合したタイプ。

SELECT * FROM vps_table WHERE column_one > 10 AND column_two > 20

・range
 インデックスの範囲を限定する(2値で挟み込むか、いくつかの候補から得る)場合のタイプ。

SELECT * FROM vps_table WHERE column_one > 10 AND column_one < 20

・index
 インデックス全域をスキャンする場合のタイプ。
 インデックスはデータ全域よりも小さいはずなのでALLよりはマシだけど、インデックスに適した動作をしていない(木やハッシュの探索で確定できず、インデックスを最後まで読まなければならない)

・ALL
 データ全域をスキャンする場合のタイプ。
 さくらのVPS 4GBでキャッシュされていても、1万レコードを全域スキャンすると分単位かかったりする一番低速な動作。
 ~数十レコード程度のタイプ値保持等の用途以外でこれが出てきたらクエリ解析してインデックスを貼る。

(131)

カテゴリー: MySQL | コメントをどうぞ

MySQL最適化メモ01 – MySQL EXPLAIN type 開発 vps

MySQLのEXPLAIN結果の読み方。

typeフィールド値を高速な順にメモる。

・const
 ユニークなキー(PK or UNIQUE)に対して定数で検索する場合に出る型。

 SELECT * FROM my_table WHERE id=1;

・eq_ref
 ユニークなキー同士で対応が取れる場合の型。

 SELECT * FROM my_table, sub_table WHERE my_table.unique_column = sub_table.id;

・ref
 インデックスが貼られたカラムで対応を取るか、式によって求められる場合の型。
 インデックスがユニークに出来る場合はUNIQUEにしたほうがeq_refになって高速。

 SELECT * FROM my_table, sub_table WHERE my_table.index_column = sub_table.id;

・ref_or_null
 その名の通り、refにnullが加わっている場合(インデックスカラムがNOT NULLではない場合)
 NULLは不定なので、セーフなデフォルト値を設定してNOT NULLにした方が良い。

(373)

カテゴリー: MySQL | コメントをどうぞ

PHPでGoogle検索をしてみる – SimpleHTML DOM Parserで解析 vps

 PHPからGoogle検索を実行して、SimpleHTML DOM Parserと正規表現で切り出してデータを活用できる形にしてみる。

サンプル > 実行してみる on さくらのVPS

$URL = “http://www.google.co.jp/search”;
$ParamArray = array(‘num’=>’10’, ‘hl’=>’ja’);
$ParamArray[‘q’] = ‘vps’;
$html = file_get_html($URL . ‘?’ . implode(‘,’, $ParamArray));
//これでhtmlにGoogle検索結果が入る。
//これをSimpleHTML DOM Parserとpregでヒットしたアドレスを抽出する
$ret = array();
if($html){
foreach($html->find(‘h3[class=r]’) as $el){
preg_match(“/\/url\?q=([^&]+)/”, $el->children(0)->href, $mat);
if(!empty($mat[1])) $ret[] = $mat[1];
}
}
return $ret;

 これでキーワードで検索した結果のアドレス一覧が得られる。
 このアドレスから自分のドメインを検索することで順位をチェックしたり、アドレス一覧を更にfile_get_htmlして、各ページを形態素解析にかけたりすると、SEOの助けになるだろう。

検索パラメータの参考:gologo13の日記

(109)

カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

Yahoo APIを利用して住所から座標を取得する – ジオコーダー 住所 座標 緯度 経度 PHP 開発 サンプル

 Yahoo APIのジオコーダーを利用して住所文字列から座標を調べてみる。

サンプル > 実行してみる

$Y_APPID = ”;//yahoo api 開発ID

$curl = curl_init();
$request_array = array(CURLOPT_URL => "http://geo.search.olp.yahooapis.jp/OpenLocalPlatform/V1/geoCoder?appid={$Y_APPID}&query=".urlencode("東京都千代田区"));
curl_setopt_array($curl, $request_array);
$res = curl_exec($curl);
$xml = simplexml_load_string($res);
list($lon,$lat) = explode(",", $xml->Feature->Geometry->Coordinates);
echo("<p>該当した住所:".$xml->Feature->Name."<br /><li>緯度:{$lat}</li><li>経度:{$lon}</li></p>");

(765)

カテゴリー: PHP | コメントをどうぞ

Yahoo APIを利用して形態素解析 – 文字列 文節解析 構造解析 PHP 開発 サンプル

 Yahoo APIの形態素解析(文書の構成を解析する)をPHPから使ってみる。

サンプル > 実行してみる

$Y_APPID = ""; //yahoo api 開発ID
$sentence = "テスト文書について、形態素解析をかけることでキーワードを抽出してみる。";
$POST_REQUEST = "appid={$Y_APPID}&results=ma&sentence=".urlencode($sentence);

$defaults = array(
    CURLOPT_POST => 1,
    CURLOPT_HEADER => 0,
    CURLOPT_URL => "http://jlp.yahooapis.jp/MAService/V1/parse",
    CURLOPT_FRESH_CONNECT => 1,
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_FORBID_REUSE => 1,
    CURLOPT_TIMEOUT => 0,
    CURLOPT_POSTFIELDS => $POST_REQUEST
);
$ch = curl_init();
curl_setopt_array($ch, $defaults);
$res = curl_exec($ch);
curl_close($ch);
$xml = simplexml_load_string($res);
$WordsArray = array();
$WordsHashToWord = array();
foreach ($xml->ma_result->word_list->word as $cur){
    if($cur->pos == "名詞"){
        @$WordsArray[md5($cur->surface)]++;
        @$WordsHashToWord[md5($cur->surface)] = $cur->surface;
    }
}
arsort($WordsArray);
$i = 1;
echo("<ol>");
foreach($WordsArray as $w=>$n){
    echo("<li>{$WordsHashToWord[$w]}[{$n}]</li>");
    if($i++ >= 10) break;
}
echo("</ol>");

 公式サンプルはGETだけど、長さ制限があるので、CURLを利用してPOSTしている。
 最初に入力された文書をYahooに解析してもらって、品詞を登場頻度の多い順に表示する。
 例えば、先日のSimpleHTML DOM Parserで拾ったHTMLのBODYを形態素解析して品詞の多い順に解析すれば、ページのキーワード傾向を調べることが出来る。

 先日から色々紹介しているPHPサンプルだが、共用レンタルサーバだとモジュール不足で使えないことも多いので、VPSの利用をお勧めしたい。

(501)

カテゴリー: PHP | コメントをどうぞ

PHPでHTMLを簡単に扱う – SimpleHTML DOM Parser

 PHPでHTMLを扱うときに便利なのがSimple HTML DOM Parserと言うライブラリ。
 HTMLが正しい構造ならば、PHP標準のXML機能で扱えるんだけど、世の中、正しくないHTML文書の方が多いので、パースで転けるけど、このライブラリを使うとブラウザのように上手く理解してくれるので、簡単に扱うことが出来る。

 file_get_html(url)でHTMLをパースしたオブジェクトを得て、そのオブジェクトに対してfind(タグ名)メソッドや、children(要素番号)メソッドでタグを分割できる。

サンプル > 実行してみる on さくらのVPS

require_once(‘simple_html_dom.php’);
$URL = ‘http://vps.xn--ockc3f5a.com/’;

if($html = file_get_html($URL)){
    $linka = array();
    $links = array();
    foreach($html->find(‘a’) as $el){
        $linka[md5($el->href)]++;
        $links[md5($el->href)] = $el->href;
    }
    arsort($linka);
    foreach($linka as $k=>$n){
        echo("<li>{$links[$k]} [{$n}リンク]</li>");
    }
}else{
    echo(‘HTMLの取得に失敗しました’);
}

 この場合、全てのaタグを探索して、そのhref要素についてカウントしている。
 正規表現を使って^http[s]{0,1}:\/\/で切り分けてやれば、相対リンクと絶対リンクの切り分けが出来るだろう。
 更に、絶対リンクを^http:\/\/vps.xn--ockc3f5a.com\/で切り分けると内部リンクと外部リンクに分けられる。

 CでHTMLをパースする場合は、こちらの記事が参考になる。

(244)

カテゴリー: PHP | コメントをどうぞ