1. 程式人生 > >十周第一次課

十周第一次課

php5 php7

11.10/11.11/11.12 安裝PHP5

PHP官網www.php.net
當前主流版本為5.6/7.1

PHP安裝最後的原因,就是因為PHP需要一個Apache的依賴包 apxs2
下載PHP 5.6

cd /usr/local/src
wget http://cn2.php.net/distributions/php-5.6.30.tar.gz

解壓縮

tar zxvf php-5.6.30.tar.gz

進入PHP目錄,開始初始化

cd php-5.6.30
 ./configure --prefix=/usr/local/php \                    //安裝目錄
--with-apxs2=/usr/local/apache2.4/bin/apxs \              //依賴Apache的一個工具,apxs2,不用手動的幹涉,自動的把拓展模塊放到目錄下
--with-config-file-path=/usr/local/php/etc  \             //指定配置文件所在路徑   (1)
--with-mysql=/usr/local/mysql \                           //指定MySQL的路徑     (2)在centos 7 直接不再使用這個配置
--with-pdo-mysql=/usr/local/mysql \                       //指定MySQL的庫的路徑 (2)
--with-mysqli=/usr/local/mysql/bin/mysql_config \         //指定MySQL的路徑 (2)
--with-libxml-dir \                                       //指定PHP需要的模塊
--with-gd \                                               //指定PHP需要的模塊
--with-jpeg-dir \                                         //指定PHP需要的模塊
--with-png-dir \                                          //指定PHP需要的模塊
--with-freetype-dir \                                     //指定PHP需要的模塊
--with-iconv-dir \                                        //指定PHP需要的模塊
--with-zlib-dir \                                         //指定PHP需要的模塊
--with-bz2 \                                              //指定PHP需要的模塊
--with-openssl \                                          //指定PHP需要的模塊
--with-mcrypt \                                           //指定PHP需要的模塊
--enable-soap \                                           //指定PHP需要的模塊
--enable-gd-native-ttf \                                  //指定PHP需要的模塊
--enable-mbstring \                                       //指定PHP需要的模塊
--enable-sockets \                                        //指定PHP需要的模塊
--enable-exif                                            //指定PHP需要的模塊
--with-config-file-path=/usr/local/php/etc  \             //指定配置文件所在路徑   (1)
PHP的配置文件php.ini
-with-mysql=/usr/local/mysql \                           //指定MySQL的路徑     (2)在centos 7 直接不再使用這個配置
--with-pdo-mysql=/usr/local/mysql \                       //指定MySQL的庫的路徑 (2)
--with-mysqli=/usr/local/mysql/bin/mysql_config \         //指定MySQL的路徑 (2)
讓MySQL和PHP通信,需要編譯支持的模塊

執行命令後提示

configure: error: xml2-config not found. Please check your libxml2 installation.

說明缺少 xml2 的庫 庫文件一般都是devel 為名字結尾的
搜索安裝包看看

yum list |grep xml2
[root@localhost php-5.6.30]# yum list |grep xml2
libxml2.x86_64                          2.9.1-6.el7_2.3                @anaconda
libxml2.i686                            2.9.1-6.el7_2.3                base
libxml2-devel.i686                      2.9.1-6.el7_2.3                base
libxml2-devel.x86_64                    2.9.1-6.el7_2.3                base
libxml2-python.x86_64                   2.9.1-6.el7_2.3                base
libxml2-static.i686                     2.9.1-6.el7_2.3                base
libxml2-static.x86_64                   2.9.1-6.el7_2.3                base
mingw32-libxml2.noarch                  2.9.3-1.el7                    epel
mingw32-libxml2-static.noarch           2.9.3-1.el7                    epel
mingw64-libxml2.noarch                  2.9.3-1.el7                    epel
mingw64-libxml2-static.noarch           2.9.3-1.el7                    epel
python-xml2rfc.noarch                   2.5.2-2.el7                    epel
tinyxml2.x86_64                         2.1.0-2.20140406git6ee53e7.el7 epel
tinyxml2-devel.x86_64                   2.1.0-2.20140406git6ee53e7.el7 epel
xml2.x86_64                             0.5-7.el7                      epel

是這個包,安裝一下

yum install -y libxml2-devel.x86_64

重新初始化一下看看,結果發現

configure: error: Cannot find OpenSSL‘s <evp.h>

繼續查找缺少的庫文件

