初学者入门:细述PHP4的核心Zend

 更新时间:2016年11月25日 16:15  点击:2276
一.概述:
Zend引擎的名称由Zeev Suraski和Andi Gutmans二位在PHP担任核心开发工作的资深设计师的名字合体.开发的目的师为了研发新的脚本执行机制,而PHP4就是这套崭新的Zend引擎的第一个实作产品。在一些特殊测试环境下,Zend(PHP$)的执行速度比PHP3及ASP快了几倍到几百倍之多,这也意味着网站的后端CGI界面的统一者非PHP4 Zend莫属了。(当然,技术是不断进步的,说不定哪一天又出现了新的引擎。)
Zend引擎在研发二年多之后,已经变成类似VBA功能的广义程式环境,它不但有传统的PHP函数功能,更增加了分散式物件(COM)的功能,并且能够在不同的操作平台上执行。以这种潜力发展下去,VBA的终结者非Zend莫属。
 
Zend在PHP4上实作时更针对了PHP3之前最大缺憾的session做了最完整的承诺,同时加入了一些未来的功能,如CyberCash...等等。
 
在opensource社群中,唯一能保持声势,却又尚未被微软公司视为竞争对手的,PHP/Zend是最好的例子。它已经完全地将ASP丢到了身后,正往VBA的环境发展。而微软只全力对付Linux,没有注意到来自PHP/Zend的威胁。
 
Web服务器发觉是PHP的要求,需要PHP引擎解析(根据文件的扩展名),于是将它送到PHP4的Zend引擎上。
 
Zend引擎将文件从硬盘上读取,送到Zend线上编译器(Run-time Compiler),进行程序直译工作。(或许日后的Zend Compiler出来以后可以省略线上编译工作。)
Zend引擎的线上执行单元(Excutor)执行编译过的PHP程序。并在需要时找相关的模组执行协力动作(如XML,IMAP,ODBC...等等)。
 
Zend将执行后的结果整理成HTML文件,送给Web服务器。
 
Web服务器将结果通过网络,传回使用者的浏览器。
 
目前的Zend产品有下列四种:
Zend Engine:Zend引擎 Zend引擎目前只做出PHP4一种产品,提供类似微软的VBA及跨平台的功能。而目前在网络上的流行,也为Zend引擎作了最佳的见证。在Zend的四大产品中,这是目前唯一成熟的产品。
 
Zend Optimizer:Zend极限器 将PHP的核心重新调整,让PHP程序执行的效率更高。主要能加快PHP代码的执行速度及降低CPU的负担,将潜伏时间减少。
 
Zend Cache:Zend快取 将PHP程序快取到Web服务器的记忆体中,让系统不用再一直从硬盘读取PHP程序,可大幅度缩短系统的反应时间,降低网络的负荷。存在Cache的资料甚至可以不用再直译过,减少处理的资源。
 
Zend Compiler:Zend编译器 这恐怕是Zend的最终极武器,它可让PHP的程序代码经过编译后,以Zend中间码(ZIC,Zend Intermediate Code)的形式存在。
 
可以保护PHP的源代码,不让使用者看到,让PHP的源代码有安全保障。预料本产品出现之后,将对整个网络产生不小的影响,PHP码的物件库,将会到处可见,软件业也会提供相关的函数库或物件库给PHP编程者。届时,可能会有PHP大战Java的情形。
  现在有越来越多的个人主页站长需要了解如何如何在windows系统下配置自己的php,cgi服务器,以方便本地调试cgi和php的程序。
  我们可以用Apache(windows版)来一次搞定:以下由我自己整理的关于在单机Windows环境下的安装和配置 Apache Server 的文章。如果您正在 Windows 单机环境下测试自己的网站,建议您参考一下。
  主要包括:安装和配置 Apache Server;使用 Perl CGI 脚本;使用 PHP 脚本。
 
