Yahoo!(米)でphpを採用しているというのは有名な話ですが、このたびPHPのカンファレンスにてYahoo!がどのようにPHPを使っているかのプレゼン資料が公開されたそうです。
以下のサイトにてその邦訳版が読めます。
PHP at Yahoo!を読む
Yahoo!のような世界一のポータルサイトと自分が仕事で関わる小中規模のサイトではまったくスケールが違いますが、高速化や安定運用の考え方からphp.iniの設定内容といった細かいところまで、いろいろな点で参考になりました。
アジェンダのみなのでさっと読むことができます。PHP使いの方は目を通しておくと良さそうです。
2007年5月28日月曜日
2007年5月16日水曜日
PHPでIPアドレスを扱うライブラリ(Pear::Net_IPv4)
実際に使ったわけではないんですが、PHPでIPアドレスの計算などをする場合はPearのNet_IPv4というライブラリが便利そうです。
http://pear.plus-server.net/package.networking.net-ipv4.html
マニュアルをちらっと見ただけでもかなり使えそうな感じが分かります。将来使う可能性大なのでメモしておきます。
http://pear.plus-server.net/package.networking.net-ipv4.html
マニュアルをちらっと見ただけでもかなり使えそうな感じが分かります。将来使う可能性大なのでメモしておきます。
MySQLでIPアドレスを扱う(INET_ATONとINET_NTOA)
たとえば以下のようなテーブルがあったとします。A,B,C社はそれぞれ、ip_fromからip_toまでのIPアドレス帯域を持っているという意味です。
「192.168.2.123」のIPアドレスが、どの会社の帯域に含まれるのかを検索したい場合、INET_ATONというMySQL関数が使えます。
上記のSQLを実行すると、B社が結果で返ってきます。
INET_ATON(たぶんAddressTONumberの略)はネットワークアドレスを10進数に変換してくれる関数です。数値に変換することで、SQLでのネットワークアドレスの扱いがぐっと楽になります。ちなみに逆バージョンのINET_NTOAというのもあります。
http://dev.mysql.com/doc/refman/4.1/ja/miscellaneous-functions.html
company_table | ||
---|---|---|
company | ip_from | ip_to |
A社 | 192.168.1.1 | 192.168.1.254 |
B社 | 192.168.2.1 | 192.168.2.254 |
C社 | 192.168.3.1 | 192.168.3.254 |
「192.168.2.123」のIPアドレスが、どの会社の帯域に含まれるのかを検索したい場合、INET_ATONというMySQL関数が使えます。
select * from company_table
where INET_ATON(ip_from) <= INET_ATON("192.168.2.123") and INET_ATON(ip_to) >= INET_ATON("192.168.2.123");
上記のSQLを実行すると、B社が結果で返ってきます。
INET_ATON(たぶんAddressTONumberの略)はネットワークアドレスを10進数に変換してくれる関数です。数値に変換することで、SQLでのネットワークアドレスの扱いがぐっと楽になります。ちなみに逆バージョンのINET_NTOAというのもあります。
http://dev.mysql.com/doc/refman/4.1/ja/miscellaneous-functions.html
2007年4月27日金曜日
PATH_INFOに「%2F」が含まれていると404エラーになる(AllowEncodedSlashesで 解決)
SEO対策として、PATH_INFOを使ってパラメータをphpスクリプトに受け渡す方法が一般的になりつつあります。
参考:phpスクリプトに拡張子なしでアクセスするためには
自分もこれまでさんざんこのやり方を使っていましたが、つい最近、PATH_INFOの中に「%2F」が含まれているとapacheが404エラーを返すことを知りました。ちなみに「%2F」は「/(スラッシュ)」にURLエンコードをかけた後の文字列です。
たとえば上記の例。apacheの設定がデフォルト状態だと404エラーになります。
これを解消するにはAllowEncodedSlashesをOnにします。
httpd.confやVirtualhostディレクティブにこの記述を追加してapache再起動します。
なお、この設定はApache 2.0.46以降でのみ有効だそうです。あとmod_rewriteなどを使うときにもAllowEncodedSlashesをOnにしていないとエラーが起こるようです。
参考:phpスクリプトに拡張子なしでアクセスするためには
自分もこれまでさんざんこのやり方を使っていましたが、つい最近、PATH_INFOの中に「%2F」が含まれているとapacheが404エラーを返すことを知りました。ちなみに「%2F」は「/(スラッシュ)」にURLエンコードをかけた後の文字列です。
http://www.example.com/product.php/id/1234/code/ABC%2FDEF
たとえば上記の例。apacheの設定がデフォルト状態だと404エラーになります。
これを解消するにはAllowEncodedSlashesをOnにします。
AllowEncodedSlashes On
httpd.confやVirtualhostディレクティブにこの記述を追加してapache再起動します。
なお、この設定はApache 2.0.46以降でのみ有効だそうです。あとmod_rewriteなどを使うときにもAllowEncodedSlashesをOnにしていないとエラーが起こるようです。
2007年4月24日火曜日
cseでMySQL5に接続する
cse(Common SQL Environment)という、mysql、pgsql、oracleなどのDBMSに接続し、操作できるwindowsアプリケーションがあります。かなり便利なソフトで、以前はよく使っていました。が、このところもっぱらphpMyAdminを使うのでcseはまったく使わなくなっていました。
さて、今回仕事で、開発が完了したWebアプリのテーブル定義書を作ることになりました。ここでcseには右クリック一発でテーブル定義書を作成できるという便利な機能があることを思い出し、久しぶりにcseを起動しました。が、、、
mysqlに接続しようとすると、致命的なエラーを吐いて強制終了。困った・・・
調べてみると、cseはmysql3以下にしか対応していないんだそうです。なるほど。どうりで接続できないわけだ。
さらに調べてみると、ODBCでmysqlに接続すれば問題なく使えるというページを発見。さっそく試してみます。
まずはmysqlのodbcコネクタをダウンロードし、インストール。
http://dev.mysql.com/downloads/connector/odbc/3.51.html
上記ページから、mysql-connector-odbc-3.51.14-win32.msiをダウンロードしてインストール。続いてコントロールパネル>管理ツール>ODBCで接続情報を設定します。
以上で準備完了。cseを立ち上げ、先ほど作ったodbcデータソースを選択すると、、、接続成功!!
もちろん、テーブル定義書もバッチリ作成できました。
テーブル定義書ってまじめに作ると結構大変なので、相当な時間と労力を節約できたと思います。よかったよかった。
さて、今回仕事で、開発が完了したWebアプリのテーブル定義書を作ることになりました。ここでcseには右クリック一発でテーブル定義書を作成できるという便利な機能があることを思い出し、久しぶりにcseを起動しました。が、、、
mysqlに接続しようとすると、致命的なエラーを吐いて強制終了。困った・・・
調べてみると、cseはmysql3以下にしか対応していないんだそうです。なるほど。どうりで接続できないわけだ。
さらに調べてみると、ODBCでmysqlに接続すれば問題なく使えるというページを発見。さっそく試してみます。
まずはmysqlのodbcコネクタをダウンロードし、インストール。
http://dev.mysql.com/downloads/connector/odbc/3.51.html
上記ページから、mysql-connector-odbc-3.51.14-win32.msiをダウンロードしてインストール。続いてコントロールパネル>管理ツール>ODBCで接続情報を設定します。
以上で準備完了。cseを立ち上げ、先ほど作ったodbcデータソースを選択すると、、、接続成功!!
もちろん、テーブル定義書もバッチリ作成できました。
テーブル定義書ってまじめに作ると結構大変なので、相当な時間と労力を節約できたと思います。よかったよかった。
2007年4月20日金曜日
RAID対応外付ハードディスク「RHD2-U1.0T」を購入
IO-DATAの「RHD2-U1.0T」を買いました。
500GBのHDDが2基で合計1TB。RAID0(ストライピング)とRAID1(ミラーリング)に対応しています。接続デバイスはUSB2.0。ネットワークには対応していません。
『I-O DATA RAID 0・1対応 USB 2.0/1.1 ハードディスク 1.0TB RHD2-U1.0T』

