Cloud Nine

Avatar

About IT things and others.

4月
28
Cakephpでモデル名を取得する
4月 28, 2011 0

僕が使っているのは、下記の方法です。

$this->modelNames['0']

Cakephp1.2.*、1.3.*で動作は確認済みです。

皆さんどのように取得していますか?
なにかおすすめな方法がありましたら、教えてください。

4月
03
CentOSにfastcgiの導入&mod_phpとの比較
4月 3, 2011 0

今週の木曜日に、Sydphpに行ってきました。
今回のお題は、Aimee-Maree Forsstromがmod_phpとfastcgiの比較、Phil Taylorがセキュリティについて話す予定でしたが、急遽が参加できなくなったので、@predominantがオープンソースの活用&運営について話してくれました。

せっかくだったので、自宅にかえって早速fastcgiを導入してみました。
fastcgiの存在は知っていたのですが、導入の経験がないので自宅サーバに導入(CentOS5.5,Apache2.0)検証してみました。

fastcgiについて

@aimee_mareeのスライドはこちらで確認ができます。

mod_phpとfastcgiを比較して、いかにfastcgiがが素晴らしいかを説いてくれました。
@aimee_mareeのまわりでも、圧倒的にmod_phpが一般的で、そのことがかなり腹立たしいとのことです。
要因としては、Apacheの標準であること、ホスティングサーバがmod_phpを使用していること、fastcgiの情報がまだまだ少ないことが原因のようです。
僕の英語力では、70%ほどしか理解できなかったのですが、こちらのページに日本語で詳細が記載してあるのでこちらをご確認ください。
FastCGI環境を構築する – ぱせらんメモ

CentOSにインストール

ちなみに、fastcgiには、mod_fastcgimod_fcgidの2種類があるようです。
今回は、mod_fcgidが早いとのことなので、mod_fcgidを導入しました。
検討に参考にさせてもらったサイト
Apache2 – mod_fcgid vs mod_fastcgi
Apache/FastCGI

すこし手間取ったので、そのトラブルと解決方法も記載しておきます。

最新mod_fcgidをcheckout、APXSのエラー

$ svn checkout http://svn.apache.org/repos/asf/httpd/mod_fcgid/trunk mod_fcgid
$ cd mod_fcgid
$ ./configure.apxs
.configure.apxs must be able to find apxs in your path,
or the environment variable APXS must provide the full path of APXS,
or you may specify it with:

httpd-develのインストール&APXSのパスを指定して再度インストール

$ yum install httpd-devel
$ APXS=/usr/sbin/apxs ./configure.apxs
$ make
$ make install

mod_fcgidの設定

ちなみに、mod_phpで構築してあるのですが、mod_fcgidとの共存が可能です。
下記のfcgid.confの中で場所を指定出来るようです。

参考サイト
Apache Module mod_fcgid

$vi /etc/httpd/conf.d/fcgid.conf
<IfModule mod_fcgid.c>
    AddHandler fcgid-script .php
    <Directory "/home/mizoshiri/work/www/test3.40">
#        SetHandler fcgid-script
        FCGIWrapper /usr/bin/php-cgi .php
#        DirectoryIndex index.php
        Options +ExecCGI
#        AllowOverride None
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</IfModule>
$ /etc/rc.d/init.d/httpd restart

インストール後は、phpinfo()でmodの中にmod_fcgidが表示されるようになります。

ベンチマークしてみる

せっかくなので、mod_phpとの比較したいので、ベンチマークをやっておきました。

phpのベンチマーク

PHPのベンチマークはPearのBenchmark
下記のコマンドでインストール

#pear install Benchmark

ベンチマークは、下記の参考サイトにある、フィボナッチ数列のベンチマークを使用しました。
僕の認識では、php自体の処理に関しては、変わらないはず。間違ってるかな???結果的には、やはりほぼ変わらず。
コードの最適化に役立つPHPスクリプトのベンチマーク

PHPのベンチマーク結果

導入前
beafore
beafore2
導入後
after1
after2

Apacheのベンチマーク

Apacheのベンチマークは、標準ではいっているabを使用しました。
apacheのベンチマークように、Wordpressをいれて、予め記事の中にいくつかの画像などを追加したものを準備しておきました。
下記のコマンドでベンチマークを取りました。

