白话php工作方式:mod_php、mod_fastcgi、php-fpm、spawn-fcgi
以apache为例
1、mod_php,就是apache来亲自运行php,把php作为自己的一部份来运行。php导致的内存和cpu占用升高也会使得apache内存cpu占用升高。
2、mod_fastcgi,这是apache的一个模块,apache用它来运行php,这样php就不占用apache的线程了,apache把这个任务交给了mod_fastcgi,而mod_fastcgi也不把php作为自己的一部份来运行,而是让php启动多个php-cgi.exe进程,mod_fastcgi来管理这些进程。
3、php-fpm,其实这个跟mod_fastcgi作用是一样的,只是mod_fastcgi属于apache,而php-fpm属于php,其运行方式与mod_fastcgi类似,apache启动后用php-fpm启动多个php-cgi.exe进程,php-fpm来管理这些进程。
4、因为php-fpm管理效率较高,且可以对接其他服务器如:iis、apache、nginx、lighttpd等等,加之在php5.3.3以后php-fpm成为了php一部份,所以用php-fpm管理php是目前比较流行的。
nginx运行php的方式:
1、nginx本身没有类似的mod_php或mod_fastcgi。所以nginx只能通过其他方式,早期的nginx需要用lighttpd的spawn-fcgi来运行控制php,spawn-fcgi类似于mod_fastcgi和php-fpm,早期的spawn-fcgi是lighttpd一部份,nginx使用spawn-fcgi必需同时安装lighttpd,后期的spawn-fcgi独立后可以直接使用。
2、上面提到php-fpm管理管理效率更高,又是php的一部份,所以nginx使用php-fpm运行php成为了最佳选择。
lighttpd运行php的方式:
1、上面我们提到nginx早期运行php需要lighttpd的spawn-fcgi,那么早期的lighttpd运行php也需要spawn-fcgi,但是后来spawn-fcgi被独立出来,那么后来的lighttpd运行php的方式就是mod_fastcgi。
2、lighttpd能用php-fpm管理php吗?答案是肯定的,但是需要用到自身的mod_fastcgi与php-fpm对接,也就是说lighttpd只有开启了mod_fastcgi,才可以使用php-fpm。
备注(2023年):现在的lighttpd更像是nginx+apache轻量化合体,反代不亚于nginx甚至优于nginx,运行mod_fastcgi也非常完美。
以上用不专业很的方式大体讲解了服务端运行php的方式。刚开始接触到mod_php、mod_fastcgi、php-fpm、spawn-fcgi也是一头雾水,有时候网上一篇文章被ctrl+c多了就讹传讹了。apache、nginx、lighttpd运行php各有各的最佳方式。如果您只是运行一个如本站这样的博客,apache+mod_fastcgi是最省心的选择。如果您运行一个动态+静态+图片站,比如论坛,前端用nginx或lighttpd、后端用lighttpd或apache是最佳选择。如果您的服务器运行多个站,各种各样的站,nginx+iis或kangle也是不错的选择。