phpがシングルスレッドである理由
【疑問】
PHPがシングルスレッドであると聞いて、以下の疑問が湧いた。
apacheではリクエスト毎にプロセスが作られ、その中でphpが実行されるので他のリクエストとメモリ空間を共有しないことがイメージできた。
これならスレッドセーフについて留意しなくても良い。
じゃあ、一つのプロセスを使い回すnginxが実行するphpは複数のリクエストがメモリ空間を共有するんじゃないのか?スレッドセーフを考えねばならないのではないのか?
疑問に思ったので調べた。
【結果】
wikipediaにて「Zend Engineは1つのプロセスが1つのインタプリタのコンテキストを持つように設計されていて、単独ではマルチスレッドを用いた処理をサポートしていない。」とあった。
そもそも、webサーバーがどのように動作しているかということと、phpがマルチスレッドなのかシングルスレッドなのかは関係がなかった。
言語がマルチスレッドなのか、シングルスレッドなのかは、実行される環境によるのではなく、その言語の仕様ということなのだと理解した。
C10K問題を解決したとされるnginxがphp_fpmでphpを実行するとき、php_fpmは1つのプロセスを使い回すのだろう。(もしくはnginxのプロセス内で実行される?)
ということは複数のphpの実行は同じプロセス内で行われるが、phpはシングルスレッドで動作するというのは変わらない。
このことからも、phpがシングルスレッドなのは言語の仕様であることが理解できた。