メニュー

PHP5.5に対応してみたい話

こんちは!開発2部の吉岡です。

弊社のサーバープログラムはPHPで作成しています。
バージョンはまだ5.3系ですが、すでに5.5がリリースされている…

そんなわけで、近々、現在の社内フレームワークを5.5対応にしたいところです。
PHP5.5では色々と機能の拡張が行われていますが、個人的にインパクトがありそう!これは便利そう!というものをTOP5形式でピックアップしてみました。

第5位 Windows XP対応終了

オーツーでは開発環境のマシンにまだWindows XPのマシンが生き残っています。

PHP5.5でXPはサポート終了とのことで、開発機も世代交代の必要があります。
と、言ってもXP機はごくわずかなので、インパクトは少ないかな、という感じです。

第4位 OPCache + APCu

現在APCを使用していますが、開発が停滞気味の感があり、 OPCache+APCuの環境に移行する必要がありそうです。

APCu

オーツーの自社製フレームワークでは、APC内に「変更されることがないテーブルデータ」をキャシュしています。これによって、データベースへの参照を少なくしているのでapc_storeは必須の機能と言えます。

ただ、環境構築時に対応する必要があるだけで、APCuを使用してのコーディングはあまり影響が無いのではないでしょうか。

第3位 try 〜 catch 〜 finally 〜 句

5.5から例外の処理でfinally句を使用できるようになりました。
例外(exceptions)

例外は様々な処理で発生しますが、catchは1箇所で行うような作り方をしているので、finally句を入れるにしても大きな変更にはならないかと思います。

フレームワーク的には「最終的にこれだけはやっておいてね」という処理を定義出来るわけなので、どんな処理をfinally句に書くべきなのか検討する必要はありそうです。

第2位 array_column()

地味ながらarray_columnという関数が便利そうです。

array_column

array_column ( array $array , mixed $column_key [, mixed $index_key = null ] )

array_column() は、 配列 array の中から column_key で指定した単一のカラムの値を返します。 オプションで index_key も指定できます。これを指定すると、 入力配列内のカラム index_key の値に基づいて結果を並べ替えます。

DBから取って来たデータを加工したり、マージしたりする時に便利そうです。
array_mapでも出来るかと思いますが、見やすくなるということで。

第2引数に配列を渡して複数のカラムに対応すると、さらに便利そうです。

第1位 ジェネレータ

やはり1位はジェネレータでしょうか。色んな場所で使いたくなります。
ジェネレータ

中でも一番インパクトが有りそうなのは、先ほども出てきたAPC内にキャッシュされるテーブルデータです。
このデータには、使用開始日時と使用終了日時が含まれており、キャッシュから取り出される毎にこのチェックが行われます。

チェック処理は単純な時刻比較のループ処理なのですが、1リクエスト毎に行われています。
じゃないと、イベント前にイベント用のデータが出現してしまったりするわけです。

具体的には、下記のような感じです。

define( 'NOW',  time() );

doCardHogehoge();

function doCardHogehoge(){
    $card_data = getCacheData( 'card_data' );

    foreach( $card_data as $each ){
        if ( !hogehoge( $each ) ){
            return false;
        }
    }
    return true;
}

function getCacheData( $key ){
    $cache_data = apc_fetch( $key );

    foreach( $cache_data as $index => $data){
        if ( $data['start_time'] > NOW || $data['end_time'] < NOW ){
            unset( $cache_data[$index] );
        }
    }

    return $cache_data;
}

↑この状態では、APCからデータを取ってくると同時に全データの日付チェックを行っています。
これをジェネレータを使って書き直すと↓

define( 'NOW',  time() );

doCardHogehoge();

function doCardHogehoge(){
    foreach( cacheDataGenerator( 'card_data' ) as $each ){
        if ( !hogehoge( $each ) ){
            return false;
        }
    }

    return true;
}

function cacheDataGenerator( $key ){
    $cache_data = apc_fetch( $key );

    foreach( $cache_data as $index => $data){
        if ( $data['start_time'] > NOW || $data['end_time'] < NOW ){
            continue;
        }
        else {
            yield $data;
        }
    }
}

こんな感じでしょうか?かなりザックリですが。

コンパクトに処理を書けるし、hogehoge()がfalseを返すと処理は終わりなので、日付チェックを少なく出来る可能性があります。

ということで、まだPHP5.5には対応出来ていないんですが、近日中にフレームワークに手を入れたいところです!

この記事をシェアする

  • twitter
  • facebook
  • Google+
  • B!はてブ
  • pocket
トップへ戻る

CONTACT

ゲーム開発、Webサイト制作に関するご相談等ございましたら、お気軽にお問い合わせください。

ゲーム開発に関する
お問い合わせはこちら

Webサイト制作に関する
お問い合わせはこちら