Powered by Typecho)))
Optimized by EAimTY
拖了两天,今晚终于有点时间来写下篇了。可是,对着电脑,却有点不知道从何说起。或许,就照着ZEND FRAMEWORK来说吧。当然,我会把握要点,记得这篇文章是以zend framework为例来阐述我对面向对象方式编程的认识,而不是一篇zend framework的入门手册,并且,这也不会是一个面向对象的入门教程,而是我对面向对象的理解。
一、统一入口文件
在很多人眼里,php仍然不能算是“完全”面向对象的,理由就是面向对象应该是所有程序要全部对象化,而PHP还留有一个入口文件。但这种学术上的争论,和我们其实是没什么关系的。我们只需要知道,作为一个完全面向对象的应用,除了index.php之外,所有程序都应该是以类的方式编写的。
在zend framework中,用到了rewrite技术,rewrite不仅利用伪静态功能吸引搜索引擎收录,还可以禁止index以为的PHP文件直接运行从而避免安全隐患。在joomla中,rewrite是可以在后台中选择的,即使是面向过程的项目,discuz 和phpwind也都提供了rewrite的选项,而在zend framework中,说起来可能会让很多zf的初学者呕血,其实用或者不用rewrite,是根本不需要配置的,只不过是链接的URL地址不同罢了。很奇怪的,似乎所有资料上都没有提及这一点,其实,我们完全可以在IIS下和绝大多数支持PHP的虚拟主机上使用zend framework而不必担心rewrite的问题。
当然了,我个人对rewrite技术还是非常拥护的,对我而言,这项技术至少有三个好处:1、用伪静态方式增加搜索引擎搜录;2、保护重要文件及危险文件不被运行和下载;3、用PHP生成图片文件时,其URL地址和真实的图片地址格式完全相同。
所以,一个好的面向对象程序,应该要统一入口文件,并用rewrite功能限制不合规范的其它php文件的使用。
二、MVC模式
MVC模式是一种非常经典的编程方式。我在本文的上篇就已经提过,如果纯粹追求执行效率,每个程序页面一个文件,才是最为高效的。但是人力有其极限,所以终究需要把文件切割开来,并按一定规律对文件进行归类。如果你做PHP足够久,应该见过各种五花八门的切割和文件归类方式,而其中,升华为模式并为主流所接受的,只有MVC。
如果说程序和页面分开,也就是view视图独立,已经为大家所公认,那么控制器和模型是不是要分开,很多人还是有不同意见的。一开始我也觉得,小项目里不需要这么讲究,但是不久之后就发现模型的好处了。模型在功能上很大程度与面向过程项目中的函数库相似,函数库的好处,我在本文上篇一开始久已经说过,这些理由同样适合与模型,功能总是应该被细分为函数的,MODEL只不过是对这些函数进行统一归类而已。模型与函数库的最主要区别,在于我们通常为每个数据表建立一个模型,这样,每个模型中的方法不至于过多,方法的命名也可以得到统一。比如函数库中,删除文章命名为delArticle(),删除图片命名为 delPicture(),删除用户命名为delUser(),而用模型一分开,统一都叫del()是不是整洁多了?
所以,无论项目大小,只要用到数据库,那么使用MODEL总是值得的。
用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。
1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。
2、$row[’id’] 的速度是$row[id]的7倍。
3、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。
4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。
5、注销那些不用的变量尤其是大数组,以便释放内存。
6、尽量避免使用__get,__set,__autoload。
7、require_once()代价昂贵。
8、include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。
9、如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。
10、函数代替正则表达式完成相同功能。
1.
条件: magic_quotes_gpc=off
写入数据库的字符串未经过任何过滤处理。从数据库读出的字符串也未作任何处理。
数据: $data=”snow''''sun” ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:”snow''''sun” 写入数据库,
结果: 出现sql语句错误,mysql不能顺利完成sql语句,写入数据库失败。
数据库保存格式:无数据。
输出数据格式:无数据。
2.
条件: magic_quotes_gpc=off
写入数据库的字符串经过函数addslashes()处理。从数据库读出的字符串未作任何处理。
数据: $data=”snow''''sun” ; (snow和sun之间是四个连续的单引号).
操作: 将字符串:”snow''''sun” 写入数据库,
结果: sql语句顺利执行,数据成功写入数据库
数据库保存格式:snow''''sun (和输入一样)
输出数据格式:snow''''sun (和输入一样)
说明: addslashes()函数将单引号转换为\'的转义字符使sql语句成功执行,
但\'并未作为数据存入数据库,数据库保存的是snow''''sun 而并不是我们想象的snow\'\'\'\'sun
说明: 对于未经处理的单引号在写入数据库时会使sql语句发生错误。
使用EA或者类似的OP CODE加速器已经是搭建PHP环境的默认选项了
但是在使用nginx的环境内
会需要使用fastcgi方式来运行php
这种情况下.EA的内存占用可能会和你在APACHE下使用EA不同
由于APACHE调用PHP的方式是模块方式的
所有PHP是位于同一个进程下面的
所以所有PHP模块调用的EA是同一个的.
内存只会占用shm_size大小.
APACHE进程间共享这同一个EA
也就是如果你在ea的配置下面写了64M.则只会占用整个系统的64M
而如果用fastcgi模式
特别是php-fpm
每个php都是独立进程
导致每个PHP进程下面都会独立分配EA的内存
则总的内存占用量 = shm_size * php进程数
如果你还用64M的话.开启20个PHP进程就意味着你用掉了1280M内存.
虽然目前只是分配到虚拟内存
但是对于大型网站的话,
不久之后就会占用到了这么大量的内存.
目前具体如何解决还没有找到
但是大家需要注意这个情况.
不同进程间ea缓冲相同文件是否会导致两份数据目前还没有测试.
转自:
http://www.hiadmin.com/php-fpm%e4%b8%8b%e4%bd%bf%e7%94%a8eaccelerator%e4%ba%a7%e7%94%9f%e7%9a%84%e5%86%85%e5%ad%98%e9%97%ae%e9%a2%98/
http://www.xpb.cn/blog/665.html
类似于apache 的mod_php模式时可以在VirtualHost中那个php_admin_value参数,可以限制php的读写区域.
仅用nginx+php就可以了
/usr/sbin/spawn-fcgi -a 127.0.0.1 -p 10080 -C 20 -u www -f "/usr/sbin/php-cgi -d open_basedir=/var/www/wwwroot/:/tmp/"
三处路径如果不一样请更改一下
每个虚拟主机用一个端口吧
运行spawn-fcgi 的时候带上参数 -d open_basedir