PHPタグの投稿

benchmak

PHP’s MessageFormatter benchmark

0

Screen Shot 2011 12 16 at 19.13.22 500x76 PHPs MessageFormatter benchmark

Screen Shot 2011 12 16 at 19.16.58 PHPs MessageFormatter benchmark

測定環境は、PHP 5.3.8で、ab -n 500です。
数字は[#/sec]です。

ベンチマークプログラムダウンロード

php

[PHP]変数vs文字列

0

Screen shot 2011 09 21 at 23.34.32 [PHP]変数vs文字列

文字列を共通化するために、変数で定義する方法と文字を直接書く方法どちらが速いか検証してみたら、ほぼ同じだった。
どっちもどっち。

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

rainbow crack

Webアプリケーションでのパスワード保存方法

0

e02f03aea85580315575e82bd608d86e 500x94 Webアプリケーションでのパスワード保存方法
自分的メモ。

ネタもと:
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

memcache

Memcached Object Cache+batcache

0

WS0872 500x273 Memcached Object Cache+batcache

概要

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

email メールアドレスのドメイン部分をチェック

ユーザが入力したメアドの検証をするために、アットマーク以降のドメイン部分を検証する。
(続きを読む…)

PHPでXML-RPC

0

doodle4 PHPでXML RPC

Blog記事の更新をサーチエンジンなどに通知するXML RPCをPHPで実装する方法を紹介します。

まず、weblogUpdates.pingの仕様。

http://www.xmlrpc.com/weblogsCom

weblogUpdates.ping (weblogname, weblogurl, changesurl=weblogurl, categoryname=&quot;none&quot;) 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で書く。
segmentation fault

[Thu Dec 17 22:56:22 2009] [notice] child pid 2121 exit signal Segmentation fault (11)

0

WS06351 500x222 [Thu Dec 17 22:56:22 2009] [notice] child pid 2121 exit signal Segmentation fault (11)
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

1

WS0624 500x337 CGI benchmarking

Server 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でした。

詳細レポートはこちら
WS0588 500x327 自転車で羽田空港!詳細レポート

今、参考になったBlogをまとめていて気づいたけど、間違った道へ行っちゃった。。。。
第二ターミナルへは自転車で行っちゃいけないみたい。第一ターミナルに行かないといけないのね。どうりで途中から自転車見かけないわけだ。

(続きを読む…)

トップへ戻る