Archive » 2010 » 5月

OpenPNEのインストールにはpdo_mysqlが必要

Written in 14-5-2010 by シンプル・アイ社長 | No Comments

OpenPNEのインストールで、

./symfony openpne:install

を実行した際に、

Couldn’t locate driver named mysql

と怒られたなら、それはPHPにpdo_mysqlエクステンションが入っていないから。ソースディレクトリからエクステンションをコンパイルする。

cd /usr/local/src/php/php-5.2.5/ext/pdo_mysql/
phpize
./configure –with-php-config=/usr/local/php5/bin/php-config \
–with-pdo-mysql=/usr/local/mysql5.0
make
make install

でインストールし、php.iniに、

extension=pdo_mysql.so

を加えてApacheリスタート。
起動OKと出て、安心できない。ブラウザでPHPのページをみると閲覧できない。Apacheが起動していない。。。

php -i

で、確認しようとすると、

php: symbol lookup error: /usr/local/php5/lib/php/20060613/pdo_mysql.so:
undefined symbol: php_pdo_declare_long_constant

とでる。これは、/usr/local/php5/include/php/ext/pdo/php_pdo_driver.hのバージョンがよろしくないようだ。PHPをソースインストールした際のソースディレクトリからコピーしてやる。

cp /usr/local/src/php/php-5.2.5/ext/pdo/php_pdo_driver.h \
/usr/local/php5/include/php/ext/pdo/php_pdo_driver.h

いったんpdo_mysqlをアンインストールする。

rm -f /usr/local/php5/lib/php/20060613/pdo_mysql.so

上記、ソースから再度インストール。make cleanしてからね。これでApache再起動でいけました。OpnePNEもインストール完了。

  • Categories:
  • PHP

preg_matchのサブキャッチパターンの文字数が多いと落ちます!!

Written in 3-5-2010 by シンプル・アイ社長 | No Comments

PHPのpreg_matchにおいて、カッコを使って、サブキャッチパターンを作ることがあるだろう。ただ、そのサブキャッチパターンにマッチする文字数(バイト数)が10万文字(バイト)を超えると、エラーも発生させず、ただ単に、「マッチせずに」終了となる。(PHP5.2.5にて検証) 以下にサンプルコードを示す。

<?php
for ( $i=1; $i<=1000000000; $i++ ) {
$src .= ‘1234567890′;
if ( !preg_match( ‘/<(.+?)>/’, ‘<’.$src.’>’, $matches ) ) {
echo “not match at “.$i;
break;
}
}
?>

<?php
for ( $i=1; $i<=1000000000; $i++ ) {
$src .= ‘1234567890′;
if ( !preg_match( ‘/<(.+?)>/’, ‘<’.$src.’>’, $matches ) ) {
echo “not match at “.$i;
break;
}
}
?>

上記コードでは、決して「not match at ???」とは表示されることはないように思われるだろう。しかし実際はそうではない。実行してしばらく待つと以下の結果が出る。

not match at 10000

(.+?)というサブキャッチパターンにマッチする文字列が、10000×10文字=10万文字になった時点で、マッチしなくなり、echoして、breakしていることが分かるはずだ。ちなみに、以下のコードでは、どうだろう。

<?php
for ( $i=1; $i<=1000000000; $i++ ) {
$src .= ‘1234567890′;
$src2 .= ‘1234567890′;
if ( !preg_match( ‘/<(.+?)><(.+?)>/’, ‘<’.$src.’><’.$src2.’>’, $matches ) ) {
echo “not match at “.$i;
break;
}
}
?>

上記の場合、以下のような結果となる。

not match at 5000

おわかりだろう。やはり10万文字だ。(5000×10文字)+(5000×10文字)=10万文字なのである。

そんな長い文字をサブキャッチなんかしないといわれるかもしれない。しかし、私がこれに気付いたのは、XML-RPCのリクエストのパースを実装していた時だ。XML-RPCで、データを登録するリクエストにおいて、<base64></base64>タグで、画像データを受け取った際に、preg_matchのサブキャッチパターンで中身を取得したのだ。結果、大きな画像を受け取ったときに、マッチしないという事態に陥ったのだ。

たちが悪いのは、エラーをはいてプログラムが停止するのではなく、単にマッチしなくなって次の処理に進んでしまうことだ。ぜひ、気をつけていただきたい。

  • Categories:
  • PHP