ひとりアドベントカレンダー2015 第20日目 〜 PHPer でもマルチスレッドしてみたい

  • このエントリーをはてなブックマークに追加
  • Pocket

20日目!

PHPバイナリプログラミングシリーズは終わりましたが、引き続き PHP ネタで行きます(もう最後まで行ってしまうか?)

今日は PHP でマルチスレッドプログラミングに挑戦してみます。ふつう、PHP で並行/並列処理をする場合はプロセスを多重化しますが、実はスレッドを使うこともできます。pecl に pthreads というライブラリがあるのでこれを使います:

pthreads) http://php.net/manual/ja/book.pthreads.php

これを使うには PHP 本体がスレッドセーフオプション付きでビルドされている必要があります。通常はこのオプションはついていないことが多いので今回は PHP をビルドするところからやろうと思います。

PHP7 をスレッドセーフでビルドする

PHP界隈ではこれまでのバージョンに比べて大幅な高速化が図られた PHP7 がリリースされたばかりです。せっかくですのでこの PHP7 を使いましょう。PHP の Git リポジトリからソースを落としてきます:

このリポジトリのタグを見るとすでにバージョン 7.0.1 がリリースされていたのでそれをビルドします。まずは 7.0.1 のタグをチェックアウトして:

 configure ファイルを生成:

 configure します:

 configure のオプションはこちらのサイトを参考にさせてもらいました:

http://qiita.com/ma2saka/items/2cd6cb3a8007fdf9fe2e

このオプションの最後の行  --enable-maintainer-zts がスレッドセーフでビルドするフラグです。 configure --help  で説明を見ると

 で、コードをメンテナンスする人専用のオプション、みたいなことが書いてあるのですが大丈夫なんでしょうか・・・?

ともかくこれで Makefile が生成されるのであとは make  して make install  すればビルドとインストールが完了します。

 php --version  でバージョン情報その他を見てみます:

確かにバージョン 7.0.1 の PHP が起動しているようです。また、ZTS という表示がこの PHP  がスレッドセーフバージョンであることを意味しています。( Zend Thread Safe の略ですかね?)

以上で PHP7 スレッドセーフ版のビルドは完了です。

pthreads をインストールする

続いて、スレッドライブラリの phtreads をインストールします。通常であれば $ sudo pecl install pthreads  などとすれば一発で入るはずですが、今回 PHP のバージョンが最新であり、ライブラリ側が対応していないためかこのコマンドではインストールできませんでした。しかたないのでソースからインストールします。とくに難しいところはなくて、 tarball を取ってきて configure && make && make install するだけです:

最後に、インストールされた pthreads.so を PHP がロードするように php.ini に設定します:

 これで pthreads のインストールは完了です。

スレッドを使ってみる

これで Thread という名前のクラスが使えるようになります。ユーザーがスレッドを使うにはこのクラスを継承して自分の実行したい処理を書くようです。

もっとも基本的な使い方として以下のようなプログラムを書いてみました:

まず Thread クラスを継承したクラスを作ってインスタンス化するのですが、ここは PHP7 らしく無名クラスを使ってみました。このような書き方なんですね〜。Java と似ていますが微妙に違うという・・・。

スレッド内で実行したい処理は public function run()  というメソッドを定義してそこに書きます。これは Java のスレッドとほぼ同じですね。

このプログラムを実行すると以下のようになります:

 スレッドの起動します。 → スレッドを起動しました。という表示のあともスレッド内の処理は続けて実行されていてちゃんとスレッドプログラミングができていることがわかります。

まとめ

PHP でマルチスレッドプログラミングを試してみました。普通なかなかやらないような処理なので新鮮でした。今回は最も基本的な例のみしかできませんでしたが、 mutex を使った同期処理なども(もちろん)できるようなので後で挑戦してみようと思います。

  • このエントリーをはてなブックマークに追加
  • Pocket

SNSでもご購読できます。

コメントを残す

*