当前位置:  编程技术>php
本页文章导读:
    ▪提升PHP速度全攻略       PHP的优点之一是速度很快,对于一般的网站应用,可以说是已经足够了。不过如果站点的访问量很高、带宽窄或者其它的因素令服务器产生性能瓶颈的时候,你可能得想想其它的办法来进一.........
    ▪php4的彩蛋       今天看了一些代码,看到了一个小彩蛋。 <? /* env.php */ phpinfo(); ?> 用浏览器访问 http://ipaddress/dirname/env.php?=PHPE9568F36-D428-11d2-A769-00AA001ACF42 你将看到!    一个胖子嘴中刁着两支烟!:-) 秘.........
    ▪在PHP中使用灵巧的体系结构       很久以前我就想写这篇文章了,但是一直都没有时间。这里并不是想要告诉你怎样做,我希望它可以投石问路,和大家讨论一下如何开发一个好的、扩展性佳的web应用。   我从事开发已.........

[1]提升PHP速度全攻略
    来源: 互联网  发布时间: 2013-11-30
PHP的优点之一是速度很快,对于一般的网站应用,可以说是已经足够了。不过如果站点的访问量很高、带宽窄或者其它的因素令服务器产生性能瓶颈的时候,你可能得想想其它的办法来进一步提高PHP的速度了。这篇文章将从几个方面介绍如何做到这一点,从而令用户浏览的时候更加“爽”。

