再搭一次 Apache PHP MySQL 环境

一直以来,都是使用 wamp 当作开发环境的,觉得在初期,还是快速动手开始写代码要紧,至于环境,没有什么特殊要求,就先用最典型的,所以就选择套装了。

而现在感觉是时候自己动手搭一个环境了,总的教程看这里,http://www.leapsoul.cn/?p=695, 于是从 http://httpd.apache.org/downlo… 下载了 apache 2.2.22,从 http://www.php.net/downloads.p… 下载了 php 5.3.16,在这里查了一下 php 5.3 和 5.4 的区别,link ,

新特性的引入

非常有意思的是php 5.4居然引入了scalar中Traits(特质)的概念,熟悉scalar的朋友都知道Traits是一个介于ClassInterface之间的东西,它是抽象的定义,但是跟接口不同的是可以包括实际的方法和成员变量,而跟abstract class不同的是,它可以是多重的!这将让php的oop特性更加丰富,不过我也悲观地认为这会让众多php的草根们对oop的概念更加混乱:(

trait A
{
    public function foo();
}

trait B
{
    public function bar()
    {
        return;
    }
}

class C
{
    use A, B;

    public function execute()
    {
        echo $this->bar();
    }
}

另一个我比较关心的特性是php 5.4中终于支持全类型的函数类型检测了,在php 5.3以前我们只能在类型检测中使用arrayClass的检测,比如

function foo(array input, MyClass key) {
    return;
}

但是php 5.4会支持现在php的所有内置类型了(String,Int,Float,Resource,Bool等等),这样我们就不用在函数内部写类似is_string之类的函数了。

还有一个让无数php开发者曾经无比纠结的问题,终于在这个php 5.4中修复了(至少我认为是修复)。那就是在函数的返回值中直接使用数组键值了

function func () {
    return array(1, 2, 3);
}

echo func()[1];    // 输出2

这个看似理所当然的东西居然要等到php 5.4中才修复,要是早点修复可以节省多少变量,少排放多少二氧化碳啊。

还有一个对php初学者来说的好消息,那就是php 5.4会包含一个简单的server,大家不用再去烦恼如何配置apache之类的了。

其实,php 5.3 就已经够用了,至于 5.3 的特性,http://www.iteye.com/topic/107… 这里居然 google 到江阁的留言

和楼上一样,一直用 5.35
5.3x 中最有用的其实是静态延迟绑定,其次是命名空间。
至于 SPL 的增强,以前用数组也能模拟,现在既然有了 SPL ,我还是尽量用了。

SPL 其实就是一个迭代器,教程的话这里有,http://www.ruanyifeng.com/blog… ,

SPL规定,所有部署了Iterator界面的class,都可以用在foreach Loop中。Iterator界面中包含5个必须部署的方法:

* current()This method returns the current index’s value. You are solely
responsible for tracking what the current index is as the
interface does not do this for you.* key()

This method returns the value of the current index’s key. For
foreach loops this is extremely important so that the key
value can be populated.

* next()

This method moves the internal index forward one entry.

* rewind()

This method should reset the internal index to the first element.

* valid()

This method should return true or false if there is a current
element. It is called after rewind() or next().

然后又看到 php 的下载有线程安全和非线程安全的版本区分,他们的区别看这里,http://blog.bluesky.cn/archive…

Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍。

从2000年10月20日发布的第一个Windows版的PHP3.0.17开始的都是线程安全的版本,这是由于与Linux/Unix系统是采用多进程的工作方式不同的是Windows系统是采用多线程的工作方式。如果在IIS下以CGI方式运行PHP会非常慢,这是由于CGI模式是建立在多进程的基础之上的,而非多线程。一般我们会把PHP配置成以ISAPI的方式来运行,ISAPI是多线程的方式,这样就快多了。但存在一个问题,很多常用的PHP扩展是以Linux/Unix的多进程思想来开发的,这些扩展在ISAPI的方式运行时就会出错搞垮IIS。因此在IIS下CGI模式才是PHP运行的最安全方式,但CGI模式对于每个HTTP请求都需要重新加载和卸载整个PHP环境,其消耗是巨大的。

为了兼顾IIS下PHP的效率和安全,微软给出了FastCGI的解决方案。FastCGI可以让PHP的进程重复利用而不是每一个新的请求就重开一个进程。同时FastCGI也可以允许几个进程同时执行。这样既解决了CGI进程模式消耗太大的问题,又利用上了CGI进程模式不存在线程安全问题的优势。

因此,如果是使用ISAPI的方式来运行PHP就必须用Thread Safe(线程安全)的版本;而用FastCGI模式运行PHP的话就没有必要用线程安全检查了,用None Thread Safe(NTS,非线程安全)的版本能够更好的提高效率。

至于那个 Debug Pack ,这里说道,http://topic.csdn.net/u/201203…

难道这不是给php开发者用来调试php代码的吗?比如类似xdebug,zend debugger,那这个包给谁用呢
当然不是给php开发者用来调试php代码的
是给 C++ 程序员开发或修改 php 扩展用的

至于那个 vc6 和 vc9,这里有,http://lzhxiaoyu.blog.51cto.co…

一、如何选择PHP5.3的VC9版本和VC6版本

    VC6版本是使用Visual Studio 6编译器编译的,如果你的PHP是用Apache来架设的,那你就选择VC6版本。
    VC9版本是使用Visual Studio 2008编译器编译的,如果你的PHP是用IIS来架设的,那你就选择VC9版本。

不过,php 5.3.16 开始就貌似只有 vc9 可选了

注意一点的是,在配 php 的 session 存储方式的时候,这里,http://hi.baidu.com/whzkinger/…,提到 session 是可以存在 memcached 中的,也就是说,可以用这个路子来实现单点登录,另外据说还可以存在数据库里面,这个就没有深究了。在这个安装 memcached 的帖子中提到了 pecl,于是顺手查了一下 pecl, pear, perl 的区别,这里说道 http://g.51cto.com/mike/61429

Pear:是PHP的扩展代码包,所有的扩展均以PHP代码的形式出现,功能强大,安装简单,甚至可以改改就用。使用的时候,要在代码中进行Include才能够使用。

Pecl:是PHP的标准扩展,可以补充实际开发中所需的功能,所有的扩展都需要安装,在Windows下面以Dll的形式出现,在linux下面,需要单独进行编译,它的表现形式为根据PHP官方的标准用C语言写成,尽管源码开放但是一般人无法随意更改源码。

最直接的表述:Pear是PHP的上层扩展,Pecl是PHP的底层扩展。

这是一些PHP扩展模块的集合
扩展PHP有两种方法
一种是用纯粹的PHP代码写函数和类,pear就是这样一个项目,主页是pear.php.net
另外一种是用c或者c++编写外部模块加载至php中,pecl就是干这个事的,主页是pecl.php.net这两种方法其实都是为特定的应用提供现成的函数或者类,本质上来说都是一样的

这里的简洁明了一些,http://topic.csdn.net/t/200605…

pear   一个书写的比较规范,国外较流行的工具箱代码集
pecl   php扩展包,但不属于php基本扩展范围
perl   一种早于php出现的脚本级语言,php借鉴了他的正则表达式部分

php 的 ini 文件配置完成之后,就可以通过命令行来测试一下 php 了,关于命令行的时候用,这里有,http://www.cnblogs.com/codebea… ,具体到我们的例子,我们可以敲一个类似这样的命令,

C:Program Filesphpphp-5.3.16>php -r "echo md5('123');"

也可以复杂点,

C:Program Filesphpphp-5.3.16>php -r "var_dump(file('http://baidu.com'));"

也可以写一个文件让它去跑,例如

<?php
file_put_contents("test.txt", time());

然后让他运行,

C:Program Filesphpphp-5.3.16>php test.php

接下来就是要整合 apache 和 php 了,悲剧的是,php 5.3.16 不再有 vc6 的版本,也就不再有 php5apache2_2.dll 这个文件,于是,我们把 php 配成 fastcig 模式,至于 mod-php, cgi, fastcgi 的区别,可以看这里,http://www.zhouwenyi.com/read….

php一共分为五大运行模式:包括cgi 、fast-cgi、cli、isapi、apache 模块的 DLL

CGI
CGI即通用网关接口(Common Gateway Interface),它是一段程序,通俗的讲CGI就象是一座桥,把网页和WEB服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器的执 行程序,再把服务器执行程序的结果返还给HTML页。CGI 的跨平台性能极佳,几乎可以在任何操作系统上实现。
CGI方式在遇到连接请求(用户 请求)先要创建cgi的子进程,激活一个CGI进程,然后处理请求,处理完后结束这个子进程。这就是fork-and-execute模式。所以用cgi 方式的服务器有多少连接请求就会有多少cgi子进程,子进程反复加载是cgi性能低下的主要原因。都会当用户请求数量非常多时,会大量挤占系统的资源如内 存,CPU时间等,造成效能低下。

CGI-FCGI
fast-cgi 是cgi的升级版本,FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一 次。PHP使用PHP-FPM(FastCGI Process Manager),全称PHP FastCGI进程管理器进行管理。

FastCGI的工作原理
1、Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)
2、FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。
3、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
4、 FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出了。