[root@localhost php-5.6.30]# yum list |grep openssl-devel
openssl-devel.i686                      1:1.0.1e-60.el7_3.1            updates
openssl-devel.x86_64                    1:1.0.1e-60.el7_3.1            updates
xmlsec1-openssl-devel.i686              1.2.20-5.el7                   base
xmlsec1-openssl-devel.x86_64            1.2.20-5.el7                   base

繼續安裝庫文件

yum install -y openssl-devel.x86_64
安裝庫文件後,重新初始化

重新初始化一下看看,結果發現

configure: error: Please reinstall the BZip2 distribution

繼續查找庫

[root@localhost php-5.6.30]# yum list |grep bzip2-devel
bzip2-devel.i686                        1.0.6-13.el7                   base
bzip2-devel.x86_64                      1.0.6-13.el7                   base

繼續安裝庫文件

yum install -y bzip2-devel.x86_64

安裝庫文件後,重新初始化 繼續重復之前的操作

configure: error: jpeglib.h not found.
[root@localhost php-5.6.30]# yum install -y libjpeg-devel

繼續重復之前的操作

configure: error: png.h not found.
[root@localhost php-5.6.30]# yum install -y libpng-devel

繼續重復之前的操作

configure: error: freetype-config not found.
yum install -y freetype-devel

繼續重復之前的操作

configure: error: mcrypt.h not found. Please reinstall libmcrypt.

這個包屬於擴展源裏面的,需要先安裝一個擴展源,前提你之前沒有安裝過

yum install -y epel-release

安裝好拓展源以後,安裝對應缺少的庫

yum install -y libmcrypt-devel

最後一次 初始化,終於成功
進行make
結束後,使用echo $? 查看 並沒有問題
進行make install
結束後,使用echo $? 查看也沒有問題

查看 PHP 的服務

ls /usr/local/php/

核心二進制文件在 /usr/local/php/bin

[root@localhost php-5.6.30]# ls /usr/local/php/bin/
pear  peardev  pecl  phar  phar.phar  php  php-cgi  php-config  phpize

PHP和Apache 結合在一起靠的就是 libphp5.so 的文件

[root@localhost php-5.6.30]# ls /usr/local/apache2.4//modules/libphp5.so
/usr/local/apache2.4//modules/libphp5.so

查看PHP加載的模塊

/usr/local/php/bin/php -m

只能查看到靜態的模塊

根據

[root@localhost php-5.6.30]# /usr/local/apache2.4/bin/httpd -M
AH00558: httpd: Could not reliably determine the server‘s fully qualified domain name, using localhost.localdomain. Set the ‘ServerName‘ directive globally to suppress this message
 dir_module (shared)
 alias_module (shared)
 php5_module (shared)
 ...

PHP是做為一個擴展模塊加載到 Apache 裏面,所有Apache想要去執行、調用PHP的腳本,需要通過PHP Module 去進行調用
PHP的模塊文件路徑為

/usr/local/apache2.4/modules/libphp5.so
[root@localhost php-5.6.30]# ls -l /usr/local/apache2.4/modules/libphp5.so
-rwxr-xr-x. 1 root root 37752152 7月  27 22:04 /usr/local/apache2.4/modules/libphp5.so

啟動配置文件

vim /usr/local/apache2.4/conf/httpd.conf

在httpd 的配置文件裏面新增了一行,指定了php5_module 的路徑為 modules/libphp5.so
這些內容裏面的都是一些不顯示不調用的模塊,如果有需要,只需要把 # 註釋刪除掉就可以進行調用


LoadModule autoindex_module modules/mod_autoindex.so
#LoadModule info_module modules/mod_info.so
#LoadModule cgid_module modules/mod_cgid.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule vhost_alias_module modules/mod_vhost_alias.so
#LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
#LoadModule actions_module modules/mod_actions.so
#LoadModule speling_module modules/mod_speling.so
#LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
#LoadModule rewrite_module modules/mod_rewrite.so
LoadModule php5_module        modules/libphp5.so

安裝完成PHP以後,需要把配置文件拷貝到指定路徑下

cp php.ini-production  /usr/local/php/etc/php.ini

兩個配置文件
php.ini-development 這個是測試環境用的
php.ini-production 這個是線上生產環境用的
拷貝好配置文件,在重新使用

usr/local/php/bin/php -i |less

就會發現 Loaded Configuration File => (none) 這一項有了配置文件路徑 /usr/local/php/etc/php.ini

使用

/usr/local/php/bin/php -i |less

可以查看到PHP 的一些信息,包括編譯參數

