2006年07月21日

PHP文字出力のパフォーマンス比較について

前から気になっていたのですが、PHPで文字を出力する際に、どのくらいパフォーマンスの差が出るのか、いろいろな手法で試している記事を見つけました。

シングルクオート<ダブルクオート<ヒアドキュメント<printf関数
(速い<遅い)

という順になるようです。やはり、高機能なものほど遅くなるようですね。

<ブラウザへの出力>
Single quotes: 2,813 ms
...with concatenation: 1,179 ms
Double quotes: 5,180 ms
...with concatenation: 3,937 ms
heredoc: 7,300 ms
...with concatenation: 6,288 ms
printf: 9,527 ms
...with concatenation: 8,564 ms
(with concatenation は、.を使用して一部を変数に置き換えた場合です)

<出力バッファへの出力>
Single quotes: 8 ms
...with concatenation: 38 ms
Double quotes: 8 ms
...with concatenation: 47 ms
heredoc: 17 ms
...with concatenation: 49 ms
printf: 54 ms
...with concatenation: 52 ms

グラフは以下です。
http://i3x171um.com/output_benchmarks/ob.gif

ソースコードも公開されています。
http://i3x171um.com/output_benchmarks/ob.txt


参考:PHPドキュメントのecho関数のページ(phpnet at i3x171um dot com
氏)
posted by PHP初心者@blogger at 00:00| PHP | このブログの読者になる | 更新情報をチェックする

2006年07月14日

DBの結果取得について

DBにクエリを発行して、結果を取得する場合、いくつかの関数が利用できます。
mysqlの場合、
■mysql_fetch_array -- 連想配列、添字配列、またはその両方として結果の行を取得する
■mysql_fetch_assoc -- 連想配列として結果の行を取得する
■mysql_fetch_row -- 結果を添字配列として取得する
などがあります。(postgresでは、pg_ftech〜となります)

以下のようにクエリを発行したあと、
$result = mysql_query("SELECT id,email FROM people WHERE id = '42'");

どの関数を使うかで、返り値が異なってきます。
$row = mysql_fetch_row($result); //配列の添え字に格納されます
echo $row[0]; // 42
echo $row[1]; // 'email' の値

$row = mysql_fetch_assoc($result); //連想配列に格納されます
echo $row['id']; // 42
echo $row['email']; // 'email' の値

$row = mysql_fetch_array($result); //添え字と、連想配列両方です
echo $row[0]; // 42
echo $row[1]; // 'email' の値
echo $row['id']; // 42
echo $row['email']; // 'email' の値

DBのカラムをあとから付け加えたりすることを考慮に入れると、連想配列で返してくれる関数が利用しやすいと思います。

また、SQLを発行し、結果が複数行返ってくることもありますが、その場合、結果の行すべてに対して処理を行うことが多いと思います。
その場合には、mysql_fetch_arrayを使ってしまうと、「添え字」と「連想配列」で2回同じ処理が行われてしまう場合があります。

ということで、mysql_fetch_assocを私は最も良く利用しています。
posted by PHP初心者@blogger at 14:13| PHP | このブログの読者になる | 更新情報をチェックする

2006年06月27日

値の交換(swap)について

PHPにはswapという関数はありません。
$aと$bの値を入れ替えたい場合って、結構ありますよね。

通常は、3番目の値を一時的に使用して、以下のようにするのではないでしょうか。

// Initial values.
$biggest = 1;
$smallest = 10;

// Instead of using a temporary variable...
$temp = $biggest;
$biggest = $smallest;
$smallest = $temp;



list関数をうまくつかえば、一行で書けます。

// ...Just swap the values.
list($biggest, $smallest) = array($smallest, $biggest);


ちょっと便利、かと。
list関数って普段あまり使われなさそうですが、たまには使ってみてはいかがでしょう。

参考:PHPドキュメントのlist関数のページ
posted by PHP初心者@blogger at 22:00| PHP | このブログの読者になる | 更新情報をチェックする

2006年06月20日

配列の値コピーについて

PHPは基本的にバージョンが上がっても
今まで作成したスクリプトはそのまま動くように作られています。

ですが、一部、PHP4と5で挙動が異なっていることが報告されている
ケースもあるようです。

たとえば、配列$a1を配列$a2にコピーしたい場合。
$arr2=$arr1 とすると
PHP4→値渡し(コピー)
PHP5→参照渡し
になってしまうそうです。