在上述情况中,你可以想象CGI通常有多慢。每一个Web 请求PHP都必须重新解析php.ini、重新载入全部扩展并重初始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的 好处是,持续数据库连接(Persistent database connection)可以工作。

APACHE2HANDLER
PHP作为Apache模块,Apache服务器在系统启动后,预先生成多个进程副本驻留在内存中,一旦有请求出 现,就立即使用这些空余的子进程进行处理,这样就不存在生成子进程造成的延迟了。这些服务器副本在处理完一次HTTP请求之后并不立即退出,而是停留在计 算机中等待下次请求。对于客户浏览器的请求反应更快,性能较高。
apache模块的DLL:
该运行模式是我们以前在windows环境下使用apache服务器经常使用的,而在模块化(DLL)中,PHP是与Web服务器一起启动并运行的。(是apache在CGI的基础上进行的一种扩展,加快PHP的运行效率)

ISAPI:
ISAPI即Internet Server Application Program Interface,是微软提供的一套面向Internet服务的API接口
一个ISAPI的DLL,可以在被用户请求激活后长驻内存,等待用户的另一个请求,还可以在一个DLL里设置多个用户请求处理函数,此外,
ISAPI的DLL应用程序和WWW服务器处于同一个进程中,效率要显著高于CGI。(由于微软的排他性,只能运行于windows环境)

