phpの高速化のためphp-xcacheを導入する。
タグ「PHP」が付けられているもの
Python 3へ向け最新ベータ版、10月1日正式リリース。Pythonはとても便利なんだが、phpみたいに適当に放り込んでもマルチバイトがちゃんとハンドリング出来るようになって欲しいな。というか、phpはだからダメだとも言えるんだけど、とりあえず処理系をUTF-8に固定しちゃえばcharsetをほとんど意識しないで書けるのはやはり便利。
Smartyでテンプレートエンジンの威力を知る。え。PHPを使っているならSmartyは使ってるだろ、普通。初めてSmartyを組み込んだサイトをお客さんに納めたのが6,7年前だぞ、だって。
福岡は朝の7時に風弱し。予報では北風10ノット、離陸する9時頃には北風3ノット。昨日と同じ34から上がってそのまま博多湾か?
METAR RJFF 022200Z VRB02KT 9999 FEW025 20/17 Q1017
TAF RJFF 022047Z 030624 01010KT 9999 FEW030 BECMG 1215 14005KT BECMG 2124 02003KT
羽田は北東風9ノット、着陸する時刻を含まない予報だけれどちょっと東よりの風が吹くのかな。8000フィートに雲が多い。34L/Rだと少し横風気味、04が理想だけど04って使うのか?
METAR RJTT 022200Z 03009KT 9999 FEW020 BKN080 20/16 Q1019
TAF RJTT 022041Z 030624 04008KT 9000 FEW015 SCT030 BKN050 BECMG 1821 09006KT
【PHP TIPS】 53. まだ、PEAR::DBをお使いの方へ。O/Rマッパーを使うには、このMDB2を利用するので、PEAR:DB依存のところはとっとと書き直してマッピングでやるのがグ。
オープンソースCRMソフトのSugarCRM、「2年以内に株式公開する」--CEOが意向を明らかに。ストックオプションを持っている人はやる気が出るってもんだよ、これで。うちもIPOしないかなぁ...。
SugarCRMは日本語になってるけど、解説本はまだ少ないな...。結構機能も豊富なので、これで十分ってこともあると思うが。
「PHP 4」のサポートが2007年末で終了へ。うちのサーバはRHEL4ASなので、まだEOLまでは少し時間があるけど、RHEL5の方がパフォーマンスが出るからとっととアップグレードしないとな。でもPHPを4から5に上げると色々動かなくなる悪寒...。
Google cTemplateのパワーをPHP5で - php_ctemplate 1.0登場。ちょっと書きたいのがあるんだけど、今度はこれでやってみようかな。
【PHP TIPS】 32. PEAR::Cache_Liteで簡単キャッシュ。昨日PEARのページを見ていて気づいたんだけど、PEARのCacheは既にメンテナンスされていなくて、このCache_Liteが代替なのかなぁと思っていたところタイムリーな記事が。
I tried to install xcache to my server in order to accelerate php.
Firstly, I got a src.rpm from Utter Ramblings's page and built a package with rpmbuild command. Needed php-devel package.
wget http://www.jasonlitka.com/media/files/SRPMS/php-xcache-1.2.0_0.3.src.rpm rpm -ivh php-xcache-1.2.0_0.3.src.rpm rpmbuild -bb /usr/src/redhat/SPECS/php-xcache.spec rpm -ivh /usr/src/redhat/RPMS/i386/php-xcache-4.3.9_1.2.0-0.3.i386.rpm
I installed the php-xcache package succesfully. And set 'xcache.admin.user' and 'xcache.admin.pass' in /etc/php.d/xcache.ini. 'xcache.admin.pass' is md5ed password like the following.
echo "<?php echo md5('password'); ?>" | php
However, I've set SELinux to the enforcing mode, so I saw a message issued by avc like the following line when I restarted httpd service.
May 5 00:43:30 www kernel: audit(1178293410.685:17): avc: denied { read write } for pid=27875 comm="httpd" name="zero" dev=tmpfs ino=2089 scontext=root:system_r:httpd_t tcontext=system_u:object_r:zero_device_t tclass=chr_file
I needed to install selinux-policy-targeted-sources package additionally to fix the policy, added the following two lines to the file, /etc/selinux/targeted/src/policy/domains/program/apache.te.
# xcache needs to read/write /dev/zero allow httpd_t zero_device_t:chr_file { read write };
At last I issued 'make reload' in /etc/selinux/targeted/src/policy/ directory and restarted httpd service.
PHPをより高速化するプロファイリングツールあれこれ。おお、これは仕事的にも使えるじゃまいか。
PHPでiCalデータを生成しよう - 「iCalcreator 1.0」が登場。phpicalendarと組み合わせれば、パーサもあるので完璧。っていうか、vcf形式を生成するのってそれほど難しいことではないので、たぶん自分で実装してもそれほど手間じゃないし。
phpでiptablesを設定するスクリプトを書いて、だいぶ安定してきたようなので。
基本的にはJPNICが逆引き権限を持っているブロックと、APNICがJPにアサインしているブロックについてはFROMJPというChainに追加して許可して、FROMJPをJPFILTERというChainに追加して基本的にドロップするというiptablesコマンドを生成します。ただし、上記ブロックに登録されていないJPなブロックやgooglebotのブロックもあるので、それは適宜調整するという運用になります。要するに日本以外からのアクセスを禁止するということです。
とりあえず/var/log/messagesからドロップされたパケットを抜きだすスクリプトで見る限り、mxやらthやらcnからのお行儀の悪いパケットがドロップされているようなので、よしとするか。
英語でブログを書き始めたら、この対策は出来ないねぇ...。
phpでスライスは出来ないの?
【Tips】1文字だけならスライスが可能、しかも高速!
【Description】スライスというのはpython、ruby、D言語などにある概念(関数)で、部分文字列を取得する方法です。phpでは通常substr関数を用いて実現しますが、部分文字列が1文字であればスライスすることが出来、しかもsubstr関数よりも高速です。substr($str, 5, 1)と$str[5]は等価です。ただし、substr($str, 5, 2)と同じ結果を得るために$str[5].$str[6]と連結してしまうとsubstr関数よりも低速になってしまいます。なお、$str[5:6]といった方法は使えません。
リテラルの展開はどのタイミングでするべき?
【Tips】もちろん展開しておいた方が高速!
【Description】例えば1日は86400秒ですが、これを86400と書くか60*60*24と書くかで実行速度は大きく変わってきます。count関数の使い方でも説明したように、事前に出来る処理はしておくのが鉄則です。
ob_start関数はクッキーやtext/html以外のMIMEタイプを出力するためだけのもの?
【Tips】ob_startを使うと数倍高速!
【Description】ob_start関数はクッキーを用いる場合などによく使われますが、通常のhtmlの出力の際にob_start関数とob_end_flush関数を使うと、echo関数やprint関数などの出力をバッファリングしてからapacheのAPIに出力を引き渡すと考えられるため(phpのソースを見たんですが確認できず(^^ゞ)、高速になります。
バッファリングしない場合、ob_implicit_flush関数を明示する方法もあります。
文字列を比較するstrcmp関数は何のためにあるの?
【Tips】strcmpを使う方が僅かに高速!
【Description】単純に同じかどうかを比較するのであれば、$hoge == "fuga"をテストする方法と、!strcmp($hoge, "fuga")とする方法がありますが、後者の方が非常に僅かながら高速です。
※諸事情により公開を中止しました。
トップページの右の柱のニュースですが、巡回サイトをどんどん追加してます。というのも、プログラムを書き換えたことでかなりサーバへの負荷が抑えられていることが理由です。一度設定したクッキーが書き換わるまで少し時間がかかるため、カスタマイズページにアクセスして表示するサイトを変更してみてください。
switch文に並べる条件の順番は?
【Tips】出現頻度順に並べる方が高速!
【Description】caseに並べる条件は出現頻度の多いものを先に書くべきです。以下のソースでは頻度0.7、0.2、0.1の順に並べて比較しましたが、もし数万件に1件しか含まれないような条件を先に書いてしまうと、かなり無駄なロジックになってしまいます。実際に運用してみないと分からないケースももちろんあるので、データベースで件数をカウントするなどして最適化をしましょう。