k_oomoriIntroductionはじめまして、ADN事業部所属エンジニアのk_oomoriと申します。業務ではアドネットワークサービスnend(ネンド)においてPHPやJavaScriptのプログラミングからサーバソフトウェアあたりまでの領域を担当させていただいております。最初の投稿となる今回は、PHPにおけるプロセスのフォーク(fork)を扱おうと思います。フォークとは、簡単に言うと最初に起動したプロセス(以下親プロセスと言います)が自身の複製として子プロセスを生成し、複数プロセスで並列処理を行うというものです。Perlなどでは結構よく使われているようですが、PHPではあまり聞いたことがなかったので、この機会に紹介したいと思います。!!!注意!!!PHPでfork等のプロセス制御機能を利用するためには、マニュアルに明記されているとおり、configureオプションを指定してPHPをコンパイルしておかなければなりません。PHPがサポートするプロセス制御機能は、デフォルトでは有効となっていません。プロセス制御機能を有効にするには、configureのオプションに--enable-pcntlを付け、CGI版あるいはCLI版のPHPをコンパイルする必要があります。(http://php.net/manual/ja/pcntl.installation.php)後付で本番投入する場合は当該サーバを一旦サービスアウトするかメンテナンスを入れなくてはいけませんね・・・。Codeフォークを利用した実際のソースコードは以下のような流れになります。writeErrorLog('プロセスのフォークに失敗しました。//・・・(5)}(1)のpcntl_fork()をコールした段階で子プロセスが生成され、その返り値として子プロセスには0が、親プロセスには生成した子プロセスのプロセスIDが渡されます。ここではforでループしているため、$loop_number個の子プロセスができます。子プロセスはそれぞれに与えられた実処理を実行します(3)。ここでは自分が何番目の子なのかを判断するためループカウンタ$iをコールする関数に渡しています。基本的に子プロセスは目的の処理を終えたらその段階で終了させます(4)。親プロセスが子プロセスの終了を判断するには、pcntl_waitpid()を使います(5)。第1引数に子プロセスのPIDを渡すと、そのプロセスが終了するまで親は待ち状態になります。そのため(2)で子プロセスのPIDを収集しておきます。第2引数は参照渡しで、終了ステータスが返されます。(その値の評価はここでは省略しています)プロセスをフォークする際、データベース接続には注意しなければなりません。親プロセスでDB接続をオープンしたままの状態で子プロセスを生成してしまうと、この参照がプロセス間で共有されてしまい、1つの子プロセスが終了した段階で他の全てのプロセスからはDB接続がクローズされてしまったように見えます。これを避けるためには、フォーク後に各子プロセスが自分専用のDB接続をオープンするとよいでしょう。フレームワークを使用している場合、これは思った以上に困難だったりします。この場合、DBの実操作はAPIに押し込み、子プロセスは単にAPIを叩くだけという実装にするといった方法が考えられます。終えてどうも、僕です。え?知らない?それはそう。SDK担当のt_kinamiです。本日発売されたRPG...2014-10-14PHPのジェネレータを使おうこんにちは。$(".group01").colorbox({rel:'...2014-02-28SpriteKit上でnendの広告を表示させるこんにちは、iOS担当のt_kinamiです。Are青山のアドテク会社。アドネットワークやDSPを開発・運用。サーバを止めてみたよ。インターン:実業務体験編インターンでCTR予測をしましたSearchArchiveスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。