LAMP & PHP介绍

本文介绍了LAMP(Linux、Apache、MySQL、PHP)的概念,包括LAMP的工作原理、CGI、PHP的Zend Engine和Opcode。此外,详细讲述了PHP的配置和使用MySQL扩展进行数据库连接的测试,以及LAMP的部署与配置过程,包括HTTP与PHP结合的方式和在CentOS 6/7上的安装步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LAMP 相关概念介绍

1、LAM(M)P

L    # linux
A    # apache (httpd)
M    # mysql, mariadb
M    # memcached
P    # php, perl, python

2、web 资源类型

  1. 静态资源:原始形式与响应内容一致
  2. 动态资源:原始形式通常为程序文件,需要在服务器端执行之后,将执行结果返回给客户端

3、web 相关语言

  1. 客户端技术:html,javascript,css,jpg
  2. 服务器端技术:php, jsp,python,asp

4、CGI(Common Gateway Interface)

  • 通用网关接口:可以让一个客户端,从网页浏览器通过http服务器向执行在网络服务器上的程序传输数据;CGI描述了客户端和服务器程序之间传输的一种标准。

  • 程序=指令+数据

    数据模型:
    	层次模型
    	网状模型
    	关系模型:表(行+列)
    					
    		关系模型  # IngreSQL, Oracle, Sybase, Infomix, DB2
    				 # SQL Server, MySQL, PostgreSQL, MariaDB
    				
    指令:代码文件
    数据:数据存储系统、文件
    
  • CGI 请求流程

    Client--(httpd)-->httpd--(cgi)-->application server(program file)--(mysql)-->mysql 
    
  • php:本编程语言、嵌入到html中的嵌入式web程序开发语言;基于zend编译成opcode(二进制格式的字节码,重复运行,可省略编译环境)。

5、LAMP 工作原理

在这里插入图片描述

6、AMP 使用概述

AMP 组合方式

第一种:client --> http protocol --> httpd + php module --> (php-mysql, mysql protocol) --> mysqld
第二种:client --> http protocol --> httpd --> fastcgi protocol --> fpm (php application server) --> (php-mysql, mysql protocol) --> mysqld

AMP 快速部署

CentOS 7:

  • Modules:程序包 httpd, php, php-mysql, mariadb-server
  • Modules:启动的服务 systemctl start mariadb.service httpd.service
  • FastCGI:程序包 httpd, php-fpm, php-mysql, mariadb-server
  • FastCGI:启动的服务 systemctl start mariadb.service php-fpm.service httpd.service

CentOS 6:

  • Modules:程序包 httpd, php, php-mysql, mysql-server
  • Modules:启动的服务 service mysqld start, service httpd start

PHP 相关概念介绍

1、PHP 简介

  • 官网:http://www.php.net/
  • PHP是通用服务器端脚本编程语言,主要用于web开发实现动态web页面,也是最早实现将脚本嵌入HTML源码文档中的服务器端脚本语言之一。同时,php还提供了一个命令行接口,因此,其也可以在大多数系统上作为一个独立的shell来使用
  • Rasmus Lerdorf 于1994年开始开发PHP,最初是一组被Rasmus Lerdorf 称作“Personal Home Page Tool” 的Perl脚本, 可以用于显示作者的简历并记录用户对其网站的访问。后来,Rasmus Lerdorf 使用C语言将这些Perl脚本重写为CGI程序,还为其增加了运行Web forms的能力以及与数据库交互的特性,并将其重命名为“Personal Home Page/Forms Interpreter” 或 “PHP/FI”。此时,PHP/FI 已经可以用于开发简单的动态 web 程序了,这即PHP1.0。1995年6月,Rasmus Lerdorf把它的PHP发布于comp.infosystems.www.authoring.cgi Usenet 讨论组,从此PHP开始走进人们的视野。1997年,其2.0版本发布

