Archive for PHP

APCとmemcachedの速度比較

■環境
Celeron 2.13GHz
Fedora Core 4

■計測

1KBぐらいのPHP Objectを10000回取り出したときの所要時間

APC 4.02729010582 sec
memcached 7.36776900291 sec

1KBぐらいのPHP Objectを10000回書き込んだときのの所要時間

APC 4.73176598549 sec
memcached 6.97650694847 sec

■結果
読み込み
APCのほうが約1.8倍高速

書き込み
APCの方が約1.5倍高速

PEARのMailにて、persist有効時のパフォーマンス

PEARのMailを使って、SMTP接続をしてメール送信をする際、
persistを使ったときと使わなかったときのパフォーマンスを測定しました。

■条件
100通メール送信
MTAはqmail

■結果

persist利用時: 5.12351703644 sec
persist非利用時: 6.3600769043 sec

■結果
persistを使うと1.24134981089459 倍速いです。

以下、テストコード


< ?php
/*
* Created on 2007/01/15
*
* To change the template for this generated file go to
* Window - Preferences - PHPeclipse - PHP - Code Templates
*/
include('Mail.php');
require_once('Benchmark/Timer.php');

$timer = new Benchmark_Timer();

$recipients = 'matsu-test@example.com';

$headers['From']    = 'matsu@ec1.localdomain';
$headers['To']      = $recipients;
$headers['Subject'] = 'subject';

$body = 'Test message';

// SMTPサーバ
$mail_options = array(
  'host'      => 'localhost',
  'port'      => 25,
  'auth'      => false,
  'persist'   => false
);

// Create the mail object using the Mail::factory method
$mail_object = &Mail::factory('smtp',$mail_options);  // SMTP送信準備

$timer->start();
for($i=0;$i < 100;$i++){
  $mail_object->send($recipients, $headers, $body.':'.$i);
}
$timer->stop();
$timer->display();
print_r($timer->getProfiling());

MySQLで郵便番号を保持するテーブルを作った。

いやはや避けて通れなくはなってしまったこと。
自社で郵便番号の最新情報を持つ。

なんといっても、一番いやなのが

月1回100件ほどの更新がある郵便番号データ。

そこで、運用は以下のようにする。
・月1回丸ごとデータを入れ替える
 ・時間はかかるけど、差分を積み重ねたときの不整合が出てしまうリスクを回避
 ・更新用のスクリプトを2つ書かなくてすむ。
・入れ替える際に、SQLクライアントから参照不可能になっては困るので、トランザクションをかけてデータを更新。
 ・重いけど、月1回だし、なにより楽。
・いらない情報も念のため持っておく。

ビジネスロジックでは、郵便番号から住所を検索する用途にしか利用しないため、indexは郵便番号だけ。
スキーマは以下の通り。

CREATE TABLE `postcode` (
`postcode_id` int(10) unsigned NOT NULL auto_increment,
`postcode_jis` varchar(5) NOT NULL default ”,
`postcode_old` varchar(5) NOT NULL default ”,
`postcode_new` varchar(7) NOT NULL default ”,
`postcode_prefecture_kana` varchar(255) NOT NULL default ”,
`postcode_city_kana` varchar(255) NOT NULL default ”,
`postcode_suburb_kana` varchar(255) default NULL,
`postcode_prefecture` varchar(255) NOT NULL default ”,
`postcode_city` varchar(255) NOT NULL default ”,
`postcode_suburb` varchar(255) default NULL,
`postcode_is_separated_suburb` tinyint(3) unsigned NOT NULL default ‘0′,
`postcode_is_koaza` tinyint(3) unsigned NOT NULL default ‘0′,
`postcode_is_chome` tinyint(3) unsigned NOT NULL default ‘0′,
`postcode_is_include_area` tinyint(3) unsigned NOT NULL default ‘0′,
`postcode_status` tinyint(3) unsigned NOT NULL default ‘0′,
`postcode_reason` tinyint(3) unsigned NOT NULL default ‘0′,
PRIMARY KEY (`postcode_id`),
KEY `postcode_new` (`postcode_new`(4))
) ENGINE=InnoDB DEFAULT CHARSET=ujis AUTO_INCREMENT=127481 ;

