1. 程式人生 > >11.32 php擴展模塊安裝

11.32 php擴展模塊安裝

11.32 php擴展模塊安裝

- 11.32 php擴展模塊安裝
- 擴展
- apache rewrite教程 http://coffeelet.blog.163.com/blog/static/13515745320115842755199/ http://www.cnblogs.com/top5/archive/2009/08/12/1544098.html
- apache rewrite 出現死循環 http://ask.apelearn.com/question/1043
- php錯誤日誌級別參考 http://ask.apelearn.com/question/6973
- php開啟短標簽 http://ask.apelearn.com/question/120
- php.ini詳解 http://legolas.blog.51cto.com/2682485/493917






# 11.32 PHP擴展模塊安裝
-  /usr/local/php/bin/php -m //查看模塊
-  下面安裝一個redis的模塊
-  cd /usr/local/src/
-  wget https://codeload.github.com/phpredis/phpredis/zip/develop 
-  mv develop phpredis-develop.zip
-  unzip phpredis-develop.zip
-  cd phpredis-develop
-  /usr/local/php/bin/phpize //生成configure文件
-  ./configure --with-php-config=/usr/local/php/bin/php-config
-  make && make install
-  /usr/local/php/bin/php -i |grep extension_dir //查看擴展模塊存放目錄,我們可以在php.ini中去自定義該路徑 
-  vim /usr/local/php/etc/php.ini  //增加一行配置(可以放到文件最後一行)
extension = redis.so  


- 
```
Last login: Fri Oct 13 20:46:33 2017
[[email protected] ~]# cd /usr/local/src/
[[email protected] src]# ls
apr-1.6.2              httpd-2.4.27                               php-5.6.30.tar.gz
apr-1.6.2.tar.gz       httpd-2.4.27.tar.gz                        php-7.1.6
apr-util-1.6.0         mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz  php-7.1.6.tar.bz2
apr-util-1.6.0.tar.gz  php-5.6.30

[[email protected] src]# wget https://codeload.github.com/phpredis/phpredis/zip/develop
--2017-10-13 21:20:21--  https://codeload.github.com/phpredis/phpredis/zip/develop
正在解析主機 codeload.github.com (codeload.github.com)... 192.30.255.121, 192.30.255.120
正在連接 codeload.github.com (codeload.github.com)|192.30.255.121|:443... 已連接。
已發出 HTTP 請求,正在等待回應... 200 OK
長度:未指定 [application/zip]
正在保存至: “develop”

    [      <=>                                       ] 224,195      116KB/s 用時 1.9s   

2017-10-13 21:20:24 (116 KB/s) - “develop” 已保存 [224195]

[[email protected] src]# du -sh develop 
220K	develop
[[email protected] src]# mv develop phpredis-develop.zip
[[email protected] src]# unzip phpredis-develop.zip

 inflating: phpredis-develop/tests/RedisTest.php  
  inflating: phpredis-develop/tests/TestRedis.php  
  inflating: phpredis-develop/tests/TestSuite.php  
  inflating: phpredis-develop/tests/make-cluster.sh  
  inflating: phpredis-develop/tests/mkring.sh  
[[email protected] src]# 
```
- 進入phpredis-develop 目錄下
```
[[email protected] src]# ls
apr-1.6.2              httpd-2.4.27.tar.gz                        php-7.1.6.tar.bz2
apr-1.6.2.tar.gz       mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz  phpredis-develop
apr-util-1.6.0         php-5.6.30                                 phpredis-develop.zip
apr-util-1.6.0.tar.gz  php-5.6.30.tar.gz
httpd-2.4.27           php-7.1.6
[[email protected] src]# cd phpredis-develop
[[email protected] phpredis-develop]# ls
arrays.markdown    CREDITS            php_redis.h         redis_commands.c
cluster_library.c  debian             README.markdown     redis_commands.h
cluster_library.h  debian.control     redis_array.c       redis_session.c
cluster.markdown   ISSUE_TEMPLATE.md  redis_array.h       redis_session.h
common.h           library.c          redis_array_impl.c  rpm
config.m4          library.h          redis_array_impl.h  serialize.list
config.w32         mkdeb-apache2.sh   redis.c             tests
COPYING            mkdeb.sh           redis_cluster.c
crc16.h            package.xml        redis_cluster.h
[[email protected] phpredis-develop]# 
```
- 用php7    /usr/local/php/bin/phpize //生成configure文件

