ラベル PHP の投稿を表示しています。 すべての投稿を表示
ラベル PHP の投稿を表示しています。 すべての投稿を表示

2011年11月29日火曜日

PHPで金額等の数値に3桁毎のコンマを入れる

金額等の数値に3桁おきにコンマを入れるには
number_format()
を使う。
echo number_format(1234567);
とすれば
1,234,567
となる。
2つめ以降の引数に小数件以下の桁数や、小数点に使う文字、コンマ以外の区切り文字も指定できる。

ちなみに金額なら money_format() というのもあるが、この number_format() の方が簡単かも。

2011年11月28日月曜日

大量のファイルを複数のディレクトリに分散して格納する方法

最近はハードディスクもテラバイトクラスの容量なので、大量のファイルを作ることができる。

以前、linux上でPHPを使いウェブサイトのプログラムを書いた。
それは、使っているとファイルがどんどん増えてくるシステムだ。
linuxの場合、ひとつのディレクトリに作れるファイルは最大3万とか、そういう値だったと思う。
いずれにしてもひとつのディレクトリに何万もファイルがあれば、いい加減多すぎるし、何かの時に問題が起こりかねない。
そこで、増えてくるファイルを複数のディレクトリに分散する形をとることを思いつく。

最初はディレクトリ「00001」にファイルを入れていく。1万個まで達したら、次は「00002」というディレクトリを作ってそちらに入れる。というような手法だ。
これでは、ディレクトリにいくつファイルが入っているか、どこまでディレクトリを作ったか等の管理が必要になる。例えばそのカウンターをデータベースに記録しておくといったようにだ。その場合、ウェブシステムなら連番管理の排他制御も考えなければならないかもしれない。

少し面倒なので別の方法を考えた
まず年でディレクトリを作り、その下に月日でディレクトリを作る。実際のファイルはその月日ディレクトリの下に入れる。一日に数千個程度までのファイル数であれば、これで対処できる。まだ無理なら時刻でサブディレクトリを作っても良い。
ファイル名は時刻やuniqid()を使う。

しかしながら、このことは今のシステムを作ってから思いついた。
よく考えず、別の方法で作ってしまったのだ。
たぶん大丈夫だと思うが、自分の納得のいかない状態になっているのが、ちょっと気分が悪い。

2011年11月25日金曜日

PHPでFTPアップロードする

PHPをcronで実行して、ロリポップのサーバーにFTPでファイルをアップロードする必要があって、その時に行ったPHPによるFTP処理の技術資料。

$connId = ftp_connect("ftp.aaa.com"); // 接続
ftp_login($connId, "user", "password"); // ユーザー名とパスワードでログイン
ftp_pasv($connId, true); // パッシブモードにする
ftp_chdir($connId, "upload"); // アップロード先のディレクトリに移動
ftp_put($connId, "filename", "/usr/local/filename", FTP_BINARY); // アップロード開始
ftp_close($connId); // FTP終了
こんな感じで一連の処理が行えます。
テキストファイルの場合は、ftp_putの第4引数に FTP_ASCII を指定します。
サーバーに既にファイルがあった場合は上書きされます。
ちなみにダウンロードは ftp_get です。

lsのディレクトリ名が暗い青色で読めない

linuxのコマンドラインでlsコマンドを打つと、ディレクトリ名等の文字が色分けされて表示されるが、ディレクトリ名が暗い青色で表示されて、よく見えない。
顔を近づけて見るとなんとか読めるが、不便なので色を変更したい。

/etc/DIR_COLORS をホームディレクトリにコピーする。
# cd
# cp /etc/DIR_COLORS .dir_colors

次にコピーしたファイルを編集する。
# vi .dir_colors

以下の行を編集する。
DIR 01:34 # directory

例えば下のように 34→44に変更する。44は青色の反転表示。
色の種類はすぐ上のコメントに英語で書かれている。
DIR 01:44 # directory

変更を反映するために、evalコマンド実行。
# eval `dircolors .dir_colors -b`

このように読みやすくなった。

.dir_colorsファイルの設定しだいで、他にもファイルの種類や、zip、jpg等の拡張子で色分けできたり、太字、ブリンク等の修飾も可能。

2011年11月24日木曜日

MySQL Connector 64bitでMS-AccessからMySQLにテーブルリンクを作成できない

Linux上に構成したMySQLをMS-Accessから見られると便利だ。
MySQL Connector/ODBC でそれができる。
ODBC経由で接続して、MS-Accessからテーブルを表示したり、編集したりできる。

