2009年06月

ファイルを読み書きするPHPの関数メモ。
fopen()

多くの場合、第一引数と第二引数しか使わない。
[php light="true"]$fp = fopen("ファイルパス", "モード")[/php]
第一引数のファイルパスを次のようにすれば外部ファイルも指定できる。 
戻り値はファイルポインタ。 
[php light="ture"]
$fp = fopen("http://www.***/***.txt","r") //HTTPプロトコル
$fp = fopen("ftp://www.***/***.txt","r") //FTPプロトコル
[/php] 
但し、この指定をするにはphp.iniallow_url_fopenを有効にしておく必要がある(セキュリティ的には非推奨)。 
第二引数の各モードの意味は下表の通り。




























































































モード モード名 読み 書き ファイルが有る時 ファイルが無い時 読込位置(ファイルポインタ) 書込位置(ファイルポインタ)
r Read × - - 先頭 -
r+ Read - - 先頭 先頭
w Write × 中身を削除 ファイルを新規作成 - 先頭
w+ Write 中身を削除 ファイルを新規作成 先頭 先頭
x Cautious Write × オープンしない(エラーになる) ファイルを新規作成 - 先頭
x+ Cautious Write オープンしない(エラーになる) ファイルを新規作成 先頭 先頭
a Append × 追加 ファイルを新規作成 - 最後
a+ Append 追加 ファイルを新規作成 最後 最後

 
fwrite(),fputs()
 
fputs()はfwrite()のエイリアス。要するに二つは名前が違うだけで同じ動作をする。 
 
第三引数は任意。 
[php light="true"]
fwrite("ファイルポインタ", "書き込む文字列", "書き込みサイズ")
[/php]
 
readfile(),fpassthru()
 
readfile()関数はファイルをオープンして、標準出力(ブラウザ)に出力し、クローズの手順を行ってくれる。引数にファイル名を指定して呼び出すだけで画面にファイルの中身を表示することが可能。
[php light="true"]
//aaa.txtの内容が表示される
readfile("aaa.txt");
[/php] 
fpassthru()関数はファイルオープンをしなければいけないが、それ以外はreadfile()関数と同じ。
[php light="true"]
$fp = fopen("aaa.txt", 'rb');
fpassthru($fp);
[/php] 
 
file_put_contents()
 
ファイルのオープン、クローズをする必要が無い。
[php light="true"]
//aaa.txtに文字列abcdeを書き込む
file_put_contents("aaa.txt", "abcde");
[/php] 
これは
[php light="ture"]
$fp = fopen("aaa.txt", "w+");
fwrite($fp, "abcde");
fclose($fp);
[/php]
とするのと等価。
 
file_get_contents(),file()
 
file_get_contents()はreadfile()関数と同じで、ファイルのオープン、クローズが不要。動作も同じ。相違点としてはデータを文字列として格納する。
[php light="ture"]
//aaa.txtの内容を変数$stringに格納する
$string = file_get_contents("aaa.txt");
[/php] 
file()もreadfile()関数と同じ動作をする。ファイルのオープン、クローズも不要。readfile()との違いとしてはデータを配列に格納する。
[php light="true"]
//aaa.txtの内容を配列に格納する
$farray = file("aaa.txt");
[/php] 
fclose()
 
fopen()関数でオープンしたファイルをクローズする関数。
[php light="true"]
fclose($fp);
[/php]
このエントリーをはてなブックマークに追加

ブラウザからPHPのデバッグができるというFirePHPを入れてみました。その導入過程のメモです。以下の環境でインストールしました。



FireFox:3.0.9
Firebug:1.3.3
FirePHP:0.3
OS:Linux(Fedora7)

最初、FireFoxのバージョン3.5b4 とFirebugのバージョン1.4.0b2でインストールしていたのですが、これだとFirePHPが対応していないらしく、FirePHPのタブが出てきませんでした。なので、FireFoxとFirebugをダウングレードしてインストールしました。


手順1 FirePHPアドオンのインストール

FirePHP :: Firefox Add-onsアドオンをFireFoxにインストールします。「FireFoxへインスール」という緑のボタンを押せば自動でインストールしてくれます。インストール後はFireFoxを再起動しておきます。


f:id:taiju1225:20090622133045j:image


手順2 FirePHPのライブラリをサーバにインストール

アドオンをFireFoxに入れただけでは動きません。PHPを動かすサーバにFirePHPのライブラリもインストールする必要があります。次のコマンドでサーバにライブラリをインストールします。


[bash light="true"]
# pear channel-discover pear.firephp.org
# pear install firephp/FirePHPCore
[/bash]
手順3 動かしてみる。

以上で準備は終わりです。実際にコードを書いて動かしてみます。



[php]
require_once('FirePHPCore/fb.php');
$string = "FirePHP入れてみたよ";
//画面に出力
echo $string;
//デバッグ情報を出力
FB::log($string);
$data = array(1,2,3,4,5,6,7,8,9,10);
//デバッグ情報を出力
FB::log($data);
[/php]