価格: 47,250円
アイ・オー・データ
目的はエブリオで撮った0歳の息子の動画データを保管するため。
データが増えていく量はだいたい月2~6GBくらい。何かイベントごとがあったりするとデータ量がぐーんと増えます。これまでは『動画データを一旦余り物の30GBのHDDに格納し、データがたまってきたらDVDに焼く』という方法で保管していたんですが、かなり面倒な上焼くのに時間がかかるのでギブアップ。大容量HDDを買ってそこに放り込んでいくというやり方に変更しました。これで手間がかなり減るはず。
またRAID1ミラーリングを使うので、ディスク故障でデータが飛ぶ危険性も低くなります。非RAID単体ディスクよりかなり値段が高いですが、お金で買えない大切なデータを格納するためということで奮発しました。
なお、RAID1なのでデータの書き込みはやはりかなり遅め。体感速度ですが、普通の単体ディスクに書き込むのより2倍くらい時間がかかっている気がします。それでもDVDに焼くよりは断然早いし、そんなに頻繁に使うわけでもないので特に困ることはないと思います。
なお、普段使っているPCのデータは以前データを復旧した時に買った2.5インチの外付けHDDを使用するようにしています。コンパクトで転送速度も速いので、バックアップなど頻繁に使うのには2.5インチが便利ですね。
ハードディスクは大容量化、低価格化が進み、種類も豊富になっているので、これからは用途に応じて使い分けをするのがいいのかもしれません。
・ ・ ・
それから最後に。
「RHD2-U1.0T」に付属している「Sync with」というフォルダ同期ソフトを使ってみたんですが、何度やっても実行途中にエラーを吐いて落ちてしまいました。
仕方ないので「RealSync」というフリーのソフトを使いましたが、こっちは安定しています。というかシンプルで使いやすいので、こっちのほうが断然良いです(^-^;
500GBのHDDが2基で合計1TB。RAID0(ストライピング)とRAID1(ミラーリング)に対応しています。接続デバイスはUSB2.0。ネットワークには対応していません。
『I-O DATA RAID 0・1対応 USB 2.0/1.1 ハードディスク 1.0TB RHD2-U1.0T』

価格: 47,250円
アイ・オー・データ
目的はエブリオで撮った0歳の息子の動画データを保管するため。
データが増えていく量はだいたい月2~6GBくらい。何かイベントごとがあったりするとデータ量がぐーんと増えます。これまでは『動画データを一旦余り物の30GBのHDDに格納し、データがたまってきたらDVDに焼く』という方法で保管していたんですが、かなり面倒な上焼くのに時間がかかるのでギブアップ。大容量HDDを買ってそこに放り込んでいくというやり方に変更しました。これで手間がかなり減るはず。
またRAID1ミラーリングを使うので、ディスク故障でデータが飛ぶ危険性も低くなります。非RAID単体ディスクよりかなり値段が高いですが、お金で買えない大切なデータを格納するためということで奮発しました。
なお、RAID1なのでデータの書き込みはやはりかなり遅め。体感速度ですが、普通の単体ディスクに書き込むのより2倍くらい時間がかかっている気がします。それでもDVDに焼くよりは断然早いし、そんなに頻繁に使うわけでもないので特に困ることはないと思います。
なお、普段使っているPCのデータは以前データを復旧した時に買った2.5インチの外付けHDDを使用するようにしています。コンパクトで転送速度も速いので、バックアップなど頻繁に使うのには2.5インチが便利ですね。
ハードディスクは大容量化、低価格化が進み、種類も豊富になっているので、これからは用途に応じて使い分けをするのがいいのかもしれません。
・ ・ ・
それから最後に。
「RHD2-U1.0T」に付属している「Sync with」というフォルダ同期ソフトを使ってみたんですが、何度やっても実行途中にエラーを吐いて落ちてしまいました。
仕方ないので「RealSync」というフリーのソフトを使いましたが、こっちは安定しています。というかシンプルで使いやすいので、こっちのほうが断然良いです(^-^;
2007年4月17日火曜日
PEAR::HTML_QuickFormについて色々
■リンク
addElementの第一引数で「link」というのが指定できる。下記のような感じ。
これといって使い道は思い浮かばないですけど、一応メモしときます。
■unfreeze
よく使うfreezeのほかに、unfreezeもあるのを発見しました。
フォーム全体を凍結して、特定のフィールドだけ凍結解除、なんてことをやる場合は便利です。
なお、フォーム全体を凍結した後にhierselectフィールドをunfreezeすると、JavaScriptのonChangeが抜けてしまった状態でフォームが表示されるという問題もあるようです。こちらは解決法見つけられず。。
■複数選択セレクトメニュー(multiple select)
こんな感じで複数選択可能なセレクトメニューが使えます。
デフォルト値セットで値が複数ある場合は、カンマ区切りで値を渡せばいいみたいです。
■php4の場合は「&=」を使う
みたいな感じで、php4の場合「=&」を使わないダメです。(「参照渡し」って名前だったかな?)
いつもphp5で「=」だけで書いてるので、コピペとかするときによく間違えます。要注意
addElementの第一引数で「link」というのが指定できる。下記のような感じ。
$form->addElement('link', "link_name", "link_label", 'http://www.yahoo.co.jp/', 'link_text', array("target"=>"_blank"));
これといって使い道は思い浮かばないですけど、一応メモしときます。
■unfreeze
よく使うfreezeのほかに、unfreezeもあるのを発見しました。
フォーム全体を凍結して、特定のフィールドだけ凍結解除、なんてことをやる場合は便利です。
なお、フォーム全体を凍結した後にhierselectフィールドをunfreezeすると、JavaScriptのonChangeが抜けてしまった状態でフォームが表示されるという問題もあるようです。こちらは解決法見つけられず。。
■複数選択セレクトメニュー(multiple select)
$DeptArray = array("1" => "営業部", "2" => "経理部", "3" => "人事部");
$form->addElement("select","user_dept","所属部署",$DeptArray);
$deptObj =& $form->getElement("user_dept");
$deptObj->setMultiple(true);
こんな感じで複数選択可能なセレクトメニューが使えます。
デフォルト値セットで値が複数ある場合は、カンマ区切りで値を渡せばいいみたいです。
■php4の場合は「&=」を使う
$deptObj =& $form->getElement("user_dept");
みたいな感じで、php4の場合「=&」を使わないダメです。(「参照渡し」って名前だったかな?)
いつもphp5で「=」だけで書いてるので、コピペとかするときによく間違えます。要注意
登録:
投稿 (Atom)