1997年,两名以色列程序员 Zeev Suraski 和 Andi Gutmans 重写的PHP的分析器(parser)成为PHP发展到3.0的基础,而且从此将PHP重命名为PHP: Hypertext Preprocessor。此后,这两名程序员开始重写整个PHP核心,并于1999年发布了Zend Engine 1.0,这也意味着PHP 4.0的诞生。2004年7月,Zend Engine 2.0发布,由此也将PHP带入了PHP 5时代。PHP5包含了许多重要的新特性,如增强的面向对象编程的支持、支持PDO(PHP Data Objects)扩展机制以及一系列对PHP性能的改进

2、PHP Zend Engine

  • Zend Engine是开源的、PHP脚本语言的解释器,它最早是由以色列理工学院(Technion)的学生Andi Gutmans和Zeev Suraski所开发,Zend也正是此二人名字的合称。后来两人联合创立了Zend Technologies公司
  • Zend Engine 1.0于1999年随PHP 4发布,由C语言开发且经过高度优化,并能够做为PHP的后端模块使用。Zend Engine为PHP提供了内存和资源管理的功能以及其它的一些标准服务,其高性能、可靠性和可扩展性在促进PHP成为一种流行的语言方面发挥了重要作用
  • Zend Engine的出现将PHP代码的处理过程分成了两个阶段:首先是分析PHP代码并将其转换为称作Zend opcode的二进制格式opcode(类似Java的字节码),并将其存储于内存中;第二阶段是使用Zend Engine去执行这些转换后的Opcode

3、PHP 的 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脚本的功能

总的过程就是:扫描–>分析–>编译–>执行

4、PHP 加速器

PHP 的加速器:基于PHP的特殊扩展机制如opcode缓存扩展也可以将opcode缓存于php的共享内存中,从而可以让同一段代码的后续重复执行时跳过编译阶段以提高性能这些加速器并非真正提高了opcode的运行速度,而仅是通过分析opcode后并将它们重新排列以达到快速执行的目的

常见的 PHP 加速器有:

  • 1、APC (Alternative PHP Cache)
    遵循PHP License的开源框架,PHP opcode缓存加速器,目前的版本不适用于PHP 5.4。项目地址http://pecl.php.net/package/APC
  • 2、eAccelerator
    源于Turck MMCache,早期的版本包含了一个PHP encoder和PHP loader,目前encoder已经不在支持。项目地址 http://eaccelerator.net/
  • 3、XCache
    快速而且稳定的PHP opcode缓存,经过严格测试且被大量用于生产环境。项目地址:http://xcache.lighttpd.net/,收录EPEL源
  • 4、Zend Optimizer和Zend Guard Loader
    Zend Optimizer并非一个opcode加速器,它是由Zend Technologies为PHP5.2及以前的版本提供的一个免费、闭源的PHP扩展,其能够运行由Zend Guard生成的加密的PHP代码或模糊代码。 而Zend Guard Loader则是专为PHP5.3提供的类似于Zend Optimizer功能的扩展。项目地址http://www.zend.com/en/products/guard/runtime-decoders
  • 5、NuSphere PhpExpress
    NuSphere的一款开源PHP加速器,它支持装载通过NuSphere PHP Encoder编码的PHP程序文件,并能够实现对常规PHP文件的执行加速。项目地址,http://www.nusphere.com/products/phpexpress.htm

5、PHP 源码目录结构

