PHP:Hypertext Preprocessor超文本預處理器的縮寫,是一種被廣泛應用的開發(fā)源代碼的多用途腳本語言,它可以嵌套在HTML中,尤其是web開發(fā)。
PHP代碼塊被包含在特殊的起始符和結(jié)束符中的。
PHP功能:
1.服務端腳本是其主要領域,具有這項工作需要PHP解析器(CGI或服務器模塊)、web服務器、web瀏覽器支持。
2.命令行腳本,編寫一段php腳本,不需要任何服務器和瀏覽器來運行它,僅僅需要php解析器來執(zhí)行。
3.應用程序,通過PHP-GTK來編寫。
今天是搭建php來為今后的LNMP做個準備,所以我們的用途是web。
一些基本概念~
CGI:通用網(wǎng)關接口,為http服務器和其他機器上的程序服務通信交流的一種工具,CGI需要運行在網(wǎng)絡服務器上。
傳統(tǒng)CGI缺點:性能差,每次HTTP服務器遇到動態(tài)程序時都需要通過重新啟動解析器來執(zhí)行解析,之后結(jié)果才會被返回給HTTP服務器,這在處理高并發(fā)訪問時幾乎是不可用的。
FastCGI:是一個可伸縮、高速的HTTP服務器和動態(tài)腳本語言之間通信的接口,在unxi下是FastCGI的接口是socket,主要優(yōu)點是將動態(tài)語言和HTTP服務器分離出來。流行的HTTP服務器都支持FastCGI。
FastCGI接口采用C/S結(jié)構(gòu)。當http服務器遇到動態(tài)程序時,直接交付給FastCGI進程來執(zhí)行,結(jié)果返回給瀏覽器,HTTP服務器可以專一的處理靜態(tài)請求、將動態(tài)腳本服務器的結(jié)果返回給客戶端,提升整體新能。
FPM:FastCGI進程管理器,對高負載網(wǎng)站有很大幫助。功能有:支持平滑停止/啟動、可以工作于不同的 uid/gid/chroot 環(huán)境下,并監(jiān)聽不同的端口和使用不同的 php.ini 配置文件、
stdout 和 stderr 日志記錄、在發(fā)生意外情況的時候能夠重新啟動并緩存被破壞的 opcode、支持文件上傳優(yōu)化、慢日志、fastcgi_finish_request()- 特殊功能:用于在請求完成和刷新數(shù)據(jù)后,繼續(xù)在后臺執(zhí)行耗時的工作(錄入視頻轉(zhuǎn)換、統(tǒng)計處理等)、動態(tài)/靜態(tài)子進程產(chǎn)生、基本 SAPI 運行狀態(tài)信息(類似Apache的 mod_status)、基于 php.ini 的配置文件。
連接器(Connector):在mysql文檔中指出,連接器是允許應用程序連接到MySQL服務器的一個軟件,mysql提供了多數(shù)語言的連接器,包括php。
應用程序與數(shù)據(jù)庫通信,需要編寫php代碼執(zhí)行連接數(shù)據(jù)服務器、查詢數(shù)據(jù)庫、與數(shù)據(jù)庫相關的其他活動,需要軟件來提供php應用程序使用api。此軟件稱為連接器,允許應用程序連接到數(shù)據(jù)庫服務器。
Driver:驅(qū)動是一段設計用來于一種特定類型的數(shù)據(jù)庫服務器進行交互的軟件代碼。驅(qū)動可能會調(diào)用一些庫,比如MySQL客戶端庫或者MySQL Native驅(qū)動庫。 這些庫實現(xiàn)了用于和MySQL數(shù)據(jù)庫服務器進行交互的底層協(xié)議。
擴展:在php文檔中指出php代碼由核心組成,具有核心功能的可選擴展。php的MySQL擴展是使用php擴展框架實現(xiàn)的。擴展通常會向程序員公開api以允許編程方式使用工具或者不公開api。
API:應用程序變編程接口或API定義應用程序需要調(diào)用的類、方法、函數(shù)和變量,以執(zhí)行所需要的任務。對于需要與數(shù)據(jù)庫通信的php應用程序,必要的API通常通過PHP擴展來實現(xiàn)。
API可以是程序性的或者面向?qū)ο蟮?。使用過程api可以調(diào)用函數(shù)來執(zhí)行任務,使用面向?qū)ο骯pi可以通過api實例化類,然后在結(jié)果對象上調(diào)用方法。
在編寫需要連接到MySQL服務器的PHP應用程序時,有3個api選項(擴展)可用:
1.php的mysql擴展:允許開發(fā)與mysql數(shù)據(jù)庫交互的PHP應用程序,僅適用于mysql4.3.1以下版本,此擴展提供一個過程api;
通常擴展位于源碼包路徑下/ext/mysql中。(ext表示Extended file system 延伸文件系統(tǒng),簡稱ext)。
2.php的mysqli擴展:mysql的更新改進擴展,允許我們訪問MySQL 4.1及以上版本提供的功能,此擴展包含在php5以上版本,此mysqli擴展改進 面向?qū)ο蟮腶pi、支持多語句、增強調(diào)試功能等等。
通常擴展位于源碼包路徑下/ext/mysqli中。
3.php的數(shù)據(jù)對象pdo:pdo:PHP Data Objects簡寫,用于php應用程序的數(shù)據(jù)庫抽象層。無論應用程序連接到哪種類型的數(shù)據(jù)庫,pdo都會將php應用程序提供一致的api。
通常擴展位于源碼包路徑下/ext/pdo中。
驅(qū)動程序:
pdo_mysql 驅(qū)動程序:pdo_mysql是一個實現(xiàn)PHP數(shù)據(jù)對象(PDO)接口的驅(qū)動程序,用于實現(xiàn)從PHP到MySQL數(shù)據(jù)庫的訪問。
mysqlnd驅(qū)動程序:為了與mysql服務器通信,mysqli和pdo_mysql各自使用一個實現(xiàn)所需協(xié)議的庫。過去唯一使用的庫是mysql客戶端庫稱為libmysqlclient。libmysqlclient未針對php應用程序的通信做優(yōu)化,故而mysqlnd(mysql native本機本地 driver)被開發(fā)。MySQL Native Driver是使用PHP擴展框架實現(xiàn)的,位于源碼包路徑下ext/mysqlnd。它不會向PHP程序員公開API。只能與MySQL服務器版本4.1.3及更高版本一起使用。
mysqlnd不提供api,提供api的是擴展(mysqli和pdo),這些擴展使mysqlnd和mysql server進行通信。
mysqli擴展是在PHP 5.0.0版本中引入的。mysqlnd驅(qū)動程序包含在PHP 5.3.0版中。
從應用的層面(上層)來看,通過php的mysql和mysqli擴展提供的API去操作數(shù)據(jù)庫;
從底層來看,mysqlnd提供了底層和數(shù)據(jù)庫交互的支持(和mysql數(shù)據(jù)庫進行網(wǎng)絡協(xié)議交互);
在linux上安裝:
通常安裝php使用二進制版本安裝,這些二進制版本是在支持mysql擴展下構(gòu)建的,但擴展庫需要附加軟件包進行安裝。
從源代碼構(gòu)建PHP可以指定要使用的MySQL擴展,以及為每個擴展選擇客戶端庫。mysqlnd驅(qū)動程序是推薦的客戶端庫,因為它可以提高性能并允許訪問使用MySQL客戶端庫時不可用的功能。
PHP5.4以上版本默認的客戶端庫使用mysqlnd、選項配置–with-mysqli 。
擴展和客戶端庫可自由組合使用。如下:
./configure
–with-mysql=mysqlnd #使用mysql擴展并使用mysqlnd官方驅(qū)動程序
–with-mysqli=mysqlnd #使用mysqli擴展并使用mysqlnd官方驅(qū)動程序
–with-pdo-mysql=mysqlnd #使用pdo擴展并使用mysqlnd官方驅(qū)動程序
安裝FastCGI,在編譯安裝php時加入 –enable-fpm配置選項來激活FPM支持。
1.需要先檢查是否安裝nginx和mysql
[root@WebA-136 ~]# netstat -anlutp | egrep "mysql|nginx"
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4547/nginx
tcp 0 0 :::3306 :::* LISTEN 5891/mysqld
[root@WebA-136 ~]#
2.檢查依賴庫,檢查后linux只默認安裝了zlib-devel庫,記得安裝以下包哦~
[root@WebA-136 ~]# rpm -qa zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel libiconv-devel freetype-devel libpng-devel gd-devel libcurl-devel libxslt-devel
zlib-devel-1.2.3-29.el6.x86_64
[root@WebA-136 ~]#
居然yum源里沒有l(wèi)ibiconv-devel庫,需要手動安裝
[root@WebA-136 ~]#wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gz
[root@WebA-136 ~]# tar xf libiconv-1.15.tar.gz -C /usr/local/src/
[root@WebA-136 libiconv-1.15]# mkdir /usr/local/libiconv
[root@WebA-136 libiconv-1.15]# ./configure –prefix=/usr/local/libiconv
[root@WebA-136 libiconv-1.15]# make && make install
3.安裝epel源和libmcrypt庫(對程序運行時添加/移除算法有幫助)、mhash庫
[root@WebA-136 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyum.com/repo/epel-6.repo
[root@WebA-136 ~]# yum install libmcrypt-devel mhash -y
4.安裝mcrypt加密擴展庫
[root@WebA-136~]#yuminstallmcrypt-y
5.執(zhí)行./configure,一定要加入-enable-fpm配置選項來激活FPM支持的
./configure
–prefix=/usr/local/php7.2.5 #安裝位置
–enable-mysqlnd #使用mysqlnd
–with-mysqli=mysqlnd #使用mysqli擴展并使用mysqlnd官方驅(qū)動程序
–with-pdo-mysql=mysqlnd #使用pdo mysql擴展并使用mysqlnd官方驅(qū)動程序
–with-iconv-dir=/usr/local/libiconv #使php支持iconv函數(shù),用于字符編碼強制轉(zhuǎn)換
–with-freetype-dir #打開對freetype字體庫的支持
–with-jpeg-dir #打開對jpeg圖片支持
–with-png-dir #打開對png圖片支持
–with-zlib #打開對zlib庫支持
–with-libxml-dir #打開對libxml支持
–enable-xml #支持xml擴展
–disable-rpath #關閉額外的運行庫文件
–enable-bcmath #使用bcmath擴展,打開圖片大小調(diào)整,在zabbix監(jiān)控會用到
–enable-shmop
–enable-sysvsem
–enable-inline-optimization
–with-curl #打開對curl工具的支持
–enable-mbregex
–enable-fpm #打上PHP-fpm 補丁后才有這個參數(shù),CGI方式安裝的啟動程序
–enable-mbstring #多字節(jié)支持
–with-mcrypt=/usr/local/mcrypt #php7.2.5已廢棄此選項
–with-gd #對gd庫的支持
–enable-gd-native-ttf #php7.2.5已廢棄此選項
–with-openssl #對openssl的支持
–with-mhash #算法支持
–enable-pcntl # freeTDS需要用到的,可能是鏈接mysql用到
–enable-sockets #打開socket的支持
–with-xmlrpc #打開xml-rpc的c語言
–enable-soap
–enable-short-tags
–enable-static
–with-xsl #打開XSLT 文件支持,擴展了libXML2庫 ,需要libxslt軟件
–with-fpm-user=www #運行fpm的用戶
–with-fpm-group=www #運行fpm的組名
–enable-ftp #打開ftp的支持
–enable-opcache=no
其中與fpm有關的選項是:
–enable-fpm
–with-fpm-user=www 設置 FPM 運行的用戶身份(默認nobody)
–with-fpm-group=www 設置 FPM 運行時的用戶組(默認nobody)
–with-fpm-systemd 啟用 systemd 集成 (默認no)
–with-fpm-acl 使用POSIX訪問控制列表 (默認no)
編譯前需要做link
[root@WebA-136 php-7.2.5]# ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64/
[root@WebA-136 php-7.2.5]# touch ext/phar/phar.phar
[root@WebA-136 php-7.2.5]# make && make install
拷貝php.ini配置文件
[root@WebA-136 php]# cp /usr/local/src/php-7.2.5/php.ini-production /usr/local/php/lib/php.ini
[root@WebA-136 php]# cd /usr/local/php/etc/php-fpm.d
[root@WebA-136 php-fpm.d]# cp www.conf.default www.conf
[root@WebA-136 ~]# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
啟動php并查看
[root@iZ2ze4vbp6wu2etcksvay7Z php]# ./sbin/php-fpm
[root@iZ2ze4vbp6wu2etcksvay7Z php]# lsof -i :9000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
php-fpm 7677 root 7u IPv4 261689 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 7678 www 0u IPv4 261689 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 7679 www 0u IPv4 261689 0t0 TCP localhost:cslistener (LISTEN)
[root@iZ2ze4vbp6wu2etcksvay7Z php]# netstat -anltup | grep php
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 7677/php-fpm
[root@iZ2ze4vbp6wu2etcksvay7Z php]#
我安裝的是php7.2.5版本、linux是阿里云的服務器、nginx是1.14.2、mysql是5.6.40,過程中所遇到的問題如下:
1.virtual memory exhausted: Cannot allocate memory,虛擬內(nèi)存用盡無法分配內(nèi)存。
查看內(nèi)存情況如下:
[root@iZ2ze4vbp6wu2etcksvay7Zphp]#free-m totalusedfreesharedbufferscached Mem:996895100053299 -/+buffers/cache:542453 Swap:000 [root@iZ2ze4vbp6wu2etcksvay7Zphp]#
解決方法:
[root@iZ2ze4vbp6wu2etcksvay7Zphp]#ddif=/dev/zeroof=/opt/swapbs=1024count=2048000 [root@iZ2ze4vbp6wu2etcksvay7Zphp]#mkswap/opt/swap [root@iZ2ze4vbp6wu2etcksvay7Zphp]#swapon/opt/swap 安裝完php后執(zhí)行 [root@iZ2ze4vbp6wu2etcksvay7Zphp]#swapoff/opt/swap
phpize的用法:手動編譯安裝php的擴展
增加pdo擴展(我的已經(jīng)在安裝php的時候已經(jīng)增加此擴展了)
首先進去源碼包pdo目錄下
[root@iZ2ze4vbp6wu2etcksvay7Z ~]# cd /usr/local/src/php-7.2.5/ext/pdo
其次執(zhí)行/usr/local/php/bin/phpize生成配置文件
[root@iZ2ze4vbp6wu2etcksvay7Zpdo]#/usr/local/php/bin/phpize Configuringfor: PHPApiVersion:20170718 ZendModuleApiNo:20170718 ZendExtensionApiNo:320170718 [root@iZ2ze4vbp6wu2etcksvay7Zpdo]#
再使用生成的配置文件./configure –with-php-config=/usr/local/php/bin/php-config –enable-pdo=share
[root@iZ2ze4vbp6wu2etcksvay7Zpdo]#./configure--with-php-config=/usr/local/php/bin/php-config--enable-pdo=share
最后執(zhí)行make &&make install編譯安裝
[root@iZ2ze4vbp6wu2etcksvay7Zpdo]#make&&makeinstall
成功則出現(xiàn)
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/
Installing header files: /usr/local/php/include/php/
Installing PDO headers: /usr/local/php/include/php/ext/pdo/
說明在/usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/目錄下生成了pdo.so文件.
增加pdo_mayslq((我的已經(jīng)在安裝php的時候已經(jīng)增加此擴展了)),進入源碼包pdo_mysql目錄下,執(zhí)行/usr/local/php/bin/phpize生成配置文件
[root@iZ2ze4vbp6wu2etcksvay7Zext]#cdpdo_mysql/ [root@iZ2ze4vbp6wu2etcksvay7Zpdo_mysql]#/usr/local/php/bin/phpize
再使用生成的配置文件–with-php-config=/usr/local/php/bin/php-config –with-pdo-mysql=/usr/local/mysql
[root@iZ2ze4vbp6wu2etcksvay7Zpdo_mysql]#./configure–with-php-config=/usr/local/php/bin/php-config–with-pdo-mysql=/usr/local/mysql
最后make &&make install編譯安裝
[root@iZ2ze4vbp6wu2etcksvay7Zpdo_mysql]#make&&makeinstall
成功則出現(xiàn)
Installing shared extensions:/usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/
至此在此目錄下已分別生成pdo.so文件和pdo_mysql.so文件.
最后切換到php安裝目錄下找到php.ini配置文件
[root@iZ2ze4vbp6wu2etcksvay7Z pdo_mysql]# vim /usr/local/php/lib/php.ini 增加兩行: extension_dir=/usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/ extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/pdo.so
需要重啟php-fpm生效
FPM配置文件有php-fpm.conf和進程池配置文件兩個。
[root@WebA-136php]#vimetc/php-fpm.conf 有全局配置段和線程池配置段兩部分組成。
全局配置部分:
pid = string | PID文件的位置。默認為空 |
error_log = string | 錯誤日志的位置。默認:#INSTALL_PREFIX#/log/php-fpm.log。 如果設置為 "syslog",日志將不會寫入本地文件,而是發(fā)送到 syslogd。 |
log_level = string | 錯誤級別。可用級別為:alert(必須立即處理),error(錯誤情況),warning(警告情況),notice(一般重要信息),debug(調(diào)試信息)。默認:notice。 |
syslog.facility = string | 設置何種程序記錄消息,默認值:daemon |
syslog.ident = string |
為每條信息添加前綴。 如果在同一臺服務器上運行了多個 FPM 實例,可以修改此默認值來滿足需求。默認值:php-fpm。 |
emergency_restart_threshold =int |
如果子進程在 emergency_restart_interval 設定的時間內(nèi)收到該參數(shù)設定次數(shù)的 SIGSEGV 或者 SIGBUS退出信息號,則FPM會重新啟動。0 表示“關閉該功能”。默認值:0(關閉)。 |
emergency_restart_interval =mixed |
emergency_restart_interval 用于設定平滑重啟的間隔時間。這么做有助于解決加速器中共享內(nèi)存的使用問題??捎脝挝唬簊(秒),m(分),h(小時)或者 d(天)。默認單位:s(秒)。默認值:0(關閉)。 |
process_control_timeout =mixed |
daemonize =boolean 設置 FPM 在后臺運行。設置“no”將 FPM 保持在前臺運行用于調(diào)試。默認值:yes。 |
process.max =int | Fork的最大FPM進程數(shù)。使用動態(tài)管理進程數(shù)時,此設計可以控制在一個進程池內(nèi)的全局進程數(shù)量。使用需謹慎,默認值:0。 |
process.priority =int | 設置master進程的 nice(2) 優(yōu)先級(如果設置了此值)。 可以是 -19(最高優(yōu)先級)到 20(更低優(yōu)先級)。默認值:不設置。 |
daemonize =boolean | 設置 FPM 在后臺運行。設置“no”將 FPM 保持在前臺運行用于調(diào)試。默認值:yes。 |
rlimit_files =int | 設置master進程的打開文件描述符rlimit數(shù)。 |
rlimit_core =int | 設置master進程最大core的rlimit尺寸,默認值0。 |
events.mechanism =string | 設置FPM使用的事件機制??捎靡韵逻x項:select、pool、epoll、kqueue (*BSD)、port (Solaris)。 默認值:不設置(自動檢測) |
systemd_interval =int | 使用systemd集成的FPM時,設置間歇秒數(shù),報告健在通知給systemd。設置為0表示禁用。默認值10 |
線程池配置部分http://php.net/manual/zh/install.fpm.configuration.php
第一個php程序hello world。
helloworld ';>
在瀏覽器輸入day/hello.php
此程序僅僅使用了php的echo語句顯示了hello world。
繼續(xù)從php獲取系統(tǒng)信息,如下
輸出正在使用的瀏覽器
echo$_SERVER['HTTP_USER_AGENT']; >
以及以下:
if(strpos($_SERVER['HTTP_USER_AGENT'],'MSIE')!==FALSE){ echo'正在使用InternetExplorer。 '; } >
處理表單略過咯~