Windows 7の64bit版を使っているので、MySQLのサイトから
「Windows (x86, 64-bit), MSI Installer」
という64bit版のプログラムをダウンロードした。バージョンは5.1.9だ。
しかし、MS-Access上でテーブルへのリンクが作成できなかった。

どうやってもできなくて
「Windows (x86, 32-bit), MSI Installer」
という32bit版に入れ替えると、使うことができた。

それで使えているから別にいいのだが、Windows 7の64bit版なので、MySQL Connectorも64bit版が正しいような気が…なぜ?

PHPのPDOでデータベース接続をプールする方法

PHPのPDOでデータベースを扱う場合に、データベースの接続をプールして使い回してくれる方法がある。
スクリプト実行のたびに再接続しているとオーバーヘッドが生じるからだ。

例えば以下のようにしてPDOのインスタンスを作成すると良い。
----------
$pdo = new PDO('mysql:dbname=test;host=localhost', 'user', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8", PDO::ATTR_PERSISTENT => true));
----------
「PDO::ATTR_PERSISTENT => true」の部分がそれ。
後はPHPにおまかせで良い。
こういうものが用意されているがPHPの便利なところだ。

接続プールとは関係ないが、この例ではMySQLで文字コードにutf8を指定している。MySQLでutf8を使っている方はこのようにして文字コードも指定すると良い。

PHPでメール送信する方法

PHPのプログラムからメール送信するにはmail()を使うことで簡単に行える。

サンプルプログラムは下の通り。
通常、このプログラムで変更が必要なのは最初の4行の$toMailAddress、$subject、$mes、$headerに入れる内容だけで良いと思う。

-----------
$toMailAddress = "test@test.com";
$subject = "メールタイトル";
$mes = "こんにちは\n本文";
$header = "From: test@test.com\r\n";

mb_language("ja");
mb_internal_encoding("ISO-2022-JP");
$subject = mb_convert_encoding($subject, "ISO-2022-JP", "UTF-8");
$subject = mb_encode_mimeheader($subject,"ISO-2022-JP");
$mes = mb_convert_kana($mes, "KV", "UTF-8"); // 「半角カタカナ」を「全角カタカナ」に変換
$mes = mb_convert_encoding($mes, "ISO-2022-JP", "UTF-8");
if(!mail($toMailAddress, $subject, $mes, $header))
    error_log("メール送信エラー");
-----------

環境の文字コードはUTF-8、CentOS 5.7 + PHP 5.3.8を使っている。

2011年11月22日火曜日

MySQL5.5.17 + Research Artisan Lite

以前、CentOS5.6とMySQL5.1の環境でResearch Artisan Liteというアクセス解析を使わせていただいていたのだが、サーバーがクラッシュして再インストールしなおした際、ついでにとCentOS5.7+MySQL5.5.17にバージョンアップしたところ、Research Artisan Liteの設定ができなくなってしまった。

最初のインストール後の設定画面でデータベースの設定をした後、
赤色で「入力内容に誤りがある為、データベースに接続できません。」
と表示される。

Research Artisan LiteはまだMySQL5.5に対応していないらしい。
「ra_core」ディレクトリの中の「*.sql」ファイルから「TYPE = INNODB」や「TYPE = MYISAM」と書かれている場所をgrepで検索して、「TYPE」を「ENGINE」に書き換えることで動くようになるらしい。
MySQLがバージョンアップして構文が変わったのが原因だ。
全部で19個のSQLファイルを書き換えたところ、無事設定することができた。

私はResearch Artisan Liteの他、Google Analyticsも併用している。
セキュリティやプライバシーの問題からだと思うが、Google Analyticsではアクセス元のIPアドレスを見ることや、個別のサイト訪問者のユーザーエージェントやページ閲覧履歴を追跡することができない。
サイト運営者としては、時には個別のユーザーの動向を調査したいことがあるので、これでは不便だ。
サイト閲覧者の利益は重要であるが、閲覧者がサイトを利用できるのは、サイト運営者が存在するからである。
世間への貢献という意味では、どちらかと言えばサイト閲覧者よりもサイト運営者の方が大きく、閲覧者はただ一方的に情報を頂戴するだけのことが多いと思う。IPアドレスや訪問者の閲覧履歴、ユーザーエージェントが、セキュリティやプライバシー上、滅多なことで重大な問題になるとは思えないし、私はこのGoogle Analyticsの閲覧者保護の部分があまり気にいっていない。
その点、Research Artisan Liteでは、一人ひとりの訪問者の動きを確認することが可能であり、手放せなくなっている。
様々な考え方はあるが、サイト運営者としてはResearch Artisan Liteの存在はありがたい。