PHP的扩展安装

时间:2021-12-24 07:15:00
实在是不得已,php最简单的安装扩展,我也基本不会。。。
以前倒是做过,但是毕竟搞开发的,都是往上搜索,照着教程,一键安装。加之,开发,只搞代码,就够让人受的了,服务器的命令忘记的差不多,一般不太愿意搞服务器。现在,公司没有运维,必须得搞搞,另外,作为PHPer,安装个 PHP 扩展,居然还要往上搜索各种教程,而教程又是各种混乱。。

这篇博客的目的,就是自己走一遍整个流程,我是需要在 Linux 下,PHP使用 mongodb,以此为例,总结:

1.既然得使用 mongodb,系统得先安装这个工具。我没有通过源码安装,那个过程可能也很痛苦,直接yum安装:
	yum -y install mongodb

/*
	安装mongodb扩展,发现有2个:
		mongo
		mongodb
	区别:
		mongo 这个扩展已经废弃了,不过 bug 和 security 方面的问题还会继续修复,不支持PHP7
		mongodb 支持PHP7,同时不断加入 MongoDB 新版本的特性支持
		且两个扩展提供的类和接口完全不一样
 */

2.有了 mongodb,开始安装 php 相应的扩展(这也是这篇教程的主体内容)

	1>下载最新的 php mongodb 扩展源码
		http://pecl.php.net/package/mongodb

	2>看出来了吧,是放在 'pecl' 上的,这里得引出2个PHPer应该知道的东西(我之前真的已经看过N多次这些文章了,当时真心记忆的很好,现在真心是一点都想不起来)

		PEAR - PHP扩展与应用库(the PHP Extension and Application Repository)
			是一个PHP扩展及应用的代码仓库,纯粹由PHP代码编写。就是别人帮我们用PHP写了一些工具,图像处理、文件上传等,我们直接在我们项目中使用即可。

		PECL - PHP扩展库(PHP Extension Community Library)
			提供了一系列已知的扩展库,由C、C++等其他语言编写,以 '.so' 形式出现。'.so' 为共享库,是share object,用于动态链接。和 'dll' 差不多,比 'PEAR' 更快。(因为非PHP代码,需要在服务器上配置并注册到主机中)
			PHP的标准扩展,可以补充实际开发中所需的功能,所有的扩展都需要安装,windows下以 'DLL',linux下,需要进行编译,生成 '.so' 二进制

		最直接的表述:
			PEAR 是PHP的上层扩展,用过PHP来写的扩展
			PECL 是PHP的底层扩展,PHP可能不支持的一些操作系统底层的功能,通过C写个扩展,对PHP语言本身,进行了扩充(个人理解)

		综上所属,我们就知道了扩展PHP有2种方法:
			1.纯粹使用 PHP 代码来编写函数和类 - 其实也就是我们自己平常写的应用层代码。例如,写了一个 论坛、商城,或者 图片上传库、Excel导入导出的类库。PEAR就是这样的一个平台,其他人可以将自己的代码发布上来,主页:pear.php.net

			2.用C、C++等编写外部模块,然后加载到 PHP 中,对PHP进行了扩充(也可能通过php现有的已经可以实现,但是可能更快)。PECL就是这样一个平台,主页是:pecl.php.net

		参考文章:
			http://blog.csdn.net/21aspnet/article/details/158961

	3>打开 'http://pecl.php.net/package/mongodb',我们可以下载 'mongodb' 的PHP扩展包了。上方的包信息,homepage - 主页链接,我们点开,查看 'mongodb' 官方关于PHP Mongo扩展的一些介绍
		https://docs.mongodb.com/ecosystem/drivers/php/
		里面有:
			MongoDB PHP 扩展库的文档
			MongoDB PHP 和 HHVM 扩展库的文档
			MongoDB相关的一些兼容性
			MOngoDB扩展的几个类库(Mongo Queue PHP,Mongo PHP Adapter,Mongodm,Yadm),Mongo 可用的不同场景的扩展吧
			框架整合:
				Drupal,laravel,Yii2等

	4>我们只看第一个,MongoDB PHP扩展库:https://docs.mongodb.com/php-library/master/
		安装部分:https://docs.mongodb.com/php-library/master/tutorial/install-php-library/
		/*
			翻译:
		 */
		安装 MongoDB PHP 扩展库
			前提:
				MongoDB PHP库是MongoDB PHP驱动的高级抽象。 因此,您必须安装mongodb扩展以使用库。
				安装教程,链接到了PHP手册:http://php.net/manual/en/mongodb.installation.php
			步骤:
				1.安装库
					安装MongoDB PHP库的首选方法是在项目根目录,使用composer来安装:
						composer require mongodb/mongodb
					你可能也想通过源码包,来手动安装包,代码在 'github' 上 'https://github.com/mongodb/mongo-php-library/releases',不推荐这种方式安装

				2.配置自动加载
					一旦安装了库,确保我们的应用中,包含 Composer 的自动加载文件。'require_once' 语句应该,引入 Composer 的自动加载文件:
						require_one __DIR__ . '/vendor/autoload.php';

					可查看 Composer 的自动加载文档 'https://getcomposer.org/doc/01-basic-usage.md#autoloading'

				3.如果我们手动从源码包,安装库,需要手动来配置自动加载:
					1>使用你喜欢的自动加载实现,将*的 'MongoDB\' 命名空间指向 'src\' 目录
					2>手动 'require' 'src/functions.php' 文件,因为,PHP不支持函数自动加载

	5>打开PHP手册的mongodb的安装教程
		Installing the MongoDB PHP Driver with PECL - 通过 'PECL' 来安装
		Installing the MongoDB PHP Driver on OSX with Homebrew - max下通过 'brew' 来安装
		Installing the MongoDB PHP Driver on Windows - windows下安装
		Manually Installing the MongoDB PHP Driver - 手动安装 mongodb php 扩展(可以安装最新版本,从github上获取)
		Manually Installing the MongoDB HHVM Driver - 手动安装 mongodb hhvm 驱动

	6>我们从 'PECL' 安装:

		首先会发现一个 'PECL扩展库' 的安装 - http://php.net/manual/zh/install.pecl.intro.php

		PECL库,被称为共享扩展库(share object,也称动态扩展库),必须经过 编译、安装、然后加载。为什么称为共享呢,我们都知道windows下是 '.dll',linux下是 '.so',只要我们编译过,同样的环境和版本下,我们直接可以复制编译好的来使用。而且,不同于直接编译到PHP中的模块,我们可以使用 'dl()' 来动态加载。
			dl() - 在5.3版本,被某些SAPI移除了,现在貌似一直都支持。

		静态扩展库 - 直接编译在PHP中

		1)下载 PECL 扩展库
			1.pecl install 扩展库 - pear 命令
			2.在http://pecl.php.net/ 平台上,搜索我们想要安装的扩展库,然后下载
			3.pecl download 扩展库 - pear 命令
			4.SVN下载,大多数 PECL 扩展库也在SVN中,web页面,可查看 'http://svn.php.net/viewvc/pecl/'。从SVN下载,可用:
				svn checkout http://svn.php.net/repository/pecl/extname/trunk extname

		2)用PEAR编译共享PECL扩展库
			PECL 使建立共享 PHP 扩展库更容易。用 pecl 命令(好像命令都是pear的命令,pecl好像也是用pear来管理)
				1.pecl install 扩展库 		// 下载扩展库源代码 -> 编译 -> 并将 扩展库.so 安装到 'extension_dir' 目录下
				2.然后,我们就可在php.ini中,添加上 '.so' 扩展库
			默认情况下,pecl不会安装 'alpha' 或 'beta' 版本的包,如果没有 'stable' 版本的包可用,我们也可以安装 'beta' 版:
				pecl install extname-beta 		// beta版
			也可以安装一个指定的版本:
				pecl install extname-0.1 		// 指定版本

		3)用 phpize 编译共享 PECL 扩展库
			有时候,不能用pecl安装命令。可能是因为防火墙,或想要安装的扩展库还没有 PECL 兼容的包,例如 SVN 中尚未发布的扩展库。如果要编译这种扩展库,可以用更底层的编译工具来手工进行编译。
			phpize 命令,是用来准备PHP扩展库的编译环境的。我们说明下,使用 phpize 编译扩展库的步骤:
				1.下载扩展库,并解压,假设目录为 mongodb
				2.cd mongodb
				3.phpize 		// 准备编译环境
				4. ./configure 	// 生成makefile
				5.make 			// 编译
				6.make install 	// 安装
					生成的 mongodb.so,放在PHP的 'extension_dir - 扩展库目录'
				7.vim php.ini ,添加上 mongodb.so

		4)php-config
			php-config 是一个简单的命令行脚本用于获取所安装的 PHP 配置的信息。
			在编译扩展时,如果安装有多个 PHP 版本,可以在配置时用 --with-php-config 选项来指定使用哪一个版本编译,该选项指定了相对应的 php-config 脚本的路径。
			php-config -h 	// 查看命令行选项
				--prefix	PHP 所安装的路径前缀,例如 /usr/local
				--includes	列出用 -I 选项包含的所有文件
				--ldflags	PHP 编译时所使用的 LD 标志
				--libs	PHP 编译时所附加的库
				--extension-dir	扩展库的默认路径
				--include-dir	头文件的默认路径前缀
				--php-binary	PHP CLI 或者 CGI 可执行文件的完整路径
				--php-sapis	列出所有可用的 SAPI 模块
				--configure-options	重现当前 PHP 在编译时的配置选项
				--version	PHP 版本号
				--vernum	PHP 版本号,以整数表示

		5)将 PECL 扩展库,静态编译到 PHP 中
			有时可能需要将扩展库静态编译到 PHP 中。这需要将扩展库源程序放入 php-src/ext/ 目录中去并告诉 PHP 编译系统来生成其配置脚本(php编译的扩展模块目录:/usr/local/php/include/php/ext/ --- 这个地址不对,应该是下载的PHP源码时,自带的扩展目录)
			1>下载mongodb源码
				1.cd /usr/local/php/include/php/ext/ --- 这个地址不对,应该是下载的PHP源码时,自带的扩展目录
				2.pecl download mongodb
				3.gzip -d < mongodb-1.2.8.tgz | tar -xvf -
				4.mv mongodb-1.2.8 mongodb
			2>强制PHP重新生成配置脚本,然后正常编译PHP
				cd /usr/local/php/include/php/ext/
				rm configure
				./buildconf --force
				./configure --help
				./configure --with-mongodb --enable-其他扩展 --with-其他扩展
				make 
				make install
			3>是否用 --enable-extname 或 --with-extname 取决于扩展库。通常不需要外部库文件的扩展库使用 --enable。要确认的话,在 buildconf 之后运行:
				./configure --help | grep extname


		搜到一个有点用的文章,参考地址:
			http://wiki.jikexueyuan.com/project/extending-embedding-php/5.3.html

关于PEAR和PECL的命令,相关性,还是不清楚,有时间再看下,暂留:
	通过 PEAR 的 Package Manager 的安装管理方式,可以对 PECL 模块进行下载和安装
	http://baike.baidu.com/link?url=nVTwiCXUdXdlfux5Dch5WGjS1EufPMFbzJajJO1aT3nnCDl9D1mLNaZfv17J87b1_vBG_FlrxKHkNl1G1IhXTa - 可参考百度百科的这篇文章

	http://pear.php.net/manual/en/guide.users.commandline.cli.php
	
	http://blog.csdn.net/hguisu/article/details/7381978