2017年01月18日

php7.1 に opcache をインストールしてみた

PHP7.1ですでに高速化に成功した感じがあるけど、以前APCを入れて効果を実感したことがあるので、今回も同じような機能がないか探してみた。

昔はAPCでPHPのコードをキャッシュして高速化してたけど、どうやら今は本家 Zend の OPcache がオープンソースになったので、APCからキャッシュ機能が分離して OPcache として配布されているとのことです。

今回は remi だったので簡単にインストールできた。

メモ:
# vi /etc/yum.repos.d/remi-php71.repo
[remi-php71]
enabled=1

# yum install php-opcache php-pecl-apcu

# php -i | grep opcache


簡単なテスト環境だとキャッシュの威力も小さいので体感は難しいけど、多くのファイルを読み込むフレームワークなどを使っていると大きな効果があると思います。

ちなみに OPcache の設定は /etc/php.d/10-opcache.ini
特に設定を変更しなくてもキャッシュは有効になっているようです。

試しに opcache.revalidate_freq=20 にしてみたが、場合によっては性能に違いが出てくるかも
ただし、タイムスタンプのチェックの間隔が開くので、デプロイなどの工夫が必要になると思われるので注意が必要ですね。
ラベル:opcache
posted by zjapan at 16:02| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2016年12月22日

PHP でなんちゃって Lambda :非同期やってみました

PHPの大きな弱点?である非同期処理、なんとかやろうとすると急に大変な工数が・・
そこでPHPで非同期処理のうまいやり方をいろいろ考えてたら、面白そうなのができたかも?

今はやりの Lambda を参考に(パクリ?)Web API で PHP の function を呼び出す仕組みを作ってみた。

うまく行くところと、限界(制限)もありますが、簡単な関数を作ってベンチマークしてみたら、凄い性能が出てしまった(mod_php比較)

テスト環境は、さくらインターネットのVPS(メモリ1G、CPU2個)

比較対象、mod_php バージョン5.6
単純なhello worldを3万回
18.274 seconds
1641.68 [#/sec]

・PHPで非同期処理
なんちゃって Lambda 環境で実行されたと同じ環境を作って3万回実行結果
PHP 5.6:約7秒
PHP 7.0:約0.5秒

実は今回試したなんちゃって Lambda はステートロスではないです。
Lambdaみたいにステートロスをやろうとすると難しい・・・というか元インフラエンジニアとしては、明らかに性能的に不利とわかってる仕組みには抵抗ありなんで
そのため下手なプログラムを作ると、簡単にメモリーリークします。
PHPというよりC言語で書くようなイメージでプログラム作れば大丈夫(じゃまずいかww)

◯Lambdaを参考に、簡単にPHPで書けるようにしてみた。

function hellow($arr) {
return "hellow_world";
}

というfunctionを作るだけで Web API からよびだせるようにしてみました。
ラベル:PHP Lambda
posted by zjapan at 15:53| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする

2016年11月24日

PHP7.0の改善は思った以上だった

PHP7.0の簡単なベンチをしてみた。
PHP5.6からどれくらいよくなっているのか、噂通りの改善がされているのか
試して確認した感じだと、噂以上に改善されてるようです。

今回は純粋に言語の改善度合いを比較しようとしたので、Webより大きな差が出てると思われます。実際のアプリではここまでの差はないでしょう。

■ベンチプログラム
簡単なテキストを読み込んで、ループするだけ。コマンドラインから起動してテストできるようにしてある。
VPSで実行。3万行のテキストを1行1行読み込んで処理する。

・PHP5.6の結果
real 0m10.978s
user 0m10.079s
sys 0m0.870s
USED_PEAK_MEMORY:1579720

・PHP7.0の結果
real 0m1.086s
user 0m0.477s
sys 0m0.596s
USED_PEAK_MEMORY:1440712

約10秒かかっていた処理が、約1秒で終了するという凄い差が出ました。ここまでの差が出るとは想定外です。

■配列のテスト
連想配列を3万行分作るようにしただけw

・PHP5.6
real 0m10.487s
user 0m9.438s
sys 0m1.031s
USED_PEAK_MEMORY:6267752

・PHP7.0
real 0m1.106s
user 0m0.502s
sys 0m0.595s
USED_PEAK_MEMORY:2493600

配列を作った分だけ余分にメモリを使ってます。
PHP5.6の場合:1579720 -> 6267752 (約4.5MB増)
PHP7.0の場合:1440712 -> 2493600 (約1MB増)
使用メモリが大幅に減ってます。
配列の効率も上がったようです。大きな配列を使うような処理が必要な場合は、PHP7.0にあげた方がより良いと思われます。

その後、いくつか改良を加えたら処理速度がさらに改善された。
real 0m0.436s
user 0m0.287s
sys 0m0.146s
USED_PEAK_MEMORY:3559808 ( 3.395 MB )
一番大きな改善は、ファイルへの出力回数をできるだけ減らすようにしたこと。
使用メモリが増えたのは、出力バッファなどいろいろ使ってるので、その分メモリが必要になってしまったが
3万件の処理が0.5秒で終了するようになるとは・・・ここまで改善されると、今後はPHPの使用範囲が増えそうです。
ラベル:PHP
posted by zjapan at 15:48| Comment(0) | TrackBack(0) | PHP | このブログの読者になる | 更新情報をチェックする