#ab -c 100 -n 1000 http://localhost/wp/?p=1

apacheのベンチマークは下記のサイトで詳細が確認できます。
@IT:Apacheパフォーマンス・チューニングのポイント(2/2)

Apacheのベンチマーク結果

導入前

$ab -c 100 -n 1000 http://localhost/wp/?p=1
Benchmarking test3.40 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Finished 1000 requests

Server Software:        Apache
Server Hostname:        localhost
Server Port:            80
Document Path:          /?p=1
Document Length:        103 bytes
Concurrency Level:      100
Time taken for tests:   0.648395 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      336336 bytes
HTML transferred:       103103 bytes
Requests per second:    1542.27 [#/sec] (mean)

Time per request:       64.840 [ms] (mean)
Time per request:       0.648 [ms] (mean, across all concurrent requests)
Transfer rate:          505.86 [Kbytes/sec] received
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2   4.0      1      20
Processing:     9   58  10.0     61      66
Waiting:        5   56  10.0     58      64
Total:         11   60   8.5     62      82
Percentage of the requests served within a certain time (ms)
  50%     62
  66%     63
  75%     65
  80%     65
  90%     66
  95%     67
  98%     69
  99%     76
 100%     82 (longest request)

導入後

$ ab -c 100 -n 1000 http://localhost/wp/?p=1
Benchmarking localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Finished 1000 requests

Server Software:        Apache
Server Hostname:        localhost
Server Port:            80
Document Path:          /?p=1
Document Length:        103 bytes

Concurrency Level:      100
Time taken for tests:   0.665636 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      336000 bytes
HTML transferred:       103000 bytes
Requests per second:    1502.32 [#/sec] (mean)
Time per request:       66.564 [ms] (mean)
Time per request:       0.666 [ms] (mean, across all concurrent requests)
Transfer rate:          492.76 [Kbytes/sec] received

Connection Times (ms)
             min  mean[+/-sd] median   max
Connect:        0    3   3.7      2      19
Processing:     9   59  10.1     62      66
Waiting:        3   56  10.2     59      65
Total:         10   62   9.2     64      85

Percentage of the requests served within a certain time (ms)
  50%     64
  66%     66
  75%     67
  80%     68
  90%     70
  95%     70
  98%     71
  99%     78
 100%     85 (longest request)

最後に

実際に導入してみたけど、上記の設定であっているのか不安でもありますので、
なにか間違っているところがありましたら、ご指摘いただけましたら幸いです。

3月
03
CakephpのAuthComponentのメモ
3月 3, 2011 0

Cakephpで構築したサイトにAuthComponentを使用して、ユーザ機能を実装していた際に、
微妙に悩んだのが、UsersControllerの中で、addのアクションだけ、認証の必要なしにアクセスするの方法です。
答えは、beforeFilterに、$this->Auth->allow(‘add’);を入れれば解決でした。

class r extends AppController
{
  var $name = 'Users';
  var $components = array('Auth');
  var $helpers = array('image','Html','Ajax','Javascript','Form');

  //初期値の読み込み
  function beforeFilter(){
    $this->Auth->fields = array(
     'username' => 'email',
     'password' => 'password'
     );
    $this->Auth->loginError = "パスワードもしくはログインIDをご確認下さい。";
    $this->Auth->authError = "ご利用されるにはログインが必要です。";
    $this->Auth->allow('add');
  }

  function login() {
    if ($this->Auth->user()) {
        $this->redirect('/');
    }
  }

  function logout() {
  $this->Auth->logout();
  $this->redirect('/');
  }

  function add() {
    if (!empty($this->data)) {
      if($this->User->save($this->data)) {
        $this->User->create();
        $this->Session->setFlash("当労苦しました。");
        $this->redirect('/');
      }
    }
  }

11月
01
Sydphpの10月のMeetingに行ってきました。
11月 1, 2010 0

今週の木曜日にsydphpの10月のMeetingに行ってきました。
先月は日本に帰国中だったので参加できませんでしたが、今回で三回目なのでだいぶ顔見知りも増えてきてどんどん楽しくなってきました。

Meeting内容

今回のMeetingは、Yahoo!7から@jadzor@steveathon の二人が来てくれました。
まだMeetingの際に使用した資料は公開されていないので、僕の未熟な英語力と、貧弱な記憶力を使ってを紹介したいと思います。
また資料の公開がありましたら、こちらで紹介させてもらいます。

(³ɤ…)

10月
25
Smartyで配列のキー名にハイフン(-)がある場合の対処法
10月 25, 2010 0

最近、XMLのデータをSmartyで使うことが多々あります。
そこで、配列のキー名の中に、hoge-1,test-2などの名前があった場合、「-n」のところが演算子扱いなって困っていました。

解決方法

{$value->{'hoge-1'}}

地味に悩みました。

3月
09
CakephpでMysqlで取得したデータのみだけ文字化け
3月 9, 2010 1

CakephpでMysqlで取得したデータのみだけ文字化けの現象がおきましたので、その時の解決法をメモしておきます。

解決法

/app/config/database.phpに文字コードを指定

	var $default = array(
		'driver' => 'mysql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'user',
		'password' => 'pass',
                'encoding' => 'utf8' , ← 文字コードを指定
		'database' => 'dbname',
		'prefix' => '',
	);

上記の設定で解決できました。

2月
23
Mysqlの大文字と小文字の区別
2月 23, 2010 0

CakephpでWindowsのローカル環境で開発して、Linuxのサーバに公開したときにひかかったので記載しておきます。
Windowsなど、一部のOSはMysqlは、テーブル名など名前の大文字・小文字は区別しないようです。
Linuxの環境下では、大文字・小文字の区別はするのでCakephpでエラーがでた次第です。
(³ɤ…)

12月
09
validationのUndefined offset: 0 [CORE\cake\libs\model\model.php, line 2435]
12月 9, 2009 0

Cakephpのvalidationのごくごく単純な内容でハマった

記述方法について

maxLengthについて
validationの機能は動いていたのですが、下記のエラーがでてしまった。

Undefined offset: 0 [CORE\cake\libs\model\model.php, line 2435]

で、よくよくドキュメントを確認してみると記述方法が間違っていました。
▼間違った記述方法

var $validate = array(
	'hoge' => array(
		'rule' => array('maxLength' => '100'),
		'message' => '最大100文字までです。'
	)
);

 ↓
▼正しい記述方法

var $validate = array(
	'hoge' => array(
		'rule' => array('maxLength','100'),
		'message' => '最大100文字までです。'
	)
);

▼間違った理由
その上で数値チェックをしていたので、記述法を同じだと勘違いしていました。

var $validate = array(
	'age' => array(
	'rule' => array('comparison', '>=', 18),
	'message' => '18歳以上の方のみ対象です。'
	)
);

単純な間違いなのに、発見するのに30分くらいかかりました。
非常にくやしい。
ドキュメントを読む際に、ああだいたいこうだろうと流し読みしていたから招いたのでしょう。
残念。

Cakephp validationの説明

http://book.cakephp.org/ja/view/134/Core-Validation-Rules

8月
12
Deprecated: Assigning the return value of new by reference is deprecated in
8月 12, 2009 3

Cakephpの導入

Windowsの開発環境
Apache2.2
PHP5.3
の環境化で、Cakephpを試していたら下記のエラーがでました。

Deprecated: Assigning the return value of new by reference is deprecated in

下記のURLで調査したところ、PHP5.3の環境だとでるようです。

http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=1993&forum=3

下記のファイルにif文を追加しました。
「cake/libs/configure.php」

if (isset($config['debug'])) {
 if ($_this->debug) {
  error_reporting(E_ALL);
  この三行追加
  if (error_reporting() > 6143) {
   error_reporting(E_ALL & ~E_DEPRECATED);
  }
  ここまで
  if (function_exists('ini_set')) {
   ini_set('display_errors', 1);
  }

6月
22
Call to undefined function mb_convert_encoding()
6月 22, 2009 0

Fatal error: Call to undefined function mb_convert_encoding() in D:\wrok\2vs2\www2\common\method.php on line 17

「mb_convert_encoding()」なんて定義されていないんだって。
ローカルの環境で出たので調べる、「php_mbstring.dll」がないことが」判明
googleで「filetype:dll php_mbstring」で検索してファイルを落としてきます。

「phbnp.ini」に下記の一文を追加してapacehを再起動して終了です。

extension=php_mbstring.dll

Real Time Analytics