phpinfo()
PHP Version => 5.6.30

System => Linux localhost.localdomain 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64
Build Date => Jul 27 2017 22:01:59
Configure Command =>  ‘./configure‘  ‘--prefix=/usr/local/php‘ ‘--with-apxs2=/usr/local/apache2.4/bin/apxs‘ ‘--with-config-file-path=/usr/local/php/etc‘ ‘--with-mysql=/usr/local/mysql‘ ‘--with-pdo-mysql=/usr/local/mysql‘ ‘--with-mysqli=/usr/local/mysql/bin/mysql_config‘ ‘--with-libxml-dir‘ ‘--with-gd‘ ‘--with-jpeg-dir‘ ‘--with-png-dir‘ ‘--with-freetype-dir‘ ‘--with-iconv-dir‘ ‘--with-zlib-dir‘ ‘--with-bz2‘ ‘--with-openssl‘ ‘--with-mcrypt‘ ‘--enable-soap‘ ‘--enable-gd-native-ttf‘ ‘--enable-mbstring‘ ‘--enable-sockets‘ ‘--enable-exif‘
Server API => Command Line Interface
Virtual Directory Support => enabled
Configuration File (php.ini) Path => /usr/local/php/etc            //configurtion 的配置路勁
Loaded Configuration File => (none)                                 /這些都沒有加載任何東西,因為   /usr/local/php/etc 目錄想天是空的,沒有加載任何配置文件
Scan this dir for additional .ini files => (none)
Additional .ini files parsed => (none)
PHP API => 20131106
PHP Extension => 20131226
Zend Extension => 220131226
Zend Extension Build => API220131226,TS
PHP Extension Build => API20131226,TS
Debug Build => no
Thread Safety => enabled
Zend Signal Handling => disabled
Zend Memory Manager => enabled
Zend Multibyte Support => provided by mbstring

11.13 安裝PHP7

安裝 PHP 7

安裝編譯時需要的模塊

yum -y install libxml2
yum -y install libxml2-devel

yum -y install openssl
yum -y install openssl-devel
yum -y install curl
yum -y install curl-devel
yum -y install libjpeg
yum -y install libjpeg-devel
yum -y install libpng
yum -y install libpng-devel
yum -y install freetype
yum -y install freetype-devel
yum -y install libxslt
yum -y install libxslt-devel
yum -y install bzip2
yum -y install bzip2-devel

進入目錄,下載文件

cd /usr/local/src/
axel http://mirrors.sohu.com/php/php-7.2.1.tar.xz

因為是bz2的包,需要用jxvf 來解壓

tar xf php-7.2.1.tar.xz

進入php目錄

cd php-7.1.6

初始化配置

./configure --prefix=/usr/local/php7 --exec-prefix=/usr/local/php7 --bindir=/usr/local/php7/bin --sbindir=/usr/local/php7/sbin --includedir=/usr/local/php7/include --libdir=/usr/local/php7/lib/php --mandir=/usr/local/php7/php/man --with-config-file-path=/usr/local/php7/etc --with-mysql-sock=/tmp/mysql.sock --with-apxs2=/usr/local/apache2.4/bin/apxs --with-pdo-mysql --with-mysqli --with-zlib-dir --with-mhash --with-openssl --with-gd --with-iconv --with-zlib --enable-zip --enable-inline-optimization --disable-debug --disable-rpath --enable-shared --enable-xml --enable-bcmath --enable-shmop --enable-sysvsem --enable-mbregex --enable-mbstring --enable-ftp --enable-pcntl --enable-sockets --with-xmlrpc --enable-soap --without-pear --with-gettext --enable-session --with-curl --with-jpeg-dir --with-freetype-dir --enable-opcache --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --without-gdbm --disable-fileinfo
make && make install

一臺機器上可以安裝兩個PHP 不過需要指定調用

cp php.ini-* /usr/local/php7/etc/
cp php.ini-production /usr/local/php7/etc/php.ini
cp /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.conf
cp /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf

#php-fpm
cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm
vim /usr/local/php7/etc/php.ini //編輯配置文件
mysqli.default_socket = /usr/local/mysql/mysql.sock //將php與mysql關聯
date.timezone = Asia/Shanghai //時區設置

搜索php 把其中一個模塊註釋掉就可以了
路徑有區別

ls /usr/local/apache2.4/modules/libphp7.so
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload

php中mysql,mysqli,mysqlnd,pdo到底是什麽