```
[[email protected] phpredis-develop]# /usr/local/php/bin/phpize
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.

[[email protected] phpredis-develop]# 
```
- 顯示沒有生成 少一個包autoconf ,再繼續生成./configure,
```
[[email protected] phpredis-develop]# yum install -y autoconf



已安裝:
  autoconf.noarch 0:2.69-11.el7                                                          

作為依賴被安裝:
  m4.x86_64 0:1.4.16-10.el7                                                              

完畢!
[[email protected] phpredis-develop]# 

[[email protected] phpredis-develop]# /usr/local/php/bin/phpize
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226
[[email protected] phpredis-develop]# 
[[email protected] phpredis-develop]# ls
acinclude.m4       config.h.in   debian.control     mkinstalldirs       redis_cluster.h
aclocal.m4         config.m4     install-sh         package.xml         redis_commands.c
arrays.markdown    config.sub    ISSUE_TEMPLATE.md  php_redis.h         redis_commands.h
autom4te.cache     configure     library.c          README.markdown     redis_session.c
build              configure.in  library.h          redis_array.c       redis_session.h
cluster_library.c  config.w32    ltmain.sh          redis_array.h       rpm
cluster_library.h  COPYING       Makefile.global    redis_array_impl.c  run-tests.php
cluster.markdown   crc16.h       missing            redis_array_impl.h  serialize.list
common.h           CREDITS       mkdeb-apache2.sh   redis.c             tests
config.guess       debian        mkdeb.sh           redis_cluster.c
[[email protected] phpredis-develop]# 
```

- ./configure
```
[[email protected] phpredis-develop]# ./configure --with-php-config=/usr/local/php7/bin/php-config
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for a sed that does not truncate output... /usr/bin/sed
checking for cc... cc
checking whether the C compiler works... yes
checking for C compiler default 
```
- make   make install
```
[[email protected] phpredis-develop]# make

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

Build complete.
Don‘t forget to run ‘make test‘.

[[email protected] phpredis-develop]# 




[[email protected] phpredis-develop]# make install
Installing shared extensions:     /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/
[[email protected] phpredis-develop]# ls /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/
opcache.so  redis.so
[[email protected] phpredis-develop]# 
```
- 生成了一個redis.so  這個文件就是我們要的擴展模塊

- 現在php還不支持它,沒有模塊文件,現在還是不支持redis 的
```
[[email protected] phpredis-develop]# /usr/local/php7/bin/php -m
[PHP Modules]
bz2
Core
ctype
date
dom
exif
fileinfo
filter
gd
hash
iconv
json
libxml
mbstring
mcrypt
mysqli
openssl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
posix
Reflection
session
SimpleXML
soap
sockets
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib

[Zend Modules]

[[email protected] phpredis-develop]# 

[[email protected] phpredis-develop]# /usr/local/php7/bin/php -m |grep redis
[[email protected] phpredis-develop]# 

```
- 所以你需要把它配置一下,把它加載一下,需要去編輯配置文件

- 先找一下擴展模塊所在的路徑在哪裏
-  /usr/local/php/bin/php -i |grep extension_dir //查看擴展模塊存放目錄,我們可以在php.ini中去自定義該路徑 
```
[[email protected] phpredis-develop]# /usr/local/php7/bin/php -i |grep -i extension_dir
extension_dir => /usr/local/php7/lib/php/extensions/no-debug-zts-20160303 => /usr/local/php7/lib/php/extensions/no-debug-zts-20160303
sqlite3.extension_dir => no value => no value
[[email protected] phpredis-develop]# 
```
- 實際上就是我們剛剛看的目錄,這個extension_dir 也可以定義的
```
[[email protected] phpredis-develop]# ls /usr/local/php7/lib/php/extensions/no-debug-zts-20160303
opcache.so  redis.so
[[email protected] phpredis-develop]# 
```
- 之後需要編輯下vi /usr/local/php7/etc/php.ini   ,搜索extension,  在後面加上extension=redis.so
```
[[email protected] phpredis-develop]# vi /usr/local/php7/etc/php.ini

[PHP]

;;;;;;;;;;;;;;;;;;;
; About php.ini   ;


;extension=php_bz2.dll
;extension=php_curl.dll
;extension=php_fileinfo.dll
;extension=php_ftp.dll
;extension=php_gd2.dll
;extension=php_gettext.dll
;extension=php_gmp.dll
;extension=php_intl.dll
;extension=php_imap.dll
;extension=php_interbase.dll
;extension=php_ldap.dll
;extension=php_mbstring.dll
;extension=php_exif.dll      ; Must be after mbstring as it depends on it
;extension=php_mysqli.dll
;extension=php_oci8_12c.dll  ; Use with Oracle Database 12c Instant Client
;extension=php_openssl.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
;extension=php_pdo_sqlite.dll
;extension=php_pgsql.dll
;extension=php_shmop.dll

extension=redis.so
; The MIBS data available in the PHP distribution must be installed.
:wq
```
- dll後綴名結尾的,都是Windows使用的模塊
- 添加好配置以後查詢模塊是否存在
- 已經加載了 redis
```
[[email protected] phpredis-develop]# vi /usr/local/php7/etc/php.ini
[[email protected] phpredis-develop]# /usr/local/php7/bin/php -m |grep redis
redis
[[email protected] phpredis-develop]# 
```