PHP的源码在结构上非常清晰。其代码根目录中主要包含了一些说明文件以及设计方案,并提供了如下子目录:

  • 1、build —— 顾名思义,这里主要放置一些跟源码编译相关的文件,比如开始构建之前的buildconf脚本及一些检查环境的脚本等
  • 2、ext —— 官方的扩展目录,包括了绝大多数PHP的函数的定义和实现,如array系列,pdo系列,spl系列等函数的实现。 个人开发的扩展在测试时也可以放到这个目录,以方便测试等
  • 3、main —— 这里存放的就是PHP最为核心的文件了,是实现PHP的基础设施,这里和Zend引擎不一样,Zend引擎主要实现语言最核心的语言运行环境
  • 4、Zend —— Zend引擎的实现目录,比如脚本的词法语法解析,opcode的执行以及扩展机制的实现等等
  • 5、pear —— PHP 扩展与应用仓库,包含PEAR的核心文件
  • 6、sapi —— 包含了各种服务器抽象层的代码,例如apache的mod_php,cgi,fastcgi以及fpm等等接口
  • 7、TSRM —— PHP的线程安全是构建在TSRM库之上的,PHP实现中常见的*G宏通常是对TSRM的封装,TSRM(Thread Safe Resource Manager)线程安全资源管理器
  • 8、tests —— PHP的测试脚本集合,包含PHP各项功能的测试文件
  • 9、win32 —— 这个目录主要包括Windows平台相关的一些实现,比如sokcet的实现在Windows下和*Nix平台就不太一样,同时也包括了Windows下编译PHP相关的脚本

PHP 配置

