PHPでアクセスカウンタを作る(2)

こんにちは。

これをシリーズで続けるかは迷ったのですが、(1)と付けたからには忘れないうちに(2)をやっておくべきですよね。
ということで、第2回目は画像カウンタの作成でもやりましょうか。

PHPでの画像の表示

まず、カウンタを表示させる前に画像処理について簡単に触れてみたいと思います。
画像の作成はimagecreatetruecolor()関数を利用します。

<?php
//横幅を設定
$output_width = 100;
//縦幅を設定
$output_height = 20;
//指定された横幅と縦幅で画像を作成
$output_img = imagecreatetruecolor($output_width, $output_height);
?>

→公式マニュアル:imagecreatetruecolor()

imagecreatetruecolor()は引数に横幅と縦幅を指定するだけで簡単に画像作成が出来ます。
しかしこれだけでは画像表示は出来ないので、以下のようにヘッダーを指定して出力します。

<?php
//ヘッダーを出力
header('Content-Type: image/png');

//横幅を設定
$output_width = 100;
//縦幅を設定
$output_height = 20;
//指定された横幅と縦幅で画像を作成
$output_img = imagecreatetruecolor($output_width, $output_height);
//png画像を出力
imagepng($output_img);
//メモリから解放
imagedestroy($output_img);
?>

→公式マニュアル:header(), imagepng(), imagedestroy()

出力結果は

imagecreatetruecolor()出力結果

imagecreatetruecolor()出力結果

となります。
ヘッダーを出力する前に画面への出力(echoなど)を行なうとエラーになるので注意!

画像に文字を表示する

ここまでで画像の出力まで出来ました。
ただ、このままでは何の模様も無い画像なので、これに文字を表示してみます。

<?php
//ヘッダー出力
header ('Content-Type: image/png');
//画像の作成
$output_img = imagecreatetruecolor(200, 50);
//文字色を設定
$text_color = imagecolorallocate($output_img, 233, 14, 91);
//表示する文字(※半角英数字のみ)
$text = 'Hello text';
//文字を画像に重ねる
imagestring($output_img, 5, 10, 10, $text, $text_color);
//画像出力
imagepng($output_img);
//メモリの解放
imagedestroy($output_img);
?>

→公式マニュアル:imagecolorallocate(), imagestring()

出力結果は

imagestring()出力結果

imagestring()出力結果

となります。
imagestring()で画像に文字を重ねています。
標準の組み込みフォントでは半角英数字のみしか対応していないので注意!

画像に日本語を重ねる

カウンタを作るには日本語表示は必要ありませんが、日本語対応させたい場合は次のようにします。

日本語TTFフォントが必要なのでM+ FONTさんのサイトから使わせて頂きます。
再配布が許可されているので、そのうちのひとつをこのページでもダウンロード出来るようにしましたので、以下リンクからダウンロードしてください。
TTFフォント

TTFファイルを使った文字出力にはimagettftext()を利用します。
コードは以下のようになります。

<?php
//TTFフォントのパス
$font_path = "./mplus-1mn-medium.ttf";
//フォントサイズ
$font_size = 15;
//出力文字
$text = "カニモモンガ";

//ヘッダー出力
header ('Content-Type: image/png');
//画像の作成
$output_img = imagecreatetruecolor(200, 50);
//文字色を設定
$text_color = imagecolorallocate($output_img, 255, 255, 255);

//TTFフォントを画像に重ねる
imagettftext($output_img, $font_size, 0, 30, 30, $text_color, $font_path, $text);

//画像出力
imagepng($output_img);
//メモリの解放
imagedestroy($output_img);
?>

→公式マニュアル:imagettftext()

出力結果は

カニモモンガ

png日本語出力結果

となります。

カウンタを画像にしてみる

というわけで文字を重ねる方法で数字を重ねて画像化してみましょう。
といっても簡単ですね。
文字表示部分にカウントした数字を代入するだけです。

<?php
//@をつけることで開けなかった際にエラーが出ない。
$file_pointer = @fopen("./count.txt","r+");
//ロックを行なう
if(flock($file_pointer, LOCK_EX)){
    //64バイト、改行、ファイル末尾まで取得
    $count = fgets($file_pointer, 65);
    if(!isset($count) or !is_numeric($count)){
        //値がない場合、または数字じゃない場合0をセット
        $count = 0;
    }
    //カウントアップ
    $count++;
    //ポインタを先頭に持ってくる。
    rewind($file_pointer);
    //書き込み処理
    fwrite($file_pointer, $count);
    //アンロック
    flock($file_pointer, LOCK_UN);
}else{
    //ロック失敗
    echo "ファイル読み込みに失敗しました。";
}
//ファイルを閉じる
fclose($file_pointer);

//ヘッダー出力
header ('Content-Type: image/png');
//画像の作成
$output_img = imagecreatetruecolor(200, 50);
//文字色を設定
$text_color = imagecolorallocate($output_img, 255, 255, 255);
//数字を画像に重ねる
imagestring($output_img, 5, 10, 10, $count, $text_color);
//画像出力
imagepng($output_img);
//メモリの解放
imagedestroy($output_img);

?>

さて、ここで注意点があります。
前回カウンタを作ったときはechoで数字を出力していましたが、今回は画像として出力されます。
なので、呼びだし部分の記述は以下のようになります。

<img src="./count.php"/>

srcファイル名はカウンタのphpファイル名にしてください。
このタグを設置したいhtml内に埋め込めばOK!

実行結果はこのようになります。

画像カウンタ出力結果

画像カウンタ出力結果

サイズや位置など微修正が必要ですが、画像として認識されています。
こんな感じで。
今度、余力があれば数字ごとに画像ファイルを作って、それをPHPで結合する方法も取り上げたいと思います。

では。

  1. コメント 0

  1. トラックバック 0

return top