データをつっこむスクリプト要点(日本語のところは適宜置き換えてね)
トランザクションかけているので途中でデータの挿入に失敗しても、中途半端にならないはず。

ini_set(’max_execution_time’,600);

$handle = fopen(ふぁいる, ‘r’);

とらんざくしょんはじめ。

れこーどをけす (truncate table postcode)

while (!feof($handle)) {

$line = fgets($handle, 8192);
$line = trim($line);

if(!$line) continue;

// 文字列の処理
$line = str_replace(’以下に掲載がない場合’, ”,$line);

$field_array = explode(’,', $line);

// 文字列の処理
foreach($field_array as &$field){
$field = str_replace(’”‘,”,$field);
}

// 補足として書いてある括弧を消す
$field_array[5] = mb_ereg_replace(’(\([^\)]+\))’,”,$field_array[5]);
$field_array[8] = mb_ereg_replace(’(([^)]+))’,”,$field_array[8]);

えんてぃてぃ作る

てーぶるに いんさーと

}
fclose($handle);

とらんざくしょんこみっと。

あとは、月1回全国のデータをダウンロードして、上記のスクリプトを実行すればダウンタイムなしに、
しかも楽に更新ができる。

余裕があれば、
・上記のURLから自動でファイルをダウンロード
・解凍
・更新プログラム実行
をすれば、全自動で最新の郵便番号データを保持できる!
Read more

PHPコーディングTIPS

条件分岐の早い書き方。

これは、Windowsかどうかを判定している式。

$isWindows = DIRECTORY_SEPARATOR == ‘\\’;

本来はこう。

$isWindows false;
if(DIRECTORY_SEPARATOR == ‘\\’){
$isWindows = true;
}

PHPプログラマ募集っす。→集まりました。

要項はこんな感じです。

=================================
PHP5開発スタッフ募集
▼勤務地:恵比寿
▼期間:5月中旬から(予定は8月まで)
▼時間:要相談
▼報酬:時間1500円位 (応相談) 交通費別途支給
▼案件:PHPフレームワークを利用し、
  XMLを使いモジュール間通信を行うECサイト新規構築。
▼人数:2人
▼備考:打ち合わせ、仕様説明は恵比寿で行い
開発は在宅でも可能。開発はモジュールごとに
分担するので仕事量を調節できます。
=================================
Read more

PHP5.0.5 bug

This might be a bug. I want to try this stiation using 5.1.2 but PDFlib runs only 5.1.x environment.


< ?php
$num = 100;

// Doesn't work
header("Content-Length: $num");

// Works
header("Content-Length: ".$num);

// Works
print("test $num");

// Works
print("test ".$num);

?>

I spent 1 hour to find this tricky spec.

PHP 複数ファイルアップロード

現在、仕事でPHPのアプリケーション開発してるんだけど、input type=file name=file[]とかで、複数の画像を一気にアップロードするとブラウザがオーバーフローする。

なぜ、オーバーフローかといえると、サーバ自体にリクエストが飛んでいないから。
そして、ほかのブラウザではできるから。

HTMLのコーディングの問題もあるかもしれないが、いまいち原因がわからない。
アップロードする画像の枚数が、少なければ正常にアップロードできる。

特定の状況として、
10個同じファイルなら、正常にアップロードできて、10個違うファイルならアップロードできない。

PHP

PHP5についてまとめてある記事が発表された。
http://www.atmarkit.co.jp/flinux/special/php5/php5a.html

いやぁ、Class関連の文法がかなりJavaちっくになってきた。4まではClass関連がまじでしょぼしょぼだったけど、一応これで安全にオブジェクト指向にかけるな。

それはいいとして、いい感じのFrameworkがほしい。

 

リンク

自分の他サイト