共计 4490 个字符,预计需要花费 12 分钟才能阅读完成。
lamp
php
- php: 脚本编程语言、嵌入到 html 中的嵌入式 web 程序开发语言;基于 zend 编译成 opcode(二进制格式的字节码,重复运行,可省略编译环境)
-
一、PHP 简介 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 程序了,这即是 PHP 1.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 性能的改进。二、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 的二进制格式(类似 Java 的字节码),并将其存储于内存中;第二阶段是使用 Zend Engine 去执行这些转换后的 Opcode。三、PHP 的 Opcode Opcode 是一种 PHP 脚本编译后的中间语言,就像 Java 的 ByteCode, 或者.NET 的 MSL。PHP 执行 PHP 脚本代码一般会经过如下 4 个步骤(确切的来说,应该是 PHP 的语言引擎 Zend):1、Scanning(Lexing) —— 将 PHP 代码转换为语言片段(Tokens) 2、Parsing —— 将 Tokens 转换成简单而有意义的表达式 3、Compilation —— 将表达式编译成 Opocdes 4、Execution —— 顺次执行 Opcodes,每次一条,从而实现 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/ 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 五、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 相关的脚本。
- 配置文件:/etc/php.ini, /etc/php.d/*.ini
- 配置文件在 php 解释器启动时被读取,因此,对配置文件的修改如何生效?
Modules:重启 httpd 服务;
FastCGI:重启 php-fpm 服务;
- 配置文件在 php 解释器启动时被读取,因此,对配置文件的修改如何生效?
- ini
vi /etc/php.ini [foo]:Section Header directive = value 注释符:较新的版本中,已经完全使用; 进行注释;#:纯粹的注释信息 ;:用于注释可启用的 directive
php.ini 的核心配置选项文档:http://php.net/manual/zh/ini.core.php
php.ini 配置选项列表:http://php.net/manual/zh/ini.list.php<?php ...php code... ?>
-
lamp
- WEB 资源类型:
- 静态资源:原始形式与响应内容一致;
动态资源:原始形式通常为程序文件,需要在服务器端执行之后,将执行结果返回给客户端;- 客户端技术:javascript
服务器端技术:php, jsp
- 客户端技术:javascript
- 静态资源:原始形式与响应内容一致;
- CGI:Common Gateway Interface
可以让一个客户端,从网页浏览器向执行在网络服务器上的程序传输数据;CGI 描述了客户端和服务器程序之间传输的一种标准; - amp
- a: apache (httpd)
m: mysql, mariadb
p: php, perl, Python - httpd:接收用户的 web 请求;静态资源则直接响应;动态资源为 php 脚本,对此类资源的请求将交由 php 来运行;
php:运行 php 程序;
MariaDB:数据管理系统;- httpd 与 php 结合的方式:
modules (把 php 编译成为 httpd 的模块)
FastCGI:php-fpm
- httpd 与 php 结合的方式:
- 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
- a: apache (httpd)
- 快速部署 amp:
- CentOS 7:
- Modules:程序包,httpd, php, php-mysql, mariadb-server
启动的服务:systemctl start mariadb.service httpd.service - FastCGI:程序包,httpd, php-fpm, php-mysql, mariadb-server
启动的服务:systemctl start mariadb.service php-fpm.service httpd.service
- Modules:程序包,httpd, php, php-mysql, mariadb-server
- CentOS 6:
- Modules:程序包,httpd, php, php-mysql, mysql-server
启动的服务:service mysqld start, service httpd start
- Modules:程序包,httpd, php, php-mysql, mysql-server
- CentOS 7:
- php 测试代码
<php? phpinfo(); ?>
示例:
<html> <title>PHP Page</title> <body> <h1>PHP Info Page</h1> <?php phpinfo(); ?> </body> </html>
- php 连接 mysql 的测试代码:
<?php $conn = mysql_connect('172.16.100.67','testuser','testpass'); if ($conn) echo "OK"; else echo "Failure"; ?>
正文完
星哥玩云-微信公众号