2008年5月31日土曜日

 

SQLiteについてサイトまとめ

ダウンロード

SQLite Home Page
Download
php_sqlite.dll - PECL4WIN

インストール

SQLiteインストール - DBonline
トライ!SQLite(1)
SQLiteをインストール - きままなひととき

使い方

sqlite: SQLite データベースを管理するプログラム
SQLite入門 - DBonline
PDO(PHP Data Object)データベース抽象化レイヤクラス(1) - [ThinkIT]
SQLiteの使いかた - 月に遊ぶ
SQLite の INSERT は遅いのか? - 元祖 サトシのブログ
SQLite の処理は トランザクション の中でないと著しく遅い

SQLite管理ツール

SQLite Database Browser
SQLiteをGUIで管理
Download SQLite Database Browser
SQLite ControlCenter 日本語版

ラベル:


2008年5月10日土曜日

 

【PHP】プログラム最適化

追記:2008年6月16日

PHP最適化ベストプラクティスとやらを本気でdisる

可読性を下げてまでやる意味はない。
何倍の差といってもソースにそのコードが何万回と出るわけではない。
開発効率・メンテナンス性等も含めて検討すべき。

  1. 高速化は、デカい所からやれ!!
  2. 最適化は、脳味噌に適用しろ!!

システムの特性や環境にもよるので一概には言えないだろうが、気にしておきたい。

PHP最適化tipsまとめサイト - ウノウラボ Unoh Labs

  • staticが使えるなら、staticを使う。速度は4倍になる。
  • __get, __set, __autoload は避ける。
  • require_once() はコストがかかる。
  • include や require では絶対パスで指定する。
  • スクリプトの開始時間は $_SERVER[’REQUEST_TIME’] で得る。
  • 正規表現は、文字列関数で代用できないか探る。(文字を見つけるだけならstrposなどでもよい)
  • str_replace は preg_replace より早いが、strtr は str_replace の4倍早い。
  • 文字列/配列両方を受け入れる柔軟さを持つ関数は避ける。変わりに個別の関数を用意する。
  • @によるエラー制御は遅い
  • $row[’id’] は $row[id] より7倍早い
  • エラーメッセージはコストがかかる
  • for ($x=0; $x < count($array); $x) の count() のようにループの度に呼ばれる関数はさけ、変数に格納する。
__set メソッド
定義しておくと存在しないメンバー変数に対して代入を行おうとすると __set メソッドが呼び出される。
通常は代入時点で新たにメンバー変数が生成される。
__get メソッド
存在しないメンバー変数を参照したとき __get メソッドが定義されていると、それをオーバーライドする。
デフォルト値の指定。
__autoload() メソッド
存在しないクラスを使用するプログラムを記述した場合エラーになる前にその関数が呼ばれる。 include_once などでそのクラスの定義ファイルを読み込むようにして負荷を軽くする。
__call メソッド
定義しておくと、存在しないクラスのメソッドの代わりに __call メソッドが呼び出される。

Optimizing PHP objects - Jaslabs: High performance Software

概要

  • すべての変数は最初に初期化すべき
  • メソッドで2回以上参照されるすべてのグローバル/オブジェクト変数はは、ローカル変数に格納したほうがよい。
  • よく使うメソッドは派生クラスに定義する。

詳細

  • メソッドでのローカル変数のインクリメントがもっとも早い。通常関数でのローカル変数のインクリメントもほぼ同じ。
  • グローバル変数のインクリメントはローカル変数のインクリメントより2倍遅い
  • オブジェクト変数のインクリメント($this->hoge++)よりローカル変数インクリメント($hoge++)の方が3倍早い
  • 未定義の変数のインクリメントよりも、初期化した変数のインクリメントの方が9-10倍早い
  • 宣言なしに使われるグローバル変数もローカル変数が増えるのと同じくらいコストがかかる(たぶんPHPはグローバル変数の存在を調べるため)
  • クラス内に10以上のメソッドがあってもパフォーマンスは変わらない
  • 派生クラスメソッドはスーパークラスメソッドより早い
  • 1つの引数と空の関数の呼び出しは、ローカル変数のインクリメント7-8回分のコスト。同じようなメソッドの呼び出しは 15回分のコストがかかる

ラベル: ,


2008年5月1日木曜日

 

【PHP】ファイルパス操作

