LAMP PHP 詳解
LAMP是一種生產環境中常用的web服務組合模型。
LAM(M)P所表達的組成方式
- L: linux
- A: apache (httpd)
- M: mysql, mariadb
- M:memcached
- P: php, perl, python
WEB資源類型:
- 靜態資源:原始形式與響應內容一致,在客戶端瀏覽器執行
- 動態資源:原始形式通常為程序文件,需要在服務器端執行之后,將執行結果返回給客戶端
Web相關語言
- 客戶端技術: html,javascript
- 服務器端技術:php, jsp,python,asp
通常,在低需求的企業環境中,我們可以將LAMP部署在同一台設備上,降低支出。但大多數情況,我們會將LAMP分離,分別部署在多台設備上,並讓他們連接通訊。
LAMP 請求流程與原理
CGI:Common Gateway Interface
可以讓一個客戶端,從網頁瀏覽器通過http服務器向執行在網絡服務器上的程序傳輸數據;CGI描述了客戶端和服務器程序之間傳輸的一種標准
請求流程:
Client -- (httpd) --> httpd -- (cgi) --> application server (programfile) -- (mysql) --> mysql
架構說明:
PHP 簡介
PHP是通用服務器端腳本編程語言,主要用於web開發實現動態web頁面,也是最早實現將腳本嵌入HTML源碼文檔中的服務器端腳本語言之一。同時,php還提供了一個命令行接口,因此,其也可以在大多數系統上作為一個獨立的shell來使用。
PHP Zend Engine
Zend Engine 1.0於1999年隨PHP 4發布,由C語言開發且經過高度優化,並能夠做為PHP的后端模塊使用。Zend Engine為PHP提供了內存和資源管理的功能以及其它的一些標准服務,其高性能、可靠性和可擴展性在促進PHP成為一種流行的語言方面發揮了重要作用。
Zend Engine的出現將PHP代碼的處理過程分成了兩個階段:首先是分析PHP代碼並將其轉換為稱作Zend opcode的二進制格式opcode(類似Java的字節碼),並將其存儲於內存中;第二階段是使用Zend Engine去執行這些轉換后的Opcode。
Opcode
Opcode是一種PHP腳本編譯后的中間語言,類似於Java的ByteCode,或者.NET的MSL。PHP執行PHP腳本代碼一般會經過如下4個步驟(確切的來說,應該是PHP的語言引擎Zend)
1、Scanning 詞法分析,將PHP代碼轉換為語言片段(Tokens)
2、Parsing 語義分析,將Tokens轉換成簡單而有意義的表達式
3、Compilation 將表達式編譯成Opcode
4、Execution 順次執行Opcode,每次一條,從而實現PHP腳本的功能
簡單來說的執行過程就是:掃描-->分析-->編譯-->執行
php 配置詳解
配置文件:
/etc/php.ini
/etc/php.d/*.ini
關於php所使用的配置文件,配置文件在php解釋器啟動時被讀取
對配置文件修改生效的方法:
- Modules:重啟httpd服務
- FastCGI:重啟php-fpm服務
php中的配置字段格式為: directiove = value 以鍵值對的形式存在。
注釋符:較新的版本中,已經完全使用;進行注釋
-
:純粹的注釋信息
- ;:用於注釋可啟用的directive
php.ini的核心配置選項文檔:
http://php.net/manual/zh/ini.core.php
、
php.ini配置選項列表:
http://php.net/manual/zh/ini.list.php
php語言格式
<?php
...php code...
?>
常用配置選項:
#設置程序 最長超時,生產中可以調大些
max_execution_time= 30
#設置程序占用的最大內存,生產不夠,可調大
memory_limit 128M
#調試使用,不要打開,否則可能暴露重要信息
display_errors off
#建議關閉
display_startup_errors off
#最大上傳數據大小,生產可能臨時要調大,比下面項要大
post_max_size 8M
#單個文件最大上傳文件,生產可能要調大
upload_max_filesize 2M
#同時上傳最多文件數
max_file_uploads = 20
#指定時區 默認該字段被注釋,使用格林威治時間
date.timezone =Asia/Shanghai
#開啟短標簽,如<? phpinfo();?>
short_open_tag=on
php 加速器
php的加速器:基於PHP的特殊擴展機制如opcode緩存擴展也可以將opcode緩存於php的共享內存中,從而可以讓同一段代碼的后續重復執行時跳過編譯階段以提高性能。這些加速器並非真正提高了opcode的運行速度,而僅是通過分析opcode后並將它們重新排列以達到快速執行的目的。
XCache
快速而且穩定的PHP opcode緩存,經過嚴格測試且被大量用於生產環境。項目地址:http://xcache.lighttpd.net/,收錄EPEL源
Zend Optimizer和Zend Guard Loader
Zend Optimizer並非一個opcode加速器,它是由Zend Technologies為PHP5.2及以前的版本提供的一個免費、閉源的PHP擴展,其能夠運行由ZendGuard生成的加密的PHP代碼或模糊代碼。 而Zend Guard Loader則是專為PHP5.3提供的類似於Zend Optimizer功能的擴展。項目地址http://www.zend.com/en/products/guard/runtime-decoders
NuSphere PhpExpress
NuSphere的一款開源PHP加速器,它支持裝載通過NuSphere PHP Encoder編碼的PHP程序文件,並能夠實現對常規PHP文件的執行加速。項目地址,http://www.nusphere.com/products/phpexpress.htm
部署LAMP
在LAMP架構中,每個服務都有他自身所負責的任務。
LAMP
httpd:接收用戶的web請求;靜態資源則直接響應;動態資源為php腳本,對此類資源的請求將交由php來運行
php:運行php程序
MariaDB/Mysql:數據管理系統,數據庫
其中http與php結合的方式
- CGI
- FastCGI
- modules (將php編譯成為httpd的模塊,默認方式,在使用該模式的時候,php就僅是http服務中的一個mod模塊,而不是一個獨立服務形式存在。)
MPM:
- prefork: libphp5.so
- event, worker: libphp5-zts.so
使用 php 連接 mysql
使用mysql擴展連接數據庫的測試代碼
<?php
#創建一個連接 參數分別為:主機名 mysql賬戶 密碼
$conn = mysql_connect(‘localhost','root','123456');
if ($conn)
echo "OK";
else
echo "Failure";
#echo mysql_error();
mysql_close();
?>
Php使用mysqli擴展連接數據庫的測試代碼
<?php
$mysqli=new mysqli("mysqlserver",“username",“password");
if(mysqli_connect_errno())
{
echo "Failure";
$mysqli=null;
exit;
}
echo “OK";
$mysqli->close();
?>
使用pdo擴展連接數據庫的測試代碼1
<?php
$dsn='mysql:host=localhost;dbname=mysql';
$username='root';
$passwd='centos';
$dbh=new PDO($dsn,$username,$passwd);
var_dump($dbh);
?>
使用pdo擴展連接數據庫的測試代碼2
<?php
try {
$user='root';
$pass=‘centos';
$dbh = new PDO('mysql:host=localhost;dbname=mysql', $user, $pass);
foreach($dbh->query('SELECT user,host from user') as $row) {
print_r($row);
}
$dbh = null;
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
?>
需要注意一點,前兩種方式只能連接mysql,而基於pdo的方式可以連接mysql,sql server ,oracle等主流數據庫。
最基本的部署LAMP
centos6
yum -y install httpd, php, php-mysql, mysql-server
service httpd start
service mysqld start
centos7
Modules模塊模式
yum -y install httpd php php-mysql mariadb-server
FastCGI獨立服務模式
yum -y install httpd php-fpm php-mysql mariadb-server
systemctl start httpd.service
systemctl start mariadb.service
注意:要使用prefork模型
部署PhpMyAdmin
#安裝lmap環境
yum -y install httpd mariadb-server php php-mysql php-mbstring
#啟動並初始化 phpmyadmin登錄必須使用密碼非空的賬戶
systemctl start httpd
systemctl start mariadb
mysql_secure_installation
下載:https://www.phpmyadmin.net/downloads/
#解壓 由於他是直接可以使用的php程序,所以放到我們的http根目錄下即可
tar xvf phpMyAdmin-4.0.10.20-all-languages.tar.xz cd /var/www/html
cd phpadmin/
#修改配置文件
cp config.sample.inc.php config.inc.php
vim config.inc.php
#修改該行為自定義隨機數,這是用來隨機cookie的
$cfg['blowfish_secret'] = 'a8b7c6d'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
#重新讀取配置即可
systemctl reload httpd
部署wordpress
在部署之前,我們可以需要創建一個數據庫和mysql賬戶,用於wordpress使用。
#下載
https://cn.wordpress.org
#解壓縮WordPress博客程序到網頁站點目錄下
unzip wordpress-4.3.1-zh_CN.zip
#創建wordpress用戶
mysql> create database wpdb;
mysql> grant all privileges on wpdb.* to wpuser@'%' identified by"wppass"
打開http://webserver/wordpress進行頁面安裝
或者 進入wordpress 目錄
cp wp-config-sample.php wp-config.php
vim wp-config.php
/** WordPress數據庫的名稱 */
define('DB_NAME', 'wpdb');
/** MySQL數據庫用戶名 */
define('DB_USER', 'http');
/** MySQL數據庫密碼 */
define('DB_PASSWORD', 'centos');
/** MySQL主機 */
define('DB_HOST', '192.168.1.10');
注意wordpress目錄權限
Setfacl –R –m u:apache:rwx wordpress
編譯安裝php-xcache訪問加速器
該軟件可以使用yum安裝,最新版本也是2014年的版本,已經是一個過時的老古董了。
yum install -y php-xcache
以下為編譯安裝步驟
#安裝編譯所需環境
yum groupinstall "development tools"
#安裝該軟件需要的配置文件生成器
yum install php-devel
下載並解壓縮xcache-3.2.0.tar.bz2
tar xvf xcache-3.2.0.tar.gz
cd xcache-3.2.0.tar.gz
#使用該命令生成配置文件
phpize
#編譯 安裝
./configure --enable-xcache --with-php-config=/usr/bin/php-config
make -j 4 && make install
#復制配置文件 /usr/lib64/php/modules/ 表示默認該模塊的位置,xcache已mod的形式存在
cp xcache.ini /etc/php.d/
#重啟服務 激活該MOD
systemctl restart httpd