--部分内容参考《Apache Server 系统管理员手册》。
 
  一、Windows 下的安装
  当然,你首先得要有Apache的安装程序。不妨先到http://www.apache.org/dist看看。在这里有世界范围的Apache镜像站点列表,找到离你最近的那个。如果在国内,这里建议你到软件屋去看看。A pache的安装程序一般的文件名是apache_1_3_x.win32.exe。把它当到你机器里,运行它。
  安装程序会提示你修改Apache安装的缺省目录位置C:Program FilesApache GroupApache。为了方便以后的配置和维护,建议你安装在根目录下,比方C:Apache。之后,你会被提示选择安装类型,建议你选择Cus tom(定制),这样,你将知道安装了些什么。具体项目有Application File(应用程序文件)、Source Code(源代码)、Apache Manual(Apache 手册)、Additional Modules(附加模块)、Icons(图标)、Repuired Directories(必须目录)。你可以根据你的情况来决定如何安装。
  一切顺利的话(此时不应该有什么问题了),安装很快就会完成。Apache会自动的完成一些基本配置,你可以用UltraEdit-32(或者是其他的文本编辑软件)打开c onfhttpd.conf文件大致了解一下。
  二、配置 Apache Server
  这里首先进行的是基本的配置,以便你的Apache Server以你的意愿运行起来。
  用UltraEdit-32(或者是其他的文本编辑软件)打开confhttpd.conf文件。
  1、寻找到ServerName。这里定义你的域名。这样,当Apache Server运行时,你可以在浏览器中访问自己的站点。如果前面有#,记得删除它,这是conf的注释标记。
  2、寻找到ServerAdmin。这里输入你的E-Mail地址。如果你仅仅是单机使用,改不改没什么关系。
  3、寻找到。向下有一句Options,去掉后面所有的参数,加一个All(注意区分大小写!下同。);接着还有一句Allow Override,也同样去掉后面所有的参数,加一个All。
在学习PHP过程中可能要同时用到PHP4和PHP5,网上也有不少关于二者共存的安装方法,大多是一个安装在IIS下,一个安装在Apache下。下面介绍一下本人的安装方法,自认为比较优化,而且非常方便升级。
  
为了方便介绍,先介绍一下本人的安装环境:Windows XP Pro SP2,Apache 2.0.55和PHP4.4.1、PHP5.1.1,都安装在D:(即D区上有以下文件夹d:apache2、d:php4、d:php5),网卡配置两个IP地址192.168.0.2和192.168.0.3(至于如何配置多个IP地址,不是本文介绍重点)。下面以Apache的模块式安装方法为例进行介绍:
1、安装配置Apache 2.0.55服务器。在同意许可协议后会有填写服务器信息的页面,本地调试,前面两个输入 localhost 。编辑httpd.conf 文件,分别定位到ServerName localhost:80和Listen 80,都在前面加#关闭其设置。
2、准备PHP。分别解压下载的PHP压缩包(例如php-5.1.1-Win32.zip),放置到d:php4和d:php5。
3、分别配置php.ini。因为有两个版本的PHP,所以要分别配置。分别复制一份php.ini-recommended后重命名为php.in,就放在原路径。
题外话:过时方法要这样处理,复制php.ini文件至x:winnt(x:windows)或apache的安装文件夹,并且copy x: phpphp5ts.dll、php4ts.dll等dll文件到winnt(windows)、或winntsystem32或apache的安装文件夹下。本人强烈推荐你不要这么做,以后升级比较麻烦,下面将给出理由。
4、修改windows path变量。加入
d:php4;d:php5
到path环境变量中,即告诉系统到哪里去查找php5ts.dll等动态链接库文件,所以我们也没有必要将这些dll文件复制到%windir%,所以升级PHP也方便很多,不用去一一删除原来那些文件。至于怎样修改path路径,你可以查看这里。
5、分别修改php.ini。主要修改一下extension_dir和extension_dir。分别在php.ini中找到上面的变量,加入适当的路径。我是这样修改的,PHP4的php.ini中
extension_dir = "D:php4extensions"

include_path = "d:php4pear;d:php4includes"
PHP5的php.ini中
extension_dir = D:php5ext