代码优化

  在这里并不想再次告诉你如何写更干净的代码,这一点我想每个人都清楚,在需要速度的时候,你可能已经在PHP源代码的优化上面做了不少的工作,这里所提出的是,这个烦琐的工作可以交由其它工具来完成。这就是Zend Optimizer,此程序可以从Zend Technologies的网站(http://www.zend.com/)免费得到。它的原理很简单,通过检测Zend引擎产生的中间代码,并且优化它来得到更高的执行速度。我认为优化代码是一项颇烦琐的工作,而且优化后的代码可能变得难以理解,尤其是当你放下该PHP程序一段时间后,突然间客户要求你做一些修改时,可能你自己也不懂了;-)。因此我建议你在PHP的源代码较为复杂的时候,用Zend Optimizer来做这个优化的工作,好处是它不会令你的代码变得复杂难懂。

  安装Zend Optimizer是非常简单的。只要根据你使用的平台,下载相关的预编译库,并且在你的php.ini中加入两行,重新启动你的web服务器就行了!

zend_optimizer.optimization_level=15
zend_extension="/path/to/ZendOptimizer.so"
zend_loader.enable=Off

  你可能有点奇怪,不是说两行吗,怎么变成三行了。不过第三行是可选的,看来禁止这个zend_loader将会令优化的速度更快,因此不妨在你的php.ini文件中多加这一行。要注意的是:只有在你不使用Zend Encoder Runtime的时候,才可以禁止zend_loader,关于Zend Encoder Runtime,还会在下文提到。

要更快吗?使用cache(缓冲)吧

  如果你的PHP应用还需要更快的速度,下一个办法是缓冲。要实现这一点,有几种不同的方式。我自己就试用过Zend Cache(评测版本),APC和Afterburner Cache。

  以上提到的都是“缓冲模块”。它们的原理都差不多,在php文件被首次请求的时候,通过将你的PHP源代码的中间代码存储在web服务器的内存中,对于以后同样的请求,都直接提供内存中的“编译”版本。由于它可以令磁盘的访问达到最小化,因此这个方法确实可以极大地提高PHP的性能。更为方便的是,当你的PHP源代码修改时,缓冲的模块可以察觉到这些变化,并且重新载入一样,因此你不必担心客户得到的是旧版本的程序。这些缓冲的模块确实不错,但是我应该选用哪一种呢?下面分别介绍一下:

  Zend Cache是Zend Technologies的一个商业化的产品(它也是免费为我们提供PHP引擎和Zend Optimizer的公司)。它确实不错。在首次运行后,你可以明显察觉到PHP的速度得到了很大的提高,服务器的空闲资源也更多了。缺点是你要付费购买它,但就性价比来说,还是非常值得的。

  Afterburner Cache是Bware Technologies(http://bwcache.bware.it/)提供的免费缓冲模块。当前还只是beta版,它所做的工作看来与Zend Cache差不多,不过性能的提高就比不上Zend Cache,而且现有的版本不能和Zend Optimizer一起工作,不过它是免费的。

  APC(Alternative PHP Cache)是由Community Connect(http://apc.communityconnect.com/)提供的另一个免费模块。它的工作很稳定,速度也有不少的提高,要注意的是,我还没有找到一个官方的测试数据,这些只是在我的应用上作测试,因此不能下一个结论。
Web内容的压缩(令你客户用起来更“爽”)

  经过以上两个的方法,相信你的PHP应用的性能已经得到了很大的提高,现在该从另一个方面来考虑了:下载速度。如果你的应用只是在公司内跑,所有的客户都使用100Mb/s的以太网连接到服务器,这可能不是一个问题,但是如果你的客户中有使用慢速的modem连接的,你就要考虑使用内容压缩这个方法了。根据IETF的规范,大多数的浏览器都支持gzip的内容压缩。这意味着你在将web的内容发给客户的浏览器前,可以先使用gzip进行压缩,浏览器在接收的时候就会自动解压数据,并且令用户看到原来的页面。同样,压缩web页面的内容也有几个不同的方法。

  mod_gzip是Remote Communications(http://www.phpbuilder.com/columns/www.remotecommunications.com)免费提供的一个Apache模块,它可以压缩静态的web页面。它工作得很好,你只需要将它和apache一起编译就行了(或者将它作为一个DSO使用)。Remotecommunications的人说它还可以压缩动态的内容,包括mod_php, mod_perl等。不过我尝试了一下,看来并不行。我在mod_gzip的邮件列表中了解到,这个bug将在下一个版本中修正(我想应该是1.3.14.6f版本)。不过你仍然可以用它作静态内容的压缩。

  不过我们还想压缩动态的内容,因此我们必须找另外的办法。一个办法是使用class.gzip encode.php(http://leknor.com/code/),只要在你的PHP脚本中的开头和结尾调用这个PHP类,就可以压缩你的页面内容。如果整个站点都需要这样的压缩,你可以在你的php.ini文件中的auto_prepend和auto_append中调用这些函数。它工作得很好,不过在负载很重的站点上,它明显会带来一点的系统开销。要详细了解它是如何工作的,可以看一下它的类代码(你至少需要在编译PHP时加入zlib支持)。作者在里面的说明也非常详细,你可以得到任何需要了解的东西。

  在最近,我也看到了一篇关于PHP输出缓冲的文章。它说的是PHP4.0.4推出了一种新的输出缓冲的处理手段--ob_gzhandler,它的作用和上面介绍的类相同,但区别是你只要在你的php.ini中使用以下的句法就行了:

output_handler = ob_gzhandler ;

  这样将激活PHP的输出缓冲功能,并且压缩所有它发送的东西。出于某些特别的原因,如果你不想在这里设置的话,只在需要的地方才改变这个默认设置的话(不压缩),只要在需要压缩的PHP源码目录中,修改一下.htaccess文件就行了,使用的句法如下:

php_value output_handler ob_gzhandler

... 或者直接在你的PHP代码中调用它,以下面的方式:

ob_start("ob_gzhandler");

  这个输出缓冲处理的方法很好,并且不会为服务器带来额外的系统开销。我十分建议你使用这种方法。它的改变可以用以下的例子说明,如果客户使用的是28.8K的modem的话,经过这个处理,他将会认为突然间换成了一个ISDN接入一样。要注意的一点是:Netscape Communicator并不支持图象的压缩,所以将显示不出来。因此除非你的客户全部使用Internet Explorer,否则你必须禁止压缩jpeg和gif图象。其它文件的压缩应该没有问题,但是我建议你最好测试一下,特别是浏览器使用了不常见的插件或者是少人用的浏览器。

其它有用的东西...

  Zend Technologies的在线商店在今年1月24开通了,并且售卖一些与PHP相关的有趣产品。包括前面提到的Zend Cache,Zend Encoder(简单说来,是PHP代码的编译器,可以产生编译的类,这样你就可以售卖给顾客而不用担心泄露源代码。在需要运行这些类的web服务器上,将要使用Zend Encoder Runtime来解码),Zend Ide(一个为PHP而设的集成化开发环境,带有很多强大的性能),还有为PHP开发者提供的支持服务。

结论

  使用这篇文章提到的技术,你将可以极大地提高站点的性能,不过请注意以下几点:

1.瓶颈或许不在PHP,你需要考察应用中的每个对象(例如数据库)
2.一个web服务器的性能都是有限制的,因此,不要认为性能不好就是PHP的原因,也可能是访问量很大,你的服务器需要升级了,或者考虑使用负载均衡的系统(将会花很多钱)
3.不要认为内容压缩不重要,在100Mb/s的局域网中,你的PHP应用或许性能很好,但要考虑到使用慢速modem的用户。

    
[2]php4的彩蛋
    来源: 互联网  发布时间: 2013-11-30
今天看了一些代码,看到了一个小彩蛋。
<?
/* env.php */
phpinfo();
?>

用浏览器访问
http://ipaddress/dirname/env.php?=PHPE9568F36-D428-11d2-A769-00AA001ACF42
你将看到!
   一个胖子嘴中刁着两支烟!:-)
秘密在logos.h中用数组定义的图像数据。
unsigned char php_egg_logo[] = {
     71, 73, 70, 56, 57, 97, 130,  0, 67,  0,
    213, 255,  0,  0,  0,  0, 152, 138, 142, 104,
     95, 105, 89, 86, 93, 160, 151, 174, 102, 101,
    136, 164, 163, 205, 174, 173, 213, 102, 102, 153,
     99, 99, 149, 102, 102, 152, 96, 96, 143, 90,
     90, 134, 82, 82, 115, 87, 87, 121, 80, 80,
    108, 74, 74, 100, 110, 110, 147, 95, 95, 127,
    149, 149, 198, 118, 118, 157, 67, 67, 89, 144,
    144, 191, 128, 128, 169, 137, 137, 180, 155, 155,
    197, 186, 186, 227, 209, 209, 247, 242, 242, 254,
     64, 67, 65, 192, 192, 192, 32, 45, 25, 50,
     54, 36, 65, 63, 42, 75, 71, 53, 87, 79,
     61, 93, 85, 69, 231, 180, 110, 106, 92, 74,
    207, 155, 100, 121, 101, 80, 181, 131, 89, 141,
    110, 88, 158, 125, 103, 148, 118, 97, 169, 135,
    112, 131, 112, 99, 180, 141, 117, 135, 101, 81,
    191, 148, 124, 168, 126, 107, 201, 153, 130, 164,
    116, 97, 191, 139, 119, 213, 155, 135, 220, 164,
    146, 203, 142, 124, 180, 127, 112, 175, 118, 103,
    191, 127, 114, 162, 102, 91, 255, 255, 255,  0,
     0,  0,  0,  0,  0, 33, 249,  4,  1,  0,
     0, 30,  0, 44,  0,  0,  0,  0, 130,  0,
     67,  0, 64,  6, 255, 64, 143, 112, 72, 44,
     26, 143, 72, 226, 100, 105, 105, 98, 158, 151,
     40, 133, 18, 137, 20, 36, 18, 135, 118, 203,
    213, 74, 10, 133, 200, 52, 122, 121, 98, 154,
    150, 229, 50, 201, 110, 187, 223, 202, 137,  5,
    115, 137, 72, 30, 16, 72, 101, 15, 105, 48,
     24, 11,  9, 130, 10, 132, 10,  8, 135, 136,
    137, 137, 11,  3, 34, 31, 31, 32, 32, 33,
    147, 34, 149, 34, 35, 152, 153, 34, 33, 32,
    143, 143, 29,  2, 133, 130,  9, 11, 127, 14,
     13, 13, 91, 88, 18, 17, 101, 105, 19, 112,
    112, 114, 24, 17, 120, 123, 21, 14, 129, 132,
    138, 188, 189, 190, 137, 21, 31, 33, 38, 48,
     44, 52, 58, 57, 59, 53, 56, 203, 56, 206,
    206, 51, 207, 204, 53, 47, 57, 50, 44, 40,
     36, 35, 150, 33, 144, 191, 188, 132, 164, 12,
     14, 95, 96, 20, 103, 176, 111, 22, 20, 182,
     16, 12,  9, 134, 223, 242, 243, 138, 32, 36,
     48, 42, 52, 50, 57, 203, 205, 206, 54,  0,
    111,  8, 20,  8, 112, 198, 140, 24, 212, 86,
    184, 64, 97, 162, 33, 166, 77, 32, 36, 208,
    251, 165, 32, 193, 31, 49, 231, 44, 176, 185,
     3, 33, 87, 188, 137, 32, 229, 129, 24, 129,
     66,  5, 10, 23, 35, 62, 184, 112,  1, 163,
    134, 141, 26, 57, 98, 210, 88, 209,  2, 69,
    139, 24, 49, 94, 188, 136, 97, 16, 71, 181,
    255, 28, 42, 26, 170, 184, 105, 99, 199, 142,
     25, 20, 66, 130, 43, 101, 134, 13, 173, 44,
    126, 224, 41, 157, 170, 72, 129, 128, 124, 59,
    152, 225, 115, 121,  3, 161, 209, 29, 52, 118,
    228, 192, 97, 131, 160, 13, 28,  8, 173, 173,
    208, 183, 130, 133, 10, 131, 48, 73, 124, 156,
     90, 145, 65, 134, 13, 26, 50, 104, 116, 51,
    139,  2, 152, 43, 14, 222, 237, 162, 58, 113,
     0, 10, 26, 47, 100, 208, 40, 113,  2,  6,
     15, 30, 58, 190, 234, 72, 81, 162, 68, 179,
    131, 60, 11, 190, 88, 209, 150, 133, 11, 21,
    109, 77, 74, 149, 23, 110, 65,  1, 13, 61,
     56, 108, 48, 160, 38, 22, 27, 38, 116, 168,
     84, 169, 82, 224, 15, 160, 65, 133, 168, 38,
     0, 113, 162, 132, 138, 98, 156, 101, 200, 104,
    177, 83, 231, 138, 202, 59, 115, 182, 88, 190,
    188, 184, 206, 196, 161, 85, 184,  8, 76, 193,
    192, 134, 235, 120, 89, 171, 73, 231, 186, 123,
    119, 53, 104, 230, 152, 33, 67, 222, 204, 153,
    240, 232, 211, 167, 201, 192, 190, 189, 28, 245,
    175, 214, 120, 159, 79, 63, 142, 147, 11, 84,
     36, 52, 120, 192, 63, 143, 255, 10, 121, 240,
    151, 138, 109, 128, 44, 96, 224, 129,  6, 98,
     49,  0, 39, 158, 52,  8, 130,  8, 29, 116,
     16, 32, 127, 15, 160, 194, 197, 23, 98, 184,
    242, 74, 125, 243, 49, 81, 255,  7, 30, 122,
     0, 232, 71, 32, 240, 204, 69, 88,  3, 143,
    132, 80, 201,  8, 13, 161, 224, 34, 10, 197,
     12, 199, 28, 113, 45, 200, 208, 22, 75, 38,
    144, 176, 201, 35, 32, 48, 224, 75, 56, 226,
    156, 66, 14, 22,  5, 100, 36, 223, 119, 22,
     92, 32, 65, 136, 238, 148, 72, 24, 72, 144,
     16, 115, 76, 50, 254, 144, 21, 208, 64,  4,
     57, 83, 67, 13, 53, 98, 211, 16,  9, 58,
     66, 84,  1, 85, 225, 140, 19, 134, 24, 232,
    180, 81, 75, 30, 130, 61, 73, 88,  7, 35,
    196, 200, 79, 79, 86, 222, 96, 195, 12, 48,
     45, 199, 19, 78, 124, 62, 39, 214, 10, 12,
    145, 208, 16, 11, 47, 192, 36, 209, 147, 117,
     21, 16,  5,  6, 108, 68, 224, 64, 133, 186,
    184, 73, 213,  0, 38, 168, 96, 140, 112, 44,
    192,  0,  3, 13, 49, 25, 245, 204, 87, 210,
     60,  3, 83, 14, 250, 216, 168, 194, 80, 91,
    194, 36, 131, 143, 132, 85, 180, 64,  4,  7,
     24, 176, 87, 18, 115, 216, 129, 69, 46, 163,
     73, 74, 207,  0, 155, 110, 169,  2, 15, 52,
     4, 107, 77, 88, 151, 213, 176, 67, 98, 53,
     24, 148, 19, 78, 47, 180, 48, 147, 91, 248,
    172, 96, 146,  4, 38, 210, 227, 106,  4, 28,
    168, 166, 157, 119, 179, 212, 49, 91, 109, 183,
     57, 169, 43, 34,  9, 176, 136,  2, 101, 39,
     28, 19, 255, 217, 87, 89, 225, 208, 219,  9,
     60, 25, 116, 208, 102, 156, 177, 192, 89, 169,
     44, 228, 235, 194,  0, 85, 85, 36, 206,  5,
     27, 100, 139, 87,  6, 173, 113, 40, 203, 44,
    177, 77, 161, 48, 126, 84, 148, 98, 219, 129,
    163, 140, 82,  8,  3, 33, 208, 80, 192,  2,
     29,  8, 90, 146, 165, 246, 114, 214, 86, 10,
     49, 48, 215, 236, 114, 156, 181, 16,  0,  1,
     7, 104, 160, 178, 202,  7, 196, 74, 240, 118,
     6, 199, 252, 26, 19, 226, 73, 97, 199, 41,
    251, 81, 216, 159, 127, 60, 247, 220, 179, 206,
     2, 162, 146, 138, 42, 97, 80, 80, 198, 121,
     27, 202, 172, 180, 125, 177, 221,  1, 98, 30,
    124, 84, 248,  7, 196, 18, 23, 98, 117, 60,
     14, 52, 210, 73, 131, 144, 68, 178, 53, 215,
     33, 12, 144, 139, 195, 167,  4, 61, 52, 145,
     70, 163, 195, 221, 210, 73, 120, 72,  1, 71,
     76, 142, 72, 98, 110, 83, 49, 176, 181, 36,
    151, 128, 169, 55,  9, 47, 46, 100, 210, 73,
    129, 142, 192, 32, 36, 13, 244, 235, 106, 41,
     66, 14, 249, 133, 145, 107, 27, 220, 151,  3,
     80,  3, 24, 238, 96, 227, 34, 208, 193, 37,
     38, 108, 236, 150, 189, 50, 164, 26, 106, 170,
    212, 144, 154, 105, 54, 219, 116,  2, 66,  2,
    164, 249, 139, 248, 144, 230, 164, 233, 93, 173,
    182, 72, 30, 105, 229, 188, 116, 240, 255, 193,
     61, 249, 32, 163, 140, 52,  0,  5, 212, 251,
    157, 206, 88, 115, 77, 160, 218, 64, 244,  1,
    234, 33, 185, 106, 38, 24, 173, 164, 241, 134,
     28, 236, 132, 120, 91, 181, 180, 39, 18,  2,
    223, 185, 39, 195, 251, 239,  3, 149, 85, 208,
    188, 210, 50, 244, 229, 67, 145, 56, 208, 170,
     2, 165, 176, 82, 133, 235, 72, 40, 169, 71,
    147, 212, 87, 175, 136,  8, 184, 239, 211, 238,
     51, 189, 99, 105, 103, 239,  7, 81, 163, 211,
    240, 95,  2, 211, 138, 88, 213, 42, 113, 40,
    140, 81, 73, 224, 200,  3, 102, 39, 191, 111,
    192, 233, 36, 167, 178, 212, 62, 114, 16, 131,
     59, 229, 196, 70, 52, 97, 14, 159, 228, 181,
     37, 82, 193, 32, 71, 38, 88,  1, 79, 118,
     96, 131, 28, 196, 111, 34, 232, 99,  0, 25,
     54, 178, 31, 143, 52, 112, 30, 25, 43, 201,
     10, 132, 35, 28, 172, 24,  5, 25, 157, 170,
     1, 78, 60, 231, 140, 180, 12, 43, 83, 42,
     24, 11, 64, 248, 81,  0, 55, 165, 144, 96,
     8, 108, 31, 84,  0, 113, 194, 23, 34, 160,
     0, 149, 50, 198, 49, 104, 128,  2, 30, 220,
     80,  7, 88, 140, 140, 149, 126, 39, 170, 97,
    233, 131,  6, 167, 202, 193, 157, 10, 101, 130,
     5, 32, 202, 34,  6, 208, 128, 172, 216, 80,
    171, 91, 49, 177, 137, 242, 187, 138, 22, 107,
    240, 27, 77, 57, 255,  6, 139, 193, 90, 198,
     12, 98, 130,  3, 121, 45, 171,  6, 138, 153,
     73, 91, 74, 226, 150, 50, 158, 175, 20,  7,
    184, 206, 182, 218, 48,  1, 58, 252, 37, 11,
    186, 128, 163, 174, 20, 80, 18, 107, 192, 96,
    130, 84, 202,  1, 30, 129, 85, 131, 96, 33,
     68, 89, 51, 176, 224, 102, 242, 117, 170, 98,
    100, 234, 80, 32, 81, 30, 106, 56, 144, 151,
     35, 201, 98, 14, 84, 248, 75, 96, 34, 249,
    194,  4, 240, 141,  5, 50, 64, 215, 20, 143,
    113, 63, 116, 133, 242, 32, 161, 180, 65, 78,
     58, 67, 74, 123, 185, 101, 95, 39, 44, 13,
     3, 48, 144, 45, 109, 21, 140, 67, 176, 241,
    214, 183, 166, 134, 27, 73, 210,  3,  2, 36,
    160, 76, 10, 166, 148, 21, 207, 225, 169, 55,
    241, 154, 151, 141, 102, 68, 35, 12, 110, 46,
     20, 170, 99, 64,  4, 238, 162, 154, 236, 60,
    147, 109, 69, 136, 166, 194, 230, 25,  1,  2,
     25, 168, 154, 148, 243, 69, 185, 122,  3, 66,
    205, 229, 43, 131, 43, 64, 215, 140, 116, 194,
    172, 231, 44,  7, 131,  1, 176, 14, 118, 84,
    102, 128, 151, 185, 18, 158, 223, 161, 25, 20,
    200, 67, 81, 50, 200,  6, 12, 14, 35, 144,
    109, 40, 37, 168, 204, 245, 109, 37,  1,  8,
     41,  1, 50, 96,  0,  3, 180, 236, 164, 45,
     43, 41, 193, 208,  0, 51, 136, 186, 244, 165,
    255, 48, 141, 105, 76, 193, 227, 132, 132, 89,
     1, 42, 66,  3, 154, 78, 129, 38, 180, 46,
    148, 35, 67, 71, 99, 233, 67, 101, 170, 52,
    137, 74, 225, 10, 57, 219, 153, 207, 252, 99,
    182, 46, 104, 225,  1, 123, 136, 80, 132,  0,
     52, 161, 166, 122, 161, 104, 65, 77, 26, 81,
     35, 58,  7, 252, 56, 138, 66, 60, 139, 218,
    128, 10, 116, 207, 136, 225, 179,  0,  2, 24,
    193, 215, 184, 198, 181, 145, 144, 96, 28, 168,
    160, 80, 79, 175, 218, 138, 39, 104, 117, 171,
     70, 136, 166, 29, 158, 118, 139, 62, 204, 146,
     68, 37, 178, 26, 69,  6, 176, 86, 72, 76,
    226, 176, 136, 141,  4, 216,  6, 48, 10,  3,
    253, 33, 174, 22, 82, 92, 93, 239, 42, 211,
    110, 237, 53, 114, 21, 120, 192, 44, 171, 102,
    205, 68, 56, 160,  3, 221, 16, 134, 37, 50,
     49,  2, 48, 53, 228, 180, 95, 50, 222, 39,
     6, 96,  8, 171,  9, 194, 97, 115, 93, 69,
    218, 156, 247, 210, 190, 20,  0, 68, 124, 24,
     81, 53, 221, 20, 12, 72, 172, 168, 163, 167,
     61, 201, 103, 242, 101, 204, 124, 193, 128, 33,
    165, 227, 17, 242, 18, 33, 138, 32, 165, 98,
     21, 172, 112, 69, 227, 160, 217, 213, 219, 134,
     40, 179, 147, 235, 236, 60, 42, 32,  9, 76,
    128,  9, 70, 46, 146, 32,  5, 251, 129, 144,
    231, 88, 35, 95, 200, 221, 255, 209,  7, 32,
    240, 13, 81, 172, 110, 21, 97, 144, 46, 117,
    105, 17, 187, 10, 232, 54, 159, 186, 74,  0,
     4, 236,  1, 163, 236, 117, 106, 26, 161, 210,
    210, 150, 170, 113, 141, 15, 134, 137, 65, 99,
    154, 135, 50, 189, 80, 14, 35, 113, 11, 118,
     76, 154, 158, 118, 67, 18, 12, 146, 228, 131,
    155, 85, 250, 199, 239, 162, 49, 224, 243, 146,
    110, 27, 198, 91, 174, 130, 149, 71, 142, 191,
     56, 88, 22, 24, 136, 222, 30, 30, 32, 152,
     9, 79, 37, 18, 196, 200, 199, 127, 183, 167,
    191, 253, 161, 69, 85, 94,  2, 19, 136, 59,
     81, 56, 165, 148, 201,  1, 204, 107, 222, 116,
    143, 208, 200, 53, 73, 78, 92, 78, 60, 68,
     8, 44, 204, 203, 251, 245, 49, 127,  4, 49,
    203, 141, 55, 99, 146, 211, 22, 143, 19, 32,
    112, 241, 33, 126, 60, 155, 11, 208, 150, 86,
     24, 184, 237, 30, 26, 192, 192, 36, 31, 130,
    126, 248, 152, 210, 150, 160, 241, 100, 40, 19,
    196, 143, 128, 244, 210, 248, 74,  7, 130,  4,
    147, 73, 28, 103, 42, 195, 144, 135, 64, 95,
     61, 120, 68, 203, 79, 186, 94, 154, 169, 20,
     42, 55, 119, 15, 120,  3, 166, 50, 241, 180,
    193, 137, 30, 31, 82, 157, 99, 152, 213, 17,
     40, 208,  0, 63, 47,  0, 208, 110, 138, 161,
    140, 147, 21, 141, 58, 213, 88, 89, 49, 64,
     75, 78, 255, 116, 98, 141, 160, 128, 176, 33,
    194, 33, 129, 164, 82, 120, 64, 54, 88, 23,
    126, 102, 238, 197,  3, 57, 182, 143, 29, 254,
     18, 79, 214, 184, 73, 48, 49, 179, 195, 208,
    201, 32, 27, 66, 209, 73, 13, 110, 224,  2,
     76, 35, 64, 121, 43, 76, 32, 30, 200, 108,
    236, 64, 147, 164, 99, 10, 129, 17, 13, 200,
    130, 39, 197, 12, 37,  0, 32,  0, 128,  9,
     88, 160, 107, 101, 17, 216, 192, 42, 144, 65,
     40, 219, 101, 62, 68, 49, 229,  9, 27, 193,
    131, 11, 99, 205, 139, 145, 128, 215,  5, 217,
    246, 12, 12, 148, 177,  3, 100, 212, 64,  7,
    156, 154, 129, 64, 228, 229, 71, 177, 228,  0,
     27, 48, 106, 129, 75, 138, 130, 131, 164, 152,
    155,  1, 78, 112, 245, 126, 152, 205, 110, 94,
     64, 128, 24, 156, 139, 201, 10, 54, 197, 174,
    100, 196, 68, 147, 235, 122, 198, 14, 133, 55,
     19, 75, 137, 241, 37, 200, 64, 37, 153, 12,
    212, 80, 73, 27, 129,  2, 101, 107, 83, 195,
     17, 81, 129, 74,  5, 139,  6, 60, 168, 35,
     14, 249, 97, 165,  0, 63,  3, 79, 247, 214,
     7, 190, 79, 149, 239, 23, 224, 128,  7,  4,
    164, 139, 69, 46, 16, 43, 147, 23, 225,  2,
     5, 208,  2, 153, 115, 213, 112,  5, 72, 41,
     50, 157, 68, 129, 24, 113, 64, 42, 117, 105,
    145, 44, 221, 187, 177, 90, 216, 226, 255, 150,
     23,  8, 51,  6, 52, 96,  0, 166, 175, 149,
     29, 163, 19, 33, 73, 183, 90, 122, 179, 167,
     34, 199, 110, 106, 74, 56, 157, 18, 11, 22,
    153, 33, 196, 59, 113, 152, 26, 129, 180, 81,
    166, 146,  5, 148,  7, 156, 241, 85, 215, 57,
    192, 80, 149, 128, 118, 55, 50, 61, 214,  3,
     80,  1, 212, 73, 85, 199, 95, 173, 139, 93,
     48, 225, 244, 168, 113, 82, 35, 143,  1, 177,
     45, 134, 188, 179, 10, 85, 211, 202, 61, 15,
     65, 14, 72, 191,  2, 36, 15, 239, 196,  2,
    160, 128,  5, 150, 156, 210, 88, 96, 146, 149,
     80, 222, 96, 143, 57, 168,  6, 168, 149, 213,
    130, 122, 213, 49, 124, 102, 244, 49, 41, 10,
     16, 176, 13,  8, 126, 240, 121, 133, 229, 35,
    113, 133, 95, 249, 217, 242, 146, 53, 208, 84,
     13, 82, 160, 169, 199, 56, 31,  6, 232, 210,
    161, 228, 119, 61, 74, 82, 194, 160, 45, 48,
     8,  5, 10, 93, 37, 129, 85, 174,  6, 248,
    109, 19, 190, 44, 37, 236, 68, 195, 132, 251,
     5, 232, 114, 62, 100, 216, 245, 174, 95, 102,
    198, 130, 181, 39, 46, 207, 221, 130, 130, 220,
    183, 87, 28, 17, 216, 64, 106, 190, 15, 126,
     70, 194, 114, 54, 55, 67, 126, 242, 131, 77,
     37, 129, 46, 89, 132, 69, 158, 130,  3, 59,
    208, 27, 252, 102, 119, 205, 226, 49, 245, 50,
     67, 250, 34,  0, 255, 34, 134,  8, 64, 194,
     0,  5, 112,  0, 251, 167, 70, 239, 68, 31,
    239, 225, 85, 211, 148, 93, 180, 147,  0, 34,
     96,  2, 218,  4, 25, 66, 20, 42, 239, 146,
     25,  6, 241, 128, 52, 17, 28, 251, 160, 119,
    150, 130,  2, 200,  3, 36, 165,  0, 43,  2,
    227, 123, 45, 181, 52, 221, 34, 27, 33, 120,
     79, 116, 243, 36, 11, 16,  2, 148, 65,  3,
    184, 132, 73, 133, 210, 130, 232, 210, 39, 228,
     68, 28, 207, 33, 28, 157, 17, 20, 18, 128,
    127, 119, 177, 80, 218, 209, 127, 50, 35, 79,
    243, 148, 31, 83,  3, 88, 65, 72, 15, 67,
    216, 27, 217, 192, 49, 29, 51, 35, 43, 240,
     46, 207, 209, 44, 207, 81, 80, 58, 17, 127,
     38, 225,  2, 24, 160,  1, 216, 145, 29, 14,
    229, 121, 48, 245, 30,  9, 179, 133, 13, 243,
     48, 101, 21, 88, 87, 131,  8, 11, 48,  2,
     39, 208,  2, 112, 146, 57, 196, 213, 22, 51,
     52, 28, 103, 88,  2, 109, 232, 132,  6, 85,
    121, 38, 147, 70, 120, 177, 50, 177, 178, 29,
    118, 136, 87, 66, 32, 81, 121, 88, 81, 117,
    112, 49, 26, 69, 86,  7, 130, 11,  6, 210,
     0, 37, 232, 81, 248, 64, 134, 167,  2, 129,
    156, 33, 82, 41, 67, 137, 41, 213, 80, 239,
    209, 129, 152, 24, 11, 52, 53, 30, 156, 88,
     30, 102,  0, 31, 186, 56,  1, 236, 81, 82,
     30, 190, 248, 139, 42, 181, 82, 66, 133, 133,
    179, 232, 129, 52, 85, 83, 230, 145, 140, 202,
    184, 140, 230, 161, 139, 195, 120, 137, 108, 19,
     4,  0, 59,  0 };

    
[3]在PHP中使用灵巧的体系结构
    来源: 互联网  发布时间: 2013-11-30
很久以前我就想写这篇文章了,但是一直都没有时间。这里并不是想要告诉你怎样做,我希望它可以投石问路,和大家讨论一下如何开发一个好的、扩展性佳的web应用。

  我从事开发已经有2-3年了,回望刚开始做的程序,真有点不相信是自己写的,现在我的web开发技巧已经得到了很大的提高,例如sourceForge(http://sourceforge.net/)就是我较为成熟的一个作品,代码都被分成各种的类和函数。数据库的结构也很清晰。站点的不同部分都是与其它部分独立开来的。

  不过这个站点也不是完美的。如果我必需再写一遍,我将会通过对象或者函数库的方式,让HTML层与数据库层更明显地区分开来。

  我发现不少的管理者都喜欢用图表的形式来表示自己的想法,这里我也提供一个。这种体系的意念是要将你的逻辑从表层中独立开来,这意味着任何复杂的东西都会下放到“API/数据访问层”。

  对于安全检查、更新等代码,你最好不要放在HTML层中,你应该将这些理论上的代码放到API层。HTML层将只会进行简单的函数调用,并且返回数组、对象或者我最喜爱的数据库结果集。

  在这个图中,HTML接口或者直接调用API层,或者调用一个HTML工具库(例如产生弹出窗口等),而那些库通过一个数据库抽象层可调用数据库(这样你就不必绑定在某种数据库上)。

基本的要点
对于一个灵巧的体系来说,有以下基本的要点:
1。数据库独立
2。表示层独立
3。便于修改
4。面向对象或者至少拆成函数库调用
这些都是我想到的,除了以上提到的外,肯定还有其它的要点,你可以在论坛中提出来。

以下就让我们详细地讨论一下以上各点:

1。数据库独立
你在设计的时候,或许不会知道自己的站点的负担究竟有多大,应此你应该记住一点,不能绑定在轻量级的数据库上,例如MS Access或者其它。因此你应该考虑到扩展性,如果更换数据库的话,你不用做太大的改动,甚至不用做什么改动,这是最理想的。

使用PHP时,对于各种数据库的函数调用都是不同的,你需要针对使用的数据库进行不同的编码。为了改变这种情况,你可以使用一个数据库抽象层,例如类似PHPLib或者其它人开发的库。
2。表示层独立
假如你要开发一个真正巨大、复杂的应用,你就必需开始考虑数据库的接口问题,这样你可以少做很多复制和粘贴的工作。例如你需要让你的站点具有WAP功能,以便移动电话的用户可以访问到它。如果你的应用设计得好的话,你只需要写一个轻便的WAP表示层调用所有你的数据库访问对象就行了,但是,如果你的应用体系设计得不好,你就可能需要重新写一个,这样你就需要同时维护一个HTML版本和一个WAP版本。

例如在开发SourceForge站点时,我们有大量的用户要提交他们的bug和任务等。开始时我们将它设计为全部通过web接口进行。后来在某些人的压力下,我们决定使用XML接口展现数据库。我们成功地将站点的核心逻辑由表示层中分离出来。现在的SourceForge上的bug跟踪和其它工具都使用两个不同的库--HTML库类和数据库类。数据类负责检测输入的值是否有效,并且处理安全检测,而表示层只是根据成功/失败返回true或者false。 为了简化,在我必须解释基类和其它对象如何扩展这些基类时,这个例子将不会基于一个完美的对象模型。不过我想这个例子能帮你建立一些概念。

HTML类的例子

//连接数据库
require ("database.php");

//通常使用的HTML头部/页脚
require ("html.php");

//数据访问库类
require ("bug_data.php");

echo site_header("Page Title");

echo "
Updating A Bug


";

if (bug_data_update($field1,$field2,$field3)) {

echo "

Update Failed!
";

} else {

echo "
Updated Bug Successfully
";
//显示全局错误字符串
echo $feedback;
}

echo site_footer();

?>

Example Data Access Lib

/**
* 控制更新数据库中的一个bug
* 进行数据有效性和安全的检查,并且在成功时返回true,
* 失败时返回false
*
*
*/

function bug_data_update ($field1,$field2,$field3) {
//全局字符串,返回错误
global $feedback;

//$field1 and $field2 are required
if (!$field1 || !$field2) {
$feedback="Field 1 And Field 2 Are Required";
return false;
}

//确认用户有权更新
if (!user_isadmin()) {
$feedback="You Must Be An Admin To Update a Bug";
return false;
}

//现在可以更新该bug

$result=db_query("UPDATE bug ".
"SET field2='$field2',".
"field3='$field3' ".
"WHERE id='$field1'");

//现在检查你的语句是否执行成功
if (!$result) {
//update failed
return false;
} else {
return true;
}
}

?>
3。便于修改
你当然不会在整个应用中都使用绝对的URL,不过我还要求更进一步,颜色的选择、元素的名字、字体和其它可能的选项最好也不是绝对的,它们应该在一个配置文件中设置,并且在每一页中将该文件包含进来。站点的风格也应该独立开来--这样你就无需在每个页面都进行拷贝粘贴的工作,我通常都将这些HTML放在一个函数中,然后就可以在需要时调用。

对于数据库密码、数据库连接等,同样也放在数据库抽象层中。

4。面向对象/函数
我们可以将流程处理拆分成不同的函数调用。每个调用都做一件事情,有时只需要调用其它的函数并且返回结果。

一个很好的例子是在每页中检查一个用户是否已经登录。如果不使用对象或者函数的话,在你的认证系统变动的时候,你就必须在每一页作修改,而不是仅仅改变库中一个函数的调用。在写一段代码之前,你要想一下,如果它在站点中要使用不止一次,你就必须将它移到库中实现。 还有补充吗?
肯定我还有一些地方没有想到,因此请提出你的想法。特别是,你写了一个很大、很复杂的应用,我很想知道如果要你重新再写一次,你会建立怎样的体系并且会做什么改变。

    
最新技术文章:
▪PHP函数microtime()时间戳的定义与用法
▪PHP单一入口之apache配置内容
▪PHP数组排序方法总结(收藏)
▪php数组排序方法大全(脚本学堂整理奉献)
▪php数组排序的几个函数(附实例)
▪php二维数组排序(实例)
▪php根据键值对二维数组排序的小例子
▪php验证码(附截图)
▪php数组长度的获取方法(三个实例)
▪php获取数组长度的方法举例
▪判断php数组维度(php数组长度)的方法
▪php获取图片的exif信息的示例代码
▪PHP 数组key长度对性能的影响实例分析
▪php函数指定默认值的方法示例
▪php提交表单到当前页面、提交表单后页面重定...
▪php四舍五入的三种实现方法
▪php获得数组长度(元素个数)的方法
▪php日期函数的简单示例代码
▪php数学函数的简单示例代码
▪php字符串函数的简单示例代码
▪php文件下载代码(多浏览器兼容、支持中文文...
▪php实现文件下载、支持中文文件名的示例代码...
▪php文件下载(防止中文文件名乱码)的示例代码
▪解决PHP文件下载时中文文件名乱码的问题
▪php数组去重(一维、二维数组去重)的简单示例
▪php小数点后取两位的三种实现方法
▪php Redis 队列服务的简单示例
▪PHP导出excel时数字变为科学计数的解决方法
▪PHP数组根据值获取Key的简单示例
▪php获取图片的exif信息的示例代码 iis7站长之家
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3