php可以分为核心+扩展。
以php-5.5.29的源码为例:
yankedeMacBook-Pro-2:php-5.5.29 yanke$ tree -d -L 1
.
├── TSRM
├── Zend
├── build
├── ext
├── include
├── libs
├── main
├── modules
├── netware
├── pear
├── sapi
├── scripts
├── tests
├── travis
└── win32
yankedeMacBook-Pro-2:php-5.5.29 yanke$ tree -d -L 1 ext
ext
├── bcmath
├── bz2
├── calendar
├── com_dotnet
├── ctype
├── curl
├── date
├── dba
├── dom
├── enchant
├── ereg
├── exif
├── fileinfo
├── filter
├── ftp
├── gd
├── gettext
├── gmp
├── hash
├── iconv
├── imap
├── interbase
├── intl
├── json
├── ldap
├── libxml
├── mbstring
├── mcrypt
├── mssql
├── mysql
├── mysqli
├── mysqlnd
├── oci8
├── odbc
├── opcache
├── openssl
├── pcntl
├── pcre
├── pdo
├── pdo_dblib
├── pdo_firebird
├── pdo_mysql
├── pdo_oci
├── pdo_odbc
├── pdo_pgsql
├── pdo_sqlite
├── pgsql
├── phar
├── posix
├── pspell
├── readline
├── recode
├── reflection
├── session
├── shmop
├── simplexml
├── skeleton
├── snmp
├── soap
├── sockets
├── spl
├── sqlite3
├── standard
├── sybase_ct
├── sysvmsg
├── sysvsem
├── sysvshm
├── tidy
├── tokenizer
├── wddx
├── xml
├── xmlreader
├── xmlrpc
├── xmlwriter
├── xsl
├── zip
└── zlib
77 directories
可以看到php有很多的扩展,在默认情况下,这些扩展都是没有安装的。
以curl扩展库为例,我在代码中需要使用curl_init()/curl_setopt()/curl_exec()/curl_close()函数,那就需要有curl的扩展库。否则执行会报错:
开始进入正题,如何安装curl扩展?我们采用源码编译方式。
1.下载源码,进入源码下ext/curl目录:
yankedeMacBook-Pro-2:curl yanke$ pwd
/Users/yanke/Downloads/php-5.5.29/ext/curl
yankedeMacBook-Pro-2:curl yanke$ phpize
Configuring for:
PHP Api Version: 20121113
Zend Module Api No: 20121212
Zend Extension Api No: 220121212
注:phpize是一个shell脚本,用于生成configure等文件。
3. 执行: ./configure
根据当前环境生成makefile文件
4. 执行编译: make
5. 测试: sudo test
直接看最后的结果:
=====================================================================
TEST RESULT SUMMARY
---------------------------------------------------------------------
Exts skipped : 0
Exts tested : 27
---------------------------------------------------------------------
Number of tests : 95 89
Tests skipped : 6 ( 6.3%) --------
Tests warned : 0 ( 0.0%) ( 0.0%)
Tests failed : 1 ( 1.1%) ( 1.1%)
Expected fail : 0 ( 0.0%) ( 0.0%)
Tests passed : 88 ( 92.6%) ( 98.9%)
---------------------------------------------------------------------
Time taken : 111 seconds
=====================================================================
=====================================================================
FAILED TEST SUMMARY
---------------------------------------------------------------------
Bug #64267 (CURLOPT_INFILE doesn't allow reset) [tests/bug64267.phpt]
=====================================================================
我曾试这修复,但发现代码已经是修复后的代码,这个不应该是很奇怪的事情么!!!
代码diff链接: http://git.php.net/?p=php-src.git;a=blobdiff;f=ext/curl/interface.c;h=765918cc3546ce1a1ed9c8697b234e01e3028834;hp=87b871f2032b9b5a9c70fb4f9e15341879a1831d;hb=54fee59598082052395f4011931096babd6f4013;hpb=220e0d4a5597e2c5248f77da6e88983b9fdd3808
6. 安装: make install
yankedeMacBook-Pro-2:curl yanke$ sudo make install
Password:
Installing shared extensions: /usr/local/lib/php/extensions/no-debug-non-zts-20121212/
由于安装的路径需要root权限,所有在make之前增加sudo。
7. 修改配置文件:
不知道配置文件在哪的,请执行phpinfo()函数,查找php.ini。
yankedeMacBook-Pro-2:curl yanke$ sudo vi /usr/local/lib/php.ini
Password:
增加:
extension=/usr/local/lib/php/extensions/no-debug-non-zts-20121212/curl.so
注: 以上环境为Mac。如果为Linux、Windows,可能会有所不同。