$arr2=array_diff($arr1,array());
とすれば、期待通りきちんとコピーされるようです。
※PHP4.3.11で確認しました

見た目おかしなプログラムになってしまいますが、PHPのバージョンが
上がることを見越して、予め手を打っておきたいですね。

参考:PHPマニュアルの「配列」の項目
posted by PHP初心者@blogger at 19:55| PHP | このブログの読者になる | 更新情報をチェックする

2006年06月12日

ホラー : セキュリティに注意!

久しぶりの更新です.
先日,PHPを勉強するためスクリプトを購入しました.
人が書いたスクリプトを読むのは勉強になりますね.
しかし,1つおかしいところを見つけました.
なんといくつかのページにGETを利用した,DBの中身を消去する関数が含まれたのです.知らない人に外から呼び出されたら・・・怖いですねー.ぞっとします.

このようなGETによる値の受け渡しにリスクがあることがわかったので,PHPの値の受け渡し方法について調べてみました.(下記の"参考")

今までGETの利点がわかっていなかったのですが,
”GETならURLさえ指定すればCGIスクリプトを動かすことができる”
ということはGETの大きな利点だなぁと思いました.

例えば,Googleでの検索結果のURLを友達に教えれば,同じ結果を共有することができます.(例:)Google検索結果


参考:
http://ns1.php.gr.jp/pipermail/php-users/2004-March/021445.html
http://ipl.sfc.keio.ac.jp/text/basic-2004-4/main_c12_s3.html
posted by PHP初心者@blogger at 17:36 | TrackBack(11) | PHP | このブログの読者になる | 更新情報をチェックする

2006年03月11日

PHPマニュアル

PHPマニュアル

PHPマニュアルの右上にあるテキストボックスに関数名を入力すると,関数を検索することができます.

function.gif
クリックすると拡大します.

なかなか便利です.
posted by PHP初心者@blogger at 15:11 | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2006年03月10日

Fedoraを再度インストール

FedoraCore4を再インストール完了.
PHP等も一通りインストールし,プログラミングを始めたわけですが,やはりviで日本語を使うと文字化けが起こる.
.vimrcというviのエンコード関連を設定するファイルがあり,いじったのですが,どうしてもなおりません.
またFedoraCore4のエンコード自体をEUC-JPに変更するのもいいのですが,今はgeditを使用しています.
このエディタは保存するときもエンコーディングを指定できるし,操作方法がWindowsのエディタに非常に似ているのでWindowsユーザには使いやすい.つまり私向きです.

上のような問題で困った方は1度使ってみてはどうでしょうか?
posted by PHP初心者@blogger at 16:39 | TrackBack(0) | Linux | このブログの読者になる | 更新情報をチェックする

2006年03月09日

Fedoraがブートしない!

大変なことが起きました.

Fedoraが起動しません.
/var以下の設定ファイル?が存在しないというエラーをはきまくっています.

パーテーションをある程度きっているものの,/usr部分は分けていないので,もしかしたら,ソースコードが再インストール時になくなってしまうのかな・・・

調査中です...
posted by PHP初心者@blogger at 04:11 | TrackBack(0) | Linux | このブログの読者になる | 更新情報をチェックする

2006年02月28日

sudoコマンドを使う

suコマンドでユーザをrootに変更して,以下の操作をします.







 # /usr/sbin/visudo


"root ALL=(ALL) ALL"
の行を探し,その下に
"sudoコマンドを使いたいユーザ名 ALL=(ALL) ALL"
を足してセーブすればsudoが登録したユーザで使用できます.
posted by PHP初心者@blogger at 15:24 | TrackBack(0) | Linux | このブログの読者になる | 更新情報をチェックする

2006年02月27日

UTF-8からEUC-JPへ

FedoraCore4はUTF-8の文字コードを利用しているのですが,やけにviでphpファイルを書くと文字化けするのですべてEUC-JPに変更しました.

/etc/sysconfig/i18n
のUTF-8の部分をeuc.jpに変更しました.

そのほかにも/etc/man.configを変更する必要があるようですが...まだ未確認.
一応文字化けの解消完了.

しかし,後で調べてみたらviの文字コードを設定できる設定ファイルがあったらしく無駄足を踏んだ感がでてしまいました...


posted by PHP初心者@blogger at 04:07 | TrackBack(0) | Linux | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。