PHPタグの投稿
[PHP]変数vs文字列
0![php Screen shot 2011 09 21 at 23.34.32 [PHP]変数vs文字列](http://matsu.tymy.net/blog/wp-content/uploads/2011/09/Screen-shot-2011-09-21-at-23.34.32.png)
文字列を共通化するために、変数で定義する方法と文字を直接書く方法どちらが速いか検証してみたら、ほぼ同じだった。
どっちもどっち。
define.php
<?php
define('word', 'hogehoge');
$start = microtime(true);
for ($i=0;$i<1000000;$i++) {
?>
<?php print word; ?>
<?php
}
print "\n\n";
print microtime(true) - $start;
static.php
<?php
$start = microtime(true);
for ($i=0;$i<1000000;$i++) {
?>
hogehoge
<?php
}
print "\n\n";
print microtime(true) - $start;
100万回実行した結果、2割程度しか差が無かった。
define.php: 1.9965279102325
static.php: 1.7039070129395
Webアプリケーションでのパスワード保存方法
0
自分的メモ。
ネタもと:
http://www.ustream.tv/recorded/17178653
Rainbow Crackみたいなツール使うと一方向hashした値はすぐにクラックできちゃうよ。
md5でもsha1でも同じ。Rainbow Crackの準備は時間かかるけど、これならターゲットの文字を入手したら数秒でクラックできちゃう!やばいね。
Rainbow Crackによるクラックを防ぐためにはパスワードの照合自体を遅くしてあげて対処するのがいい。
http://en.wikipedia.org/wiki/Key_stretching
おまけとして、saltも付け加えるとより良い。
Zend_Mailでマルチバイトメール
0まともなコードが掲載されていなかったので、汚いですが掲載。
$mail = new Zend_Mail('ISO-2022-JP');
$mail->setHeaderEncoding(Zend_Mime::ENCODING_BASE64);
$mail->setFrom('y_matsukura@example.com', mb_convert_encoding('ふろむ', 'ISO-2022-JP', 'UTF-8'));
$mail->addTo('y_matsukura@example.com', mb_convert_encoding('とぅ', 'ISO-2022-JP', 'UTF-8'));
$mail->setSubject(mb_convert_encoding('化けません', 'ISO-2022-JP', 'UTF-8'));
$mail->setBodyText(mb_convert_encoding('日本語','ISO-2022-JP', 'UTF-8'), null, Zend_Mime::ENCODING_7BIT);
$mail->send();
参照:
http://framework.zend.com/manual/ja/zend.mail.character-sets.html
Memcached Object Cache+batcache
0概要
mystiqueテーマを使った、Wordpressのページ表示に1,2秒かかるのでキャッシュを導入し、レスポンスが35.6倍速くなりました!
インストール
以前、WP-SuperCacheというプラグインを試したが、マルチブログで正常に動作しないし、携帯のキャリアごとにキャッシュできないといった不便さがあったので導入しないでいました。
しばらく放置していましたが、いかんせんページ表示が重くて、10秒間HTTPの応答が無いというアラートメールが飛んでくるようになったので対策を行いました。
どうせ早くするなら、KVSにしてアプリケーションサーバをスケールアウトできるようにします。
導入したのは以下の3つ。
導入方法はそれぞれのページにわかりやすく書いてあるので割愛します。
カスタマイズ
batcacheに関しては、自分でキャッシュのキーを選択できるので、キャリアごとにキャッシュを作るようにするために以下のブロックを追加しました。
function is_mobile_user_agent()
{
require_once('Net/UserAgent/Mobile.php');
$agent = Net_UserAgent_Mobile::singleton();
if ($agent->isDoCoMo()) {
return 1;
} else if ($agent->isEZweb()) {
return 2;
} else if ($agent->isSoftBank()) {
return 3;
} else if ($agent->isWillcom()) {
return 4;
}else if(strpos('iPhone', $_SERVER['HTTP_USER_AGENT']) !== false ){
return 6;
}
return 5;
}
$batcache->unique['mobile'] = is_mobile_user_agent();
どちらのプラグインもソースコードがとても汚いので書き直したくなりますが、動くので良しとしよう。
ベンチマーク
測定は、インターネット越しに以下のコマンドを実行
% /usr/local/apache2/bin/ab -c 10 -n 500 http://matsu.tymy.net/blog/
前:1.47 [#/sec] (mean)
後: 52.38 [#/sec] (mean)
35.6倍速くなりました!
更新履歴
2010/12/19 WP-Touchを使っている場合にPCとキャッシュが共有されてしまう問題があったのでコードを修正。
メールアドレスのドメイン部分をチェック
0
ユーザが入力したメアドの検証をするために、アットマーク以降のドメイン部分を検証する。
(続きを読む…)
PHPでXML-RPC
0Blog記事の更新をサーチエンジンなどに通知するXML RPCをPHPで実装する方法を紹介します。
まず、weblogUpdates.pingの仕様。
http://www.xmlrpc.com/weblogsCom
weblogUpdates.ping (weblogname, weblogurl, changesurl=weblogurl, categoryname="none") returns struct
ちなみに、weblogUpdates.extendedPingというpingより多くの必須パラメータがあるインターフェイスも存在する。
pingで事足りるのでpingだけを実装。
http://weblogs.com/api.html#5
PHPでXML-RPCを扱うためには、PEARのXML_RPC2を使うのが便利。APIの設計は綺麗で使いやすい。
以下にコード書いておきます。
<?php
require_once('XML/RPC2/Client.php');
$blog_title = 'おれのブログ';
$blog_url = 'http://matsu.tymy.net/';
$url_array = array(
'http://www.google.com/webmasters/tools/ping'
,'http://search.yahooapis.com/SiteExplorerService/V1/ping'
,'http://www.bing.com/webmaster/ping.aspx'
,'http://submissions.ask.com/ping'
);
$options = array(
'prefix' => 'weblogUpdates.'
);
$call_option = array(
$blog_title
, $blog_url
);
foreach($url_array as $url){
try{
$client = XML_RPC2_Client::create($url, $options);
$result = $client->remoteCall___('ping', $call_option);
if($result['flerror']){
// goo returns error but message says success.
if(strpos($result['message'], 'Thanks for the ping.') === false){
throw new UnexpectedValueException($result['message']);
}
}
}catch(UnexpectedValueException $e){
trigger_error($url."\n\n".print_r($e, true), E_USER_NOTICE);
}catch(XML_RPC2_Exception $e){
trigger_error($url."\n\n".print_r($e, true), E_USER_NOTICE);
}
}
注意
- pingサーバは使えなくなる場合が多いので、例外はしっかりハンドリングしておく。半年前の厳選20サーバ中、半分以上が存在していない状態でした。
- レスポンスのフォーマットが仕様通りじゃない
- ブログタイトルにマルチバイトを含むときはUTF-8に変換して送る処理を入れてね。または、UTF8で書く。
[Thu Dec 17 22:56:22 2009] [notice] child pid 2121 exit signal Segmentation fault (11)
0![segmentation fault WS06351 500x222 [Thu Dec 17 22:56:22 2009] [notice] child pid 2121 exit signal Segmentation fault (11)](http://matsu.tymy.net/blog/wp-content/uploads/2009/12/WS06351-500x222.jpg)
PHP 5.2.8にて、apacheのエラーログにsegmentation faultが記録されるが、どこで起きているかわからない。
[Thu Dec 17 22:56:22 2009] [notice] child pid 2121 exit signal Segmentation fault (11)
しかし、xdebugを使えばエラー箇所をわかりやすく教えてくれる。
1.5時間も使ってしまった!
CGI benchmarking
1Server version: Apache/2.2.11 (Unix)
Debian GNU/Linux 5.0
Client: JMeter
20000 req 2 threads.
“Hello World!” の出力
HTML, PHP, go(golang), C, Perl でCGIのパフォーマンスを測定。
自転車で羽田空港!詳細レポート
2羽田空港へ自転車で行ってきました。新宿からは、往復70kmでした。
今、参考になったBlogをまとめていて気づいたけど、間違った道へ行っちゃった。。。。
第二ターミナルへは自転車で行っちゃいけないみたい。第一ターミナルに行かないといけないのね。どうりで途中から自転車見かけないわけだ。






Recent Comments