これは文字列と配列を定義しておいてそれをFB::logメソッドを使い、デバッグ情報として出力するだけのすごく簡単な使い方です。FirePHPでは下図のように表示されました。


f:id:taiju1225:20090622150512j:image


小さくて申し訳ないですが、変数に格納された値が表示されました。FirePHP作成者サイトのFirePHP - Firebug Extension for AJAX Developmentにこれよりも若干詳しい説明が載ってます。慣れてきたらもう少し詳しい使い方を書いていきたいと思います。


このエントリーをはてなブックマークに追加

手順1 Smartyをサーバにインストール
 
自分の環境はLinux(Fedora6)なのでyumコマンドからインストールしました。
[bash light="true"]
# yum -y install php-Smarty
[/bash]
手順2 Smarty用の環境設定
 
私の持ってるSmartyの本とか、参考にしたWebページを見ると、Smartyを利用するにはテンプレートファイルを保存する「templates」ディレクトリと、コンパイル済みのテンプレートファイルを保存する「templates_c」ディレクトリが必要なので作成しておく。と書かれてはいるけどどこに作るのかが書いてないんですね。 
結論から言うと、どこに作ってもいいみたいです。なぜならプログラム中でこれら2つのディレクトリパスを指定しなければいけないので、パーミションの制約さえなければどこだろうと構いません。なので、いつもPHPを動かしてるディレクトリの直下にSmartyというディレクトリを作成し、その中に上記2つのディレクトリを作成しました。 
但し、外部に公開する場合にはこの2つのディレクトリはブラウザから参照できない場所に置くのが推奨されるようです。Smartyがインストールされたディレクトリの下にでも作ったほうが良さそうですね。
[bash light="true"]
# mkdir /home/user/public_html/Smarty
# cd /home/user/public_html/Smarty
# mkdir templates templates_c
[/bash]
私の環境ではディレクトリを作成した時デフォルトで「775」のパーミションがついていましたが、これだとPHPからの書き込み権限がないのでパーミションを「777」にしました(外部には公開しないのでフルパーミションでもいいでしょう)。
[bash light="true"]
# chmod 777 templates templates_c
[/bash]
手順3 Smartyを動かしてみる。

簡単に動かすためのソースを作成してみました。 
一つ目はSmartyを動かすためのPHPソースです。
[php]
require_once('Smarty/Smarty.class.php');
//インスタンス生成
$smarty_obj = new Smarty();
//テンプレートディレクトリを設定
$smarty_obj->template_dir="./templates/";
$smarty_obj->compile_dir="./templates_c/";
//変数に文字列を割り当てる
$smarty_obj->assign("string","Smartyを動かしてみた");
//テンプレートファイルを元に画面に出力する。
$smarty_obj->display("smarty_smp.tpl");
[/php] 
二つ目はテンプレートファイルです。拡張子を「.html」としないように注意です。テンプレートファイルの拡張子は「.tpl」です。
[html]


Smartyサンプル


Smartyで出力された文字列⇒{$string}


[/html]
ブラウザでアクセスしてみると。。。 
出ました!

f:id:taiju1225:20090621114519j:image

 
ここまでのSmartyの実行過程(hello.phpの実行過程)をおさらいするとこんな感じになります。 

  1. Smartyクラスをインスタンス化する

  2. テンプレートディレクトリを設定する

  3. 変数に出力要素を割り当てる

  4. テンプレートを呼び出す

 
Smartyを使用する時はこの過程はお決まりパターンのようです。複雑になるのは3くらいなんですかね。 
自分は今までMVCモデルでなんぞ気にせず一つのファイルにModelとViewが混在しまくっていたのですが、やはりこれらを分けるとすっきりしますし、メンテも楽だと感じました。 
今回はとりあえずSmartyを使ってみるだけだったのですが、もう少し詳細な部分にも入ってみようかと思います。
このエントリーをはてなブックマークに追加


ブログ等でたまに見かけるソースコードのハイライト。前々から試してみたかったので幾つか有名そうなのを試してみました。導入とかは他のサイトに任せるとして、見た目とか特徴といった所に焦点を当てていこうかと思います。

 

各ライブラリの紹介の前に機能とかを一覧にしてみました。








ライブラリ名作成言語カスタマイズ性行数表示導入のし易さ
SyntaxHighlighterJavaScript×無し
GeSHiPHP有り
google-code-prettifyJavaScript有り
Text_HighlighterPHP-PEAR有り×

以下特徴というか、導入してみて気になった点を挙げてみます。

 

ちなみにオススメの順番で並んでます。


SyntaxHighlighter
 