- 如果你想編譯一個模塊,而且他自帶的源碼包目錄/usr/local/src/php-5.6.30/ext 下有,那麽只需要進行以下一些步驟,就可以完成擴展模塊新增
1、在你需要增加的拓展模塊的目錄下執行 /usr/local/php/bin/phpize ,生成一個configure 文件
2、執行 ./configure –with-php-config=/usr/local/php/bin/php-config 配置php-config文件
3、開始編譯 make
4、編譯後移動到目錄 make install
5、修改配置文件vim /usr/local/php/etc/php.ini ,新增所需extension=xxxx.so 拓展模塊

- 這就是php的擴展模塊安裝




- 當然還要一種方法  redis 和 是屬於第三方的 ,它在php源碼包裏面本身是沒有的
```
[[email protected] phpredis-develop]# cd
[[email protected] ~]# cd /usr/local/src/
[[email protected] src]# cd php-7.1.6
[[email protected] php-7.1.6]# ls
acinclude.m4      LICENSE                   README.namespaces
aclocal.m4        ltmain.sh                 README.NEW-OUTPUT-API
appveyor          main                      README.PARAMETER_PARSING_API
build             makedist                  README.REDIST.BINS
buildconf         Makefile                  README.RELEASE_PROCESS
buildconf.bat     Makefile.frag             README.SELF-CONTAINED-EXTENSIONS
CODING_STANDARDS  Makefile.fragments        README.STREAMS
config.guess      Makefile.gcov             README.SUBMITTING_PATCH
config.log        Makefile.global           README.TESTING
config.nice       Makefile.objects          README.TESTING2
config.status     makerpm                   README.UNIX-BUILD-SYSTEM
config.sub        meta_ccld                 README.WIN32-BUILD-SYSTEM
configure         missing                   run-tests.php
configure.in      mkinstalldirs             sapi
CONTRIBUTING.md   modules                   scripts
CREDITS           netware                   server-tests-config.php
ext               NEWS                      server-tests.php
EXTENSIONS        pear                      snapshot
footer            php7.spec                 stamp-h.in
generated_lists   php7.spec.in              stub.c
genfiles          php.gif                   tests
header            php.ini-development       travis
include           php.ini-production        TSRM
INSTALL           README.EXT_SKEL           UPGRADING
install-sh        README.GIT-RULES          UPGRADING.INTERNALS
libphp7.la        README.input_filter       vcsclean
libs              README.MAILINGLIST_RULES  win32
libtool           README.md                 Zend
[[email protected] php-7.1.6]# 
```
- 實際上在php源碼包裏面 有個 ext的目錄,這個下面有很多的 這種 所謂的模塊
```
[[email protected] php-7.1.6]# cd ext/
[[email protected] ext]# ls
bcmath      ext_skel            interbase  opcache       pdo_sqlite  skeleton  tokenizer
bz2         ext_skel_win32.php  intl       openssl       pgsql       snmp      wddx
calendar    fileinfo            json       pcntl         phar        soap      xml
com_dotnet  filter              ldap       pcre          posix       sockets   xmlreader
ctype       ftp                 libxml     pdo           pspell      spl       xmlrpc
curl        gd                  mbstring   pdo_dblib     readline    sqlite3   xmlwriter
date        gettext             mcrypt     pdo_firebird  recode      standard  xsl
dba         gmp                 mysqli     pdo_mysql     reflection  sysvmsg   zip
dom         hash                mysqlnd    pdo_oci       session     sysvsem   zlib
enchant     iconv               oci8       pdo_odbc      shmop       sysvshm
exif        imap                odbc       pdo_pgsql     simplexml   tidy
[[email protected] ext]# 

[[email protected] ext]# /usr/local/php7/bin/php -m |grep zip
[[email protected] ext]# 

```
- 比如說現在沒有zip ,假如說沒有zip 
- 那我現在需要編譯一個zip,先進入到zip目錄下來,然後直接執行 /usr/local/php7/bin/phpize
```
[[email protected] ext]# /usr/local/php7/bin/php -m |grep zip
[[email protected] ext]# cd zip/
[[email protected] zip]# ls
config.m4   CREDITS   lib             php_zip.c  tests  zip_stream.c
config.w32  examples  LICENSE_libzip  php_zip.h  TODO
[[email protected] zip]# /usr/local/php7/bin/phpize
Configuring for:
PHP Api Version:         20160303
Zend Module Api No:      20160303
Zend Extension Api No:   320160303
[[email protected] zip]# 
```
- 也就是說你想編譯一個擴展模塊的時候,如果它 自帶的源碼包裏面 ext 目錄下有這個目錄 ,那你就可以直接在這去編譯它 不用去下載了
- /usr/local/php7/bin/phpize 完成之後呢,./configure
```
[[email protected] zip]# ./configure --with-php-config=/usr/local/php7/bin/php-config


creating libtool
appending configuration tag "CXX" to libtool
configure: creating ./config.status
config.status: creating config.h
[[email protected] zip]# 
```
- make  ,make install
```
[[email protected] zip]# make

Build complete.
Don‘t forget to run ‘make test‘.

[[email protected] zip]# make install
Installing shared extensions:     /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/
[[email protected] zip]# 
[[email protected] zip]# ls /usr/local/php7/lib/php/extensions/no-debug-zts-20160303/
opcache.so  redis.so  zip.so
[[email protected] zip]# 
```
- 裏面多了一個zip.so ,這個就是怎麽去添加一個擴展模塊











