php-5.x.x-Win32.zip的组织

来源:百度文库 编辑:16楼社区 时间:2021/02/27 08:02:05
http://bbs.phpeye.com/thread-34-1-1.html
不知分析过php文件组织的人多不多,我个人有最小化倾向,总喜欢把一个东西拆开来然后重新一块块拼起来,这回拿php压缩包开涮:)
最小化情况下的php其实只需要两个文件就能运行了: php5ts.dll和一个sapi(Server API,说白了就是接口),如php.exe或
php5apache2_2.dll,等等。php语言的完整功能都集中在一个动态链接库 php5ts.dll 里,其它都是外设 :) 这个名字也不是乱取的,
ts实际上是线程安全的缩写。所以,如果需要一个命令行脚本解释器,那么 phpt5s.dll + php.exe 就足够,如果需要以apache模块的
方式运行php解释器,那么 php5ts.dll + php5apache2_2.dll 就足够(根据apache版本加载相应的sapi)。
这种情况下,其实还隐含了一个文件,想必你也猜出来了,就是 php.ini 文件。当没有给php提供配置文件时,它会默认使用一个配置文件,
这个文件就是php.ini-dist。所以,在前两个文件的基础上,再加上一个php.ini文件,就可以完全定制php的行为了。
在哪寻找这个 php.ini 是由sapi决定的,比如命令行下可以用 php -c 来控制加载哪个 php.ini,apache模块里可以用httpd.conf的PHPIniDir
来决定在哪寻找 php.ini,等等。
那么,sapi运行时在哪找php5ts.dll? 首先是在sapi的当前目录,如果找不到,就到PATH目录去找。这个跟后面会讲到的“扩展加载外部库”
实际上原理是一样的,不过有一点区别:php_xxx.dll加载外部库时,外部库跟php_xxx.dll在同一个目录下并没有用,而必须在PATH或调用
php_xxx.dll的sapi目录下才行,以前很多人安装php时,把php5ts.dll和libmysql.dll拷贝到apache的bin目录下就是这个原因。
现在有三个文件了: php5ts.dll, sapi, php.ini。该是添加php扩展的时候了,这些众多的扩展才是php的威力所在!怎么通向扩展?总得
有条路子对不对,呵呵。这条路子就是php.ini里的 extension_dir 配置项。把这个配置项设为 php 扩展的路径,就可以把这些php扩展
导到php里。设置了 extension_dir 选项后,就往这个目录下塞你需要的扩展,然后在 php.ini 里做个记号:extension=php_xxx.dll即可。
扩展并不是都是同一类的,有些扩展本身自己实现了功能函数,有些扩展则链接到外部函数库(zend扩展不在讨论之列)。比如
php_gd2.dll,php_socket.dll,php_memcached.dll,都是自己实现了功能函数;而php_mysql.dll,则是链接到外部函数库的,这个外部
库就是我们熟悉的libmysql.dll。还有其它扩展如oci,也需要外部函数库。
那么,需要外部函数库的扩展,到哪去找这些函数库?一个地方是调用sapi的目录,另一个地方是PATH环境变量定义的目录。前面说过,
跟扩展在同一个目录下是没有用的,除非这个目录也在PATH里。php包的根目录下一大堆的libxxx.dll,fdftk.dll,ssleay32.dll,yaz.dll等等
都是外部函数库。
除了上面讲的这些最核心的文件外,还有其它几个文件和目录,这些目录基本上是给开发和扩展php用的,应用层的php程序基本用不到
这些文件和目录。不过这里有一个例外,就是go-pear.bat文件和PEAR目录,这些是安装PEAR用的,PEAR是一套可复用的类库,可以在
多个项目中复用这些代码。关于PEAR的详细介绍我就不讲了,已经有很多文章介绍这个了,呵呵。
大致就先写这些,有什么想法大家多讨论讨论:)