名詞解釋:
最開始的初學者,往往搞不清mysqli,mysqlnd,pdo到底是什麽,下面先直接貼出最直觀的名字吧。

MYSQL:This extension is deprecated as of PHP 5.5.0, and has been removed as of PHP 7.0.0. 
MYSQLI: MySQL Improved Extension 
MySQLND: MySQL Native Drive 
PDO:The PHP Data Objects。extension defines a lightweight, consistent interface for accessing databases in PHP。
以上摘自 PHP官方手冊: http://php.net/manual/en/book.mysqli.php
用中文說: 
MYSQL 也叫 Original MySQL,PHP4版本的MYSQL擴展,從PHP5起已經被廢棄,並別從PHP7開始已經被移除。
MYSQLI 叫做 “MySQL增強擴展”。
MYSQLND MYSQL NATIVE DIRVER 叫做MYSQL “官方驅動”或者更加直接點的叫做“原生驅動”
PDO PHP Data Objects PHP數據對象,是PHP應用中的一個數據庫抽象層規範。

針對本篇文章
再補充幾個名詞解釋:
1 什麽是API?
一個應用程序接口(Application Programming Interface的縮寫),定義了類,方法,函數,變量等等一切 你的應用程序中為了完成特定任務而需要調用的內容。在PHP應用程序需要和數據庫進行交互的時候所需要的API 通常是通過PHP擴展暴露出來(給終端PHP程序員調用)。
上文所說的MYSQL 和MYSQLI擴展就提供了這樣的API。
2什麽是驅動?
驅動是一段設計用來於一種特定類型的數據庫服務器進行交互的軟件代碼。驅動可能會調用一些庫,比如MySQL客戶端庫或者MySQL Native驅動庫。 這些庫實現了用於和MySQL數據庫服務器進行交互的底層協議。
在PHP拓展的角度上看,MYSQL和MYSQLi還是比較上層的拓展,依賴更底層的庫去連接和訪問數據庫。
上文所說的MYSQLND 就是所說的底層的數據庫驅動。當然,還有一個驅動叫做libmysqlclient。至於如何選擇使用這兩種驅動的哪一種,請看這裏選擇哪一種底層數據庫驅動。
總的來說:
從應用的層面上看,我們通過PHP 的MYSQL或者MYSQLi擴展提供的API去操作數據庫。
從底層來看,MYSQLND提供了底層和數據庫交互的支持(可以簡單理解為和MySQL server進行網絡協議交互)。
而PDO,則提供了一個統一的API接口,使得你的PHP應用不去關心具體要連接的數據庫服務器系統類型。也就是說,如果你使用PDO的API,可以在任何需要的時候無縫切換數據庫服務器。比如MYSQL,SQLITE任何數據庫都行。
即從大部分功能上看,PDO提供的API接口和MYSQLI提供的接口對於普通的增刪改查效果是一致的。
最後貼下代碼:
MYSQL連接:

<?php
$conn = @ mysql_connect("localhost", "root", "") or die("數據庫連接錯誤");
mysql_select_db("bbs", $conn);
mysql_query("set names ‘utf8‘");
echo "數據庫連接成功";
?>
MYSQLI連接:
<?php
$conn = mysqli_connect(‘localhost‘, ‘root‘, ‘‘, ‘bbs‘);
if(!$conn){
die("數據庫連接錯誤" . mysqli_connect_error());
}else{
echo"數據庫連接成功";
}
?>
PDO連接:
<?php
try{
$pdo=new pdo("mysql:host=localhost;dbname=bbs","root","");
}catch(PDDException $e){
echo"數據庫連接錯誤";
}
echo"數據庫連接成功";
?>
想更多去了解他們的區別和聯系,可以手動去編譯一下PHP的源代碼。註意參數
--enable-pdo 
--with-pdo-mysql
--enable-mysqlnd 
--with-mysqli
--with-mysql//php7的已經不再支持,此參數configure 的時候會報ERROR

http://blog.csdn.net/u013785951/article/details/60876816

查看編譯參數

Linux下查看Nginx、Napache、MySQL、PHP的編譯參數的命令如下:

1、nginx編譯參數:

#/usr/local/nginx/sbin/nginx -V

2、apache編譯參數:

# cat /usr/local/apache/build/config.nice

3、php編譯參數:

# /usr/local/php/bin/php -i |grep configure

4、mysql編譯參數:

# cat /usr/local/mysql/bin/mysqlbug|grep configure

http://ask.apelearn.com/question/1295

十周第一次課