include_path = "D:php5PEAR;D:php5"
其实一般来说还需要修改php.ini中的其他不少参数值,例如文件上传临时路径、Session临时路径、邮件设置、扩展模块配置(PHP5中为了支持mysql要去掉以下代码中的;号)
;extension=php_mysql.dll
但由于不是本文的重点,所以不详细介绍。
(1)echo,print,printf,sprintf
前两个函数是输出字符串.字符串中如果有变量名则被替换成其值.
后两个函数类似于C的同名函数.
(2)strchr,strlen,strtok,strrchr,strrev,strstr,strtolower,
strtoupper,substr,ucfirst
这些是常用的字符串操作函数,有些和C中的同名函数意义完全一致.
strrev是把一个字符串翻转.
strtolower和strtoupper的意思应该不用解释了.
ucfirst是把字符串的第一个字符变成大写.
substr是返回字符串的一个子串,用法是:substr(字符串,头,长度).
头位置是 从0算起的.如果是负数,则是从尾部向前数的意思.
(3)Chr,Ord
类似于C的同名函数.
(4)explode,implode,join
这些是和数组有关的函数.
explode(字符串,分割符)返回一个将字符串在分割符处分开所产生的数组.
implode(数组,分割符)返回一个将数组各元素之间插上分割符而成的字符串.
join与implode意义相同.
(5)Chop
去掉字符串尾部的空白.
(6)htmlspecialchars
将字符串中的HTML特殊字符换成它们的名字,例如"<"变成"<".
(7)nl2br
在字符串中的每一个回车前面加上"<BR>".
(8)AddSlashes,StripSlashes
分别给字符串中需要加上""才能用于数据库查询的字符加上和去掉"".
(9)parse_str
将"name1=value1&name2=value2&..."类型的字符串分析成一些变量.
例如:
parse_str("a=1&b=2");
生成$a与$b两个变量,值分别为1,2.
如果有两对名字/值的名字部分相同,则后一个的值覆盖前一个的.
如果这两对的名字尾部都有"[]",例如"a[]=1&a[]=2",则生成数组$a,两个元素分别为1,2
  服务器负载太大而影响程序效率也是很常见的,我们需要对此进行测试。这里我以目前最常用的Apache服务器为例。
  Apache服务器自带有一个叫AB(ApacheBench)的工具,在bin目录下。使用这个轻巧的工具我们可以对服务器进行负载测试,看看在重负荷之下服务器的表现如何。ApacheBench 可以针对某个特定的 URL 仿真出连续的联机请求,同时还可以仿真出同时间点数个相同的联机请求,因此利用 ApacheBench 可帮助我们在网站开发期间仿真实际上线可能的情况,利用仿真出来的数据作为调整服务器设定或程序的依据。
  在命令行下输出:

./ab -n number_of_total_requests
-c number_of_simultaneous_requests
http://your_web_server/your_php_app.php
  例如:

./ab -n 1000 -c 50 http://www.domain.com/myapp.php
  AB将同时向http://www.domain.com/myapp.php发出50个并发请求,共发出1000次。
  测试结果将可能是这样的:

Server Software: Apache/2.0.16
Server Hostname: localhost
Server Port: 80
Document Path: /myapp.php
Document Length: 1311 bytes
Concurrency Level: 50
Time taken for tests: 8.794 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 1754000 bytes
HTML transferred: 1311000 bytes
Requests per second: 113.71
Transfer rate: 199.45 kb/s received
Connection Times (ms)
min avg max
Connect: 0 0 5
Processing: 111 427 550
Total: 111 427 555
  myapp.php每秒钟可以处理的请求数为113.71个。将请求数增加,看看服务器能否处理更大的压力。你也需要调节Apache的MaxClients,ThreadsPerChild,MaxThreadsPerChild等参数,基于你的httpd.conf中的MPM模块选择。
  如果你想得到更详细的信息,请到www.apache.org上查阅一些更深入的文档,包括模块和第三方的提高效率的工具。修改httpd.conf后,要重启Apache服务器,然后再用AB测试。你会看到每秒请求数增加或减少。
  记下每次的参数,最后选择最佳效率的那种配置。
  要指出的是,除了AB,还有许多优秀的服务器性能测试软件。另外,如果你的服务器不是Apache,请自行寻找测试方法。