### 擴展

- 1. apache rewrite教程 http://coffeelet.blog.163.com/blog/static/13515745320115842755199/ http://www.cnblogs.com/top5/archive/2009/08/12/1544098.html



- 2. apache rewrite 出現死循環 http://ask.apelearn.com/question/1043
我的一條規則
RewriteRule ^(.*) /111/$1 [R,L]
使用curl測試,沒有問題,但是使用瀏覽器訪問時,出現了無限循環。
本來訪問的是 www.111.com 結果變成了  www.111.com/111/111/111/..... 
雖然在最後加了 [L] 依然不管用,可能apache還是不夠智能,一直滿足條件就一直去匹配,一直去跳轉。最後沒招了只能再加一個條件。
RewriteCond   %{REQUEST_URI} !^/111
RewriteRule ^(.*) /111/$1 [R,L]
這樣就不再循環了。



- 3. php錯誤日誌級別參考 http://ask.apelearn.com/question/6973
php的錯誤日誌級別 error_report


; E_ALL             所有錯誤和警告(除E_STRICT外)
; E_ERROR           致命的錯誤。腳本的執行被暫停。
; E_RECOVERABLE_ERROR    大多數的致命錯誤。
; E_WARNING         非致命的運行時錯誤,只是警告,腳本的執行不會停止。
; E_PARSE            編譯時解析錯誤,解析錯誤應該只由分析器生成。
; E_NOTICE          腳本運行時產生的提醒(往往是我們寫的腳本裏面的一些bug,比如某個變量沒有定義),這個錯誤不會導致任務中斷。
; E_STRICT          腳本運行時產生的提醒信息,會包含一些php拋出的讓我們要如何修改的建議信息。
; E_CORE_ERROR      在php啟動後發生的致命性錯誤
; E_CORE_WARNING    在php啟動後發生的非致命性錯誤,也就是警告信息
; E_COMPILE_ERROR    php編譯時產生的致命性錯誤
; E_COMPILE_WARNING  php編譯時產生的警告信息
; E_USER_ERROR       用戶生成的錯誤
; E_USER_WARNING    用戶生成的警告
; E_USER_NOTICE      用戶生成的提醒



& 表示並且
~ 表示非
| 表示或者

比如: error_reporting  =  E_ALL & ~E_NOTICE  表示錯誤級別為E_ALL 並且除了E_NOTICE 








- 4. php開啟短標簽 http://ask.apelearn.com/question/120

控制參數: short_open_tag = On
如果設置為Off,則不能正常解析類似於這樣形式的php文件:
<?
phpinfo()
?>

而只能解析
<?php
phpinfo()
?>
這樣形式的php文件
所以要想php支持短標簽,需要我們把short_open_tag  設置為On.





- 5. php.ini詳解 http://legolas.blog.51cto.com/2682485/493917


11.32 php擴展模塊安裝