PHP 是脚本语言解释器。

  • 配置文件:/etc/php.ini , /etc/php.d/*.ini

  • 配置文件在php解释器启动时被读取,对配置文件的修改生效方法

    Modules   # 重启 httpd 服务
    FastCGI   # 重启 php-fpm 服务
    
  • /etc/php.ini配置文件格式

    [foo]:Section Header
    directive = value
    注释符:较新的版本中,已经完全使用;进行注释
    	#            # 纯粹的注释信息
    	;            # 用于注释可启用的directive
    
  • php 常用设置

    max_execution_time= 30           # 最长执行时间30s
    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     # 指定时区
    short_open_tag=on                # 开启短标签,如<? phpinfo();?>
    
  • php 其它

    php.ini的核心配置选项文档    # http://php.net/manual/zh/ini.core.php
    php.ini配置选项列表         # http://php.net/manual/zh/ini.list.php
    
    # php语言格式
    
    <?php
    ...php code...
    ?>
    

PHP 代码

1、格式一

<?php
	echo "<h1>Hello world!</h1>"
?>

2、格式二

<h1>
	<?php echo "Hello world!" ?>
</h1>

3、php测试代码

<?php
	echo date("Y/m/d H:i:s");
	phpinfo();
?>

4、使用mysql扩展连接数据库的测试代码

<?php
	$conn = mysql_connect(‘mysqlserver','username','password');
	if ($conn)
		echo "OK";
	else
		echo "Failure";
		#echo mysql_error();
	mysql_close();
?>

5、Php使用mysqli扩展连接数据库的测试代码

<?php
	$mysqli=new mysqli("mysqlserver",“username",“password");
	if(mysqli_connect_errno()){
		echo "Failure";
		$mysqli=null;
		exit;
	}
	echo “OK";
	$mysqli->close();
?>

5、使用pdo扩展连接数据库的测试代码1

<?php
	$dsn='mysql:host=mysqlhost;dbname=test';
	$username=‘root';
	$passwd=‘magedu';
	$dbh=new PDO($dsn,$username,$passwd);
	var_dump($dbh);
?> 

6、使用pdo扩展连接数据库的测试代码2

<?php
	try {
		$user=‘root';
		$pass=‘magedu';
		$dbh = new PDO('mysql:host=mysqlhost;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();
}
?>

LAMP 部署与配置

1、LAMP 主要安装部分

  • httpd:接收用户的web请求;静态资源则直接响应;动态资源为php脚本,对此类资源的请求将交由php来运行
  • php:运行php程序
  • MariaDB:数据管理系统

2、HTTP 与 PHP 结合的方式

  • CGI(现在很少用这种方式)

  • FastCGI

  • modules (将php编译成为httpd的模块,默认方式)

    MPM:
    	prefork: libphp5.so
    	event, worker: libphp5-zts.so
    

3、CentOS 6/7 所需要安装的模块(实现LAMP)

  • CentOS 7:

    Modules   # httpd, php, php-mysql, mariadb-server
    FastCGI   # httpd, php-fpm, php-mysql, mariadb-server
    
  • CentOS 6:

    Modules   # httpd, php, php-mysql, mysql-server
    FastCGI   # 默认不支持
    

4、LAMP 安装

注意:要使用 prefork 模型。

CentOS 6(Modules)

Modules:程序包 httpd, php, php-mysql, mysql-server

```
# yum install httpd, php, mysql-server, php-mysql
# service httpd start
# service mysqld start
```

CentOS 7(Modules)

Modules:程序包 httpd, php, php-mysql, mariadb-server

```
# yum install httpd, php, php-mysql, mariadb-server
# systemctl start mariadb.service httpd.service
```

CentOS 7(FastCGI)

FastCGI:程序包 httpd, php-fpm, php-mysql, mariadb-server

```
# yum install httpd, php-fpm, php-mysql, mariadb-server
# systemctl start mariadb.service  php-fpm.service  httpd.service
```
  • CentOS 7 安装后,默认生成的 php 文件

    # rpm -ql php
    /etc/httpd/conf.d/php.conf
    /etc/httpd/conf.modules.d/10-php.conf
    /usr/lib64/httpd/modules/libphp5.so
    /usr/share/httpd/icons/php.gif
    /var/lib/php/session
    

5、php 主文件说明(/etc/httpd/conf.d/php.conf

文件结尾是 .php 的文件,才会交由 php 去运行。所以以 .html 运行是不会调用的,显示页面不会和预想的一样。

php 也是高度模块化的,称作 php 扩展。(可以是官方扩展,也可以是第三方扩展。)

可结合 php 配置主文件进行理解。

# cat /etc/httpd/conf.d/php.conf
# FileMatch 后匹配正则表达式,匹配任意以 .php(\ 是转译符)结尾的文件,调用模块执行
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>
AddType text/html .php
DirectoryIndex index.php
php_value session.save_handler "files"
php_value session.save_path    "/var/lib/php/session"

PHP 示例:创建一个显示 PHP INFO 的网页

  • (1)在HTTPD 的文件根目录下创建一个 .php 结尾的文件
[root@neo html]# pwd
/var/www/html
[root@neo html]# ls
phpinfo.php
[root@neo html]# cat phpinfo.php 
<html>
	<title>PHP Test Page</title>
	<body>
		<h1>PHP Info Page<h1>
		<?php                    # 调用 php 命令(;分号用于调用命令结尾)
			phpinfo();           # phpinfo 是php的一个内部命令,用于显示php信息
		?>                       # 开头和结尾要成对出现 <? ?>
	</body>
</html>
  • (2)使用浏览器进行页面访问http://172.16.141.252/phpinfo.php,成功显示 PHP INFO

在这里插入图片描述

  • (3)在PHP INFO界面上,如果能看到 mysql 模块信息,说明 php 和 mysql 接口正常
    在这里插入图片描述

6、mysql 启动、状态及登入(说明 mysql 启动成功)

可使用systemctl start mariadb.service来启动 mysql 服务程序。第一次启动会比较慢,启动成功后,会多一个 TCP:3306 的监听端口。如下:

[root@neo ~]# ss -tnl
State      Recv-Q Send-Q                      Local Address:Port                                     Peer Address:Port              
LISTEN     0      50                                      *:3306                                                *:*                  
LISTEN     0      128                                     *:22                                                  *:*                  
LISTEN     0      100                             127.0.0.1:25                                                  *:*                  
LISTEN     0      128                                    :::80                                                 :::*                  
LISTEN     0      128                                    :::22                                                 :::*                  
LISTEN     0      100                                   ::1:25                                                 :::*                  
[root@neo ~]# mysql                 # 进入数据库
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 7
Server version: 5.5.60-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> SHOW DATABASES;    # 显示数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)
MariaDB [(none)]> quit               # 退出数据库
Bye

7、常见LAMP应用

  • PhpMyAdmin是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库
  • WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可把 WordPress当作一个内容管理系统(CMS)来使用
  • PHPWind:2003年发布了PHPWind的前身版本ofstar,并发展成为包含BBS、CMS、博客、SNS等一系列程序的通用型建站软件, 于2008年加入阿里巴巴集团
  • Crossday Discuz! Board(简称 Discuz!)是一套通用的社区论坛软件系统。自2001年6月面世以来,是全球成熟度最高、覆盖率最大的论坛软件系统之一。2010年8月23日,与腾讯达成收购协议
  • ECShop是一款B2C独立网店系统,适合企业及个人快速构建个性化网上商店。系统是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序。2006年6月,ECShop推出第一个版本1.0

PHP 使用 mysql 扩展连接数据库测试

1、语法格式:使用mysql扩展连接数据库的测试代码

<?php
	$conn = mysql_connect(‘mysqlserver','username','password');   
	if ($conn)
		echo "OK";
	else
		echo "Failure";
		#echo mysql_error();
	#mysql_close();
?>

2、在 HTTPD 的文件根目录创建 mysqltest.php

[root@neo ~]# ll /var/www/html/
total 8
-rw-r--r--. 1 root root 162 Aug  8 05:10 mysqltest.php
-rw-r--r--. 1 root root 113 Aug  8 03:41 phpinfo.php
[root@neo ~]# cat /var/www/html/mysqltest.php
<?php
	$conn = mysql_connect('127.0.0.1','root','');   # root 是登陆 mysql 的用户名
		if ($conn)
			echo "OK";
		else 
			echo "NOT OK";
?>

3、进行验证

在 mariadb 启动的情况下,显示 连接成功(OK),未启动的情况下,显示 连接不成功(NOT OK)。

[root@neo ~]# ss -tnl
State      Recv-Q Send-Q                      Local Address:Port                                     Peer Address:Port              
LISTEN     0      50                                      *:3306                                                *:*                  
LISTEN     0      128                                     *:22                                                  *:*                  
LISTEN     0      100                             127.0.0.1:25                                                  *:*                  
LISTEN     0      128                                    :::80                                                 :::*                  
LISTEN     0      128                                    :::22                                                 :::*                  
LISTEN     0      100                                   ::1:25                                                 :::*                  
[root@neo ~]# curl http://127.0.0.1/mysqltest.php
OK
[root@neo ~]# systemctl stop mariadb.service
[root@neo ~]# ss -tnl
State      Recv-Q Send-Q                      Local Address:Port                                     Peer Address:Port              
LISTEN     0      128                                     *:22                                                  *:*                  
LISTEN     0      100                             127.0.0.1:25                                                  *:*                  
LISTEN     0      128                                    :::80                                                 :::*                  
LISTEN     0      128                                    :::22                                                 :::*                  
LISTEN     0      100                                   ::1:25                                                 :::*                  
[root@neo ~]# curl http://127.0.0.1/mysqltest.php
NOT OK
[root@neo ~]# systemctl start mariadb.service
[root@neo ~]# ss -tnl
State      Recv-Q Send-Q                      Local Address:Port                                     Peer Address:Port              
LISTEN     0      50                                      *:3306                                                *:*                  
LISTEN     0      128                                     *:22                                                  *:*                  
LISTEN     0      100                             127.0.0.1:25                                                  *:*                  
LISTEN     0      128                                    :::80                                                 :::*                  
LISTEN     0      128                                    :::22                                                 :::*                  
LISTEN     0      100                                   ::1:25                                                 :::*                  
[root@neo ~]# curl http://127.0.0.1/mysqltest.php
OK

4、注意事项

  • 在登陆mysql数据库时不解析IP地址:可修改/etc/my.cnf文件,添加skip_name_resolve=ON,但是需要重启mysql才能生效
  • 创建文件后,需要 apache 用户能访问,要确保 other 用户有读权限(这样的话,才能使用 HTTPD 进行访问)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值