[!--infotagslink--]

相关文章

  • 轻松学习C#的基础入门

    轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
  • photoshop画斜线/直线/虚线的入门级教程

    这篇文章算是超级入门级别的了,我们下面来给各位介绍在photoshop画斜线/直线/虚线的教程了,希望下面这篇文章给你入门来帮助。 PS怎么画斜线 选择铅笔工具,或者画笔...2016-09-14
  • 源码分析系列之json_encode()如何转化一个对象

    这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
  • php中去除文字内容中所有html代码

    PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
  • index.php怎么打开?如何打开index.php?

    index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06
  • PHP中func_get_args(),func_get_arg(),func_num_args()的区别

    复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04
  • PHP编程 SSO详细介绍及简单实例

    这篇文章主要介绍了PHP编程 SSO详细介绍及简单实例的相关资料,这里介绍了三种模式跨子域单点登陆、完全跨单点域登陆、站群共享身份认证,需要的朋友可以参考下...2017-01-25
  • PHP实现创建以太坊钱包转账等功能

    这篇文章主要介绍了PHP实现创建以太坊钱包转账等功能,对以太坊感兴趣的同学,可以参考下...2021-04-20
  • php微信公众账号开发之五个坑(二)

    这篇文章主要为大家详细介绍了php微信公众账号开发之五个坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-02
  • 20分钟MySQL基础入门

    这篇文章主要为大家分享了20分钟MySQL基础入门教程,快速掌握MySQL基础知识,真正了解MySQL,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-12-02
  • PHP如何通过date() 函数格式化显示时间

    这篇文章主要介绍了PHP如何通过date() 函数格式化显示时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-13
  • ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单

    首先是数据库的设计。分类表叫cate.我做的是分类数据的二级联动,数据需要的字段有:id,name(中文名),pid(父id). 父id的设置: 若数据没有上一级,则父id为0,若有上级,则父id为上一级的id。数据库有内容后,就可以开始写代码,进...2014-05-31
  • golang与php实现计算两个经纬度之间距离的方法

    这篇文章主要介绍了golang与php实现计算两个经纬度之间距离的方法,结合实例形式对比分析了Go语言与php进行经纬度计算的相关数学运算技巧,需要的朋友可以参考下...2016-07-29
  • PHP+jQuery+Ajax实现多图片上传效果

    今天我给大家分享的是在不刷新页面的前提下,使用PHP+jQuery+Ajax实现多图片上传的效果。用户只需要点击选择要上传的图片,然后图片自动上传到服务器上并展示在页面上。...2015-03-15
  • PHP正则表达式过滤html标签属性(DEMO)

    这篇文章主要介绍了PHP正则表达式过滤html标签属性的相关内容,实用性非常,感兴趣的朋友参考下吧...2016-05-06
  • php构造方法中析构方法在继承中的表现

    这篇文章主要为大家详细介绍了php构造方法中析构方法在继承中的表现,感兴趣的小伙伴们可以参考一下...2016-04-15
  • PHP如何使用cURL实现Get和Post请求

    这篇文章主要介绍了PHP如何使用cURL实现Get和Post请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-11
  • thinkPHP中多维数组的遍历方法

    这篇文章主要介绍了thinkPHP中多维数组的遍历方法,以简单实例形式分析了thinkPHP中foreach语句的使用技巧,需要的朋友可以参考下...2016-01-12
  • Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解

    这篇文章主要介绍了Zend Framework动作助手(Zend_Controller_Action_Helper)用法,详细分析了动作助手Zend_Controller_Action_Helper功能,定义,使用方法与相关实现代码,需要的朋友可以参考下...2016-03-10
  • PHP简单实现生成txt文件到指定目录的方法

    这篇文章主要介绍了PHP简单实现生成txt文件到指定目录的方法,简单对比分析了PHP中fwrite及file_put_contents等函数的使用方法,需要的朋友可以参考下...2016-04-28