ファイルパスから拡張子を調べたり、画像や動画の変換をする場合に拡張子より前、「.(ドット)」までをファイル名から取得したい場合などの為のメモ。

 // テストパス
array(
    '/www/htdocs/index.html',
    '/ドキュメント/data-4.xml',
    'c:/aaa/bbb/usr/あああ/aaa/新しい.かも.txt'
    )

その1 pathinfo() 関数

pathinfo - PHP マニュアル

pathinfo  ( string $path  [, int $options  ] )
$options で必要なものだけ取得できる
指定可能な引数は PATHINFO_DIRNAMEPATHINFO_BASENAMEPATHINFO_EXTENSION、PHP 5.2.0 以降でPATHINFO_FILENAME
// 返り値
array() {
    ["dirname"],    // ディレクトリパス
    ["basename"], // ファイル名
    ["extension"],  // 拡張子
    ['filename']     //  ファイル名(拡張なし) ※PHP 5.2.0 以降
}
// テスト
foreach ($array as $path) {
    var_dump(pathinfo($path));
}
// 実行結果
array(3) {
    ["dirname"]=>  string(11) "/www/htdocs"
    ["basename"]=>  string(10) "index.html"
    ["extension"]=>  string(4) "html"
} 
array(3) {
     ["dirname"]=>  string(13) "/ドキュメント"
     ["basename"]=>  string(10) "data-4.xml"
     ["extension"]=>  string(3) "xml"
}
array(3) {
    ["dirname"]=> string(25) "c:/aaa/bbb/usr/あああ/aaa"
    ["basename"]=> string(14) "Vしい.かも.txt"
    ["extension"]=> string(3) "txt"
}

その2 explode() 関数でパスを分解

explode  ( string $delimiter  , string $string  [, int $limit  ] )
$string を文字列 $delimiter で区切った配列を返す
$limit は分割の上限
// テスト
foreach ($array as $path) {
    print_r(explode('/', $path));
}
// 実行結果
Array (
    [0] =>
    [1] => www
    [2] => htdocs
    [3] => index.html
)
Array (
    [0] =>
    [1] => ドキュメント
    [2] => data-4.xml
)
Array (
    [0] => c:
    [1] => aaa
    [2] => bbb
    [3] => usr
    [4] => あああ
    [5] => aaa
    [6] => 新しい.かも.txt
)

その3 strrpos() 関数で拡張子なしファイル名の取得

strrpos - PHP マニュアル

int strrpos ( string $haystack , string $needle [, int $offset ] )
$haystack の中で、単一文字 $needle が最後に現れた位置を返す
// テスト
foreach ($array as $path) {
    $pos  = strrpos($path), '.'); //「.(ドット)」が最後に現れる位置
    $name = substr($path), 0, $pos); //拡張子の前までを取得
    var_dump($name);echo "
"; }
// 実行結果 string(17) "/www/htdocs/index" string(20) "/ドキュメント/data-4" string(37) "c:/aaa/bbb/usr/あああ/aaa/新しい.かも"

前述の方法等でディレクトリ名とファイル名を分離した後に使う

その4 array_diff() 関数でファイル名取得

array_diff - PHP マニュアル

array array_diff ( array $array1 , array $array2 [, array $ ... ] )
$array1$array2 と比較し、その差を返す
// テスト
foreach ($array as $path) {
    $arrfname0 = explode('/',$path); // ディレクトリとファイル名の配列
    $arrfname1 = explode('/',dirname( $path )); // ディレクトリのみの配列
    echo array_diff( $arrfname0 ,$arrfname1); // ファイル名取得
}

その5strrchr 関数と basename 関数を使って拡張子なしファイル名取得

strrchr - PHP マニュアル

string strrchr ( string $haystack , mixed $needle )
$haystack の中で $needle が最後に現れた位置から終わりまでを返す
// テスト
foreach ($array as $path) {
    echo basename($file, strrchr($path, ".")); 
}
// 実行結果
index
data-4
Vしい.かも

PHP 5.2.2 文字化けは修正されているらしい。
それぞれ組み合わせて使いたい。
正規表現を使った方がすっきりしそうではあるので、いずれ考えよう。

参考

【PHP】pathinfo、basename関数の日本語ファイル名取得問題 - 作業日報

ラベル:


This page is powered by Blogger. Isn't yours?

登録 投稿 [Atom]

Google