当ブログでも使用しています。

  1. JavaScriptを使用しているため導入が非常に簡単。JavaScriptとCSSをインポートして目的のソース部分を<pre class="brush: 言語名">~</pre>タグで囲むだけでした。

  2. 何の設定もしないで、導入初期状態で偶数行に色がついているためかなり見やすいです。

  3. どの言語のソースかを明示する必要がある(PHPとかJavaとか)。

  4. ハイライトの文字色、大きさがちょうどよくとても見やすい。


これが実際の画面です(見にくくてすみません)。


f:id:taiju1225:20090613231217j:image


GeSHi


  1. 導入は簡単。だが、初期状態では見栄えがよくない(少しいじらないと行数表示ができない)。

  2. 行毎に背景色を指定できる(set_line_style()関数)。

  3. 指定行のみ背景色を指定できる。画像の黄色の行がそれ。(highlight_lines_extra()関数)。

  4. 各言語の関数に自動でリンクが付き、マニュアルページに移動できる。

  5. その他色々なクラスや関数があり、きめ細かい設定ができるが、使いこなすのは難しい。

  6. 言語の明示が必要ない。

  7. PHPで書かれているため動作が若干重たい。


f:id:taiju1225:20090613231641j:image


google-code-prettify


  1. 見た目が良くなく、全体的に見にくい。

  2. 言語の明示が必要ない。

  3. 行数表示ができない(できないことはないが1行1行にタグを付ける必要がある)。


f:id:taiju1225:20090613231757j:image


Text_Highlighter


  1. 導入は面倒だし、ハイライトさせるためのCSSは自分で書かなければいけない。

  2. 特記できるようなことがない(笑)つかいにくいよー。


f:id:taiju1225:20090613231509j:image

 

結論としては、導入の簡単さ、初期状態での使いやすさ、見た目の良さ、どれをとっても『SyntaxHighlighter』がはげしくオススメです。

このエントリーをはてなブックマークに追加

 
PHP::Image_Graphを使用してグラフを書いてみました。このライブラリはまだ開発段階で、現段階ではαバージョンのようです。また、次のライブラリが必須です。 

  • GDライブラリ

  • PEAR::Image_Canvas

  • PEAR::Image_Color


手順1 インストール
 
Image_CanvasとImage_ColorはGDが必須なので、GDからインストールしたいと思います。実行環境はLinux(Fedora7)です。 
まず、GDをインストールします。
[bash light="true"]
# yum install php-gd
[/bash] 
次にImage_Colorです。
[bash light="true"]
# pear install -a Image_Color
[/bash] 
最後にImage_Canvasです。
[bash light="true"]
# pear install -a Image_Canvas
[/bash] 
これで準備は整ったのでいよいよPEAR::Image_Graphのインストールです。 
(*)上記三つを先にインストールしないとImage_Graphはインストールできません。 
[bash light="true"]
# pear install -a Image_Graph-alpha
[/bash]
手順2 グラフを表示させるコードを書く

今回は簡単な物にしました。というか、クラスやメソッドが膨大なためマニュアルを読みきれなかったからですf^^

[php]
include 'Image/Graph.php';
//Image_Graphオブジェクト作成
//第二引数でグラフのサイズを指定
$Graph =& Image_Graph::factory('graph', array(400, 300));
//プロットエリアを作成
$Plotarea =& $Graph->addNew('plotarea');
//背景色設定(色@透明度)
$Plotarea->setFillColor('blue@0.2');
//表示するデータの作成
$Dataset =& Image_Graph::factory('dataset');
$Dataset->addPoint('Denmark', 10);
$Dataset->addPoint('Norway', 3);
$Dataset->addPoint('Sweden', 8);
$Dataset->addPoint('Finland', 5);
$Dataset->addPoint('Japan', 20);
//プロットを行う。
//pieのところを他のグラフの名前に変えることで出力されるグラフが変わる。
//例)line,area,bar,pie,radar,step,impulse,dot,scatter,smooth_line,smooty_area
$Plot =& $Plotarea->addNew('smooth_area', $Dataset);
//画面に出力
$Graph->done();
[/php] 
 
ソースの中にコメントを書いたので細かい説明はしません。これで次のようなグラフを書くことができましたちなみにグラフの種類は『smooth_area』というのを使いました。

f:id:taiju1225:20090614171843j:image


グラフの種類を変えて出力してみました。


impulse


f:id:taiju1225:20090614172040j:image


smooth_line


f:id:taiju1225:20090614172311j:image


line


f:id:taiju1225:20090614172436j:image


pie


f:id:taiju1225:20090614172537j:image


step


f:id:taiju1225:20090614172648j:image


bar


f:id:taiju1225:20090614172744j:image


area


f:id:taiju1225:20090614172914j:image

 
他にももっと細かな指定ができるみたいですが、マニュアルが整備されていないのもあり諦めました。現在αバージョンであるため、正式版になるまでまってみてもいいかもですね。 
※参考サイト 
どうにかなるBLOG :: PEAR::Image_Graph で折れ線グラフを作成

このエントリーをはてなブックマークに追加

↑このページのトップヘ