cli:
cli是php的命令行运行模式,大家经常会使用它,但是可能并没有注意到(例如:我们在linux下经常使用 “php -m”查找PHP安装了那些扩展就是PHP命令行运行模式;有兴趣的同学可以输入php -h去深入研究该运行模式)

总结:
每种运行模式都有自己的优缺点,没有绝对的好与坏,主要是看大家处理何种环境。

至于 apache 配 fastcgi ,可以看这里,http://huzhangsheng.blog.163.c…,还有这里,http://aiyooyoo.com/index.php/…,不过我是综合了他们两个,尽量做到少写,因为写多了也不知道写的是什么,我只在 234 行的 Directory 里面左右加上了

Options ExecCGI

然后在 242 行优先次序改成

<IfModule dir_module>
    DirectoryIndex index.php index.html
</IfModule>

最后在末尾加上

LoadModule fcgid_module modules/mod_fcgid.so
<IfModule mod_fcgid.c>
      AddHandler fcgid-script .php
      FCGIWrapper "C:/php/php-5.3.16/php-cgi.exe" .php
</IfModule>

顺便说一下,本来 php 是装在 program files 里面的,但是好像配置文件里面的 FCGIWrapper 的路径不能出现空格,于是就移到根目录来了,顺带的,原来 php 配置文件里面的所有路径都要跟着改,坑爹啊

于是 php 和 apache 的连结到此结束,后面就是装 mysql 了,mysql 有自己的配置向导,所以基本上就是一路 next 顺带改点小地方,没有什么特别需要注意的,最后装一个 phpmyadmin 完事

===================================================

2012-08-17 14:00:14 update 在配 apache 的 httpd.conf 文件时,发现了,同一个配置项只能一行,后面的会覆盖前面的。。

One thought on “再搭一次 Apache PHP MySQL 环境

  1. Pingback: 从点击到呈现 — 详解一次HTTP请求(1) | ZRJ

Leave a Reply

Your email address will not be published. Required fields are marked *