当前位置:  编程技术>php
本页文章导读:
    ▪PHP 优化详解 - Rayol      笔者收集的这些技巧来源较广,完整性不能保证。 由于数量较多,这些优化技巧没有经过测试。请各位看官在使用之前自行测试,毕竟这些技巧是否能派上用场,还是需要由PHP所在的独特环.........
    ▪PHP时间格式控制符对照表 - arlenhou                format 字符说明返回值例子日------d月份中的第几天,有前导零的 2 位数字01 到 31j月份中的第几天,没有前导零1 到 31S每月天数后面的英文后缀,2 个字符st,nd,rd.........
    ▪Codeigniter 隐藏URL中index.php - wtx2338      最经有点想架设一个个人网站玩一玩, 前段时间试了试 zend framwork 觉得对于个人网站来说太过复杂, 所以开始尝试 Codeigniter。 基本原理是差不多的, 文档也比较全。 开始Codeigniter  .........

[1]PHP 优化详解 - Rayol
    来源:    发布时间: 2013-11-07

笔者收集的这些技巧来源较广,完整性不能保证。 由于数量较多,这些优化技巧没有经过测试。请各位看官在使用之前自行测试,毕竟这些技巧是否能派上用场,还是需要由PHP所在的独特环境所决定的。

目录索引

  • 找到瓶颈(Finding the Bottleneck)
  • 缓存 (Caching)
  • 编译 vs. 解释(Compiling vs. Interpreting)
  • 代码减肥 (Content Reduction)
  • 多线程与多进程(Multithreading & Multiprocessing)
  • 字符串(Strings)
  • 正则表达式(Regular Expressions)
  • 迭代结构 (Iteration Constructs (for, while))
  • 选择结构 (Selection Constructs (if, switch))
  • 函数与参数 (Functions & Parameters)
  • 面向对象结构 (Object-Oriented Constructs)
  • Session处理 (Session Handling)
  • 类型转换 (Type Casting)
  • 压缩(Compression)
  • 错误处理(Error Handling)
  • 声明、定义与范围(Declarations, Definitions, & Scope)
  • 内存泄漏(Memory Leaks)
  • 不要重复发明轮子(Don’t Reinvent the Wheel)
  • 代码优化(Code Optimization)
  • 使用RAM(Using RAM Instead of DASD)
  • 使用服务(Using Services (e.g., SQL))
  • 安装与配置(Installation & Configuration)
  • 其他(Other)
  •  

    找到瓶颈(Finding the Bottleneck)

    面对一个性能问题是,第一步永远是找到问题产生的原因,而不是去看技巧列表。搞明白产生瓶颈的原因,找到目标并且实施修复,然后再重新测试。查找瓶颈只是万里长征的第一步,这里有些常用技巧,希望对最重要的第一步找到瓶颈能有所帮助。

    • 使用监控方法(比如监控宝),进行benchmark和监控,网络,特别是网络状况瞬息万变,做得好的话5分钟就可以找到瓶颈。
    • 剖析代码。必须了解那部分代码耗时最多,在这些地方多多关注。
    • 想找到瓶颈,请检查每个资源请求(比如,网络、CPU、内存、共享内存、文件系统、进程管理、网络连接等等……)
    • 先对迭代结构和复杂的代码进行benchmark
    • 在在真实负载下用真实数据进行真实测试,当然,如果可以最好用产品服务器。

    缓存 (Caching)

    有些人认为缓存是解决性能问题最有效的办法之一,试试这些:

    • 使用OPCODE(操作码)缓存,这样脚本就不会在每次访问时重新编译一次。比如:启用Windows平台上的windows缓存扩展。可以缓存opcode,文件,相对路径,session数据和用户数据。
    • 考虑在多服务器环境下使用分布式缓存
    • 在调用imap_header()之前先调用imap_headers()

    编译 vs. 解释(Compiling vs. Interpreting)

    将PHP源码编译成机器码。动态解释执行同样的编译,但它是按行执行的。编译为opcode是折中选择,它可以将PHP源码翻译为opcode,之后opcode再转为机器码。以下为关于编译与解释的相关技巧:

    • 上线之前将PHP代码编译为机器码。opcode缓存尽管并不是最好的选择,但依旧比解释型来得强。或者,考虑将PHP代码编译成一个C扩展。
    • PHP的opcode编译器(bcompiler)还不能在产品环境中使用,但是开发者应该关注http://php.net/manual/en/book.bcompiler.php.

    代码减肥 (Content Reduction)

    越少越块。 这些技巧可以帮助减少代码:

    • 每页提供更少的功能
    • 清理网页内容
    • 如果解释型执行,请清理注释和其他空白
    • 减少数据库查询

    多线程与多进程(Multithreading & Multiprocessing)

    由快到慢依次为:

  • 多线程(单一进程中)
  • 多进程(比如,pcntl_fork,计划任务)
  • 单进程(一行又一行)
  • PHP不支持多线程,但是可以用C写多线程的PHP扩展。有一些办法可以使用多进程或模拟多进程,但支持的并不是很好,没准儿比单进程还慢。

    字符串(Strings)

    字符串处理,是大多数编程语言中最常用的操作之一。这里有些技巧可以帮我们让字符串处理速度更快一些:

    • PHP的连接运算(点运算),是最快的链接方式
    • 避免在print中链接字符串,用逗号分割后用ECHO
    • 尽可能使用str_前缀的字符串函数替代正则表达式
    • pos()比preg_mach()和ereg()都快
    • 有人说单引号包裹字符串比双引号更快,有人说没有区别。当然,如果想在字符串中引用变量,单引号没戏。
    • 如果想判断字符串长度是否小于某值(比如5),请使用isset($s[4])<5。
    • 如需将多个小字符串连接成一个大字符串,试着先开启ob_start输出缓存,再用echo输出到缓冲区,完成后使用ob_get_contents读取字符串

    正则表达式(Regular Expressions)

    正则表达式为们带来了灵活多样的比较与查找字符串的方法,单他的性能开销却着实不低

    • 尽可能使用STR_前缀的字符串处理函数代替正则表达式
    • 使用[aeiou]的不是(a|e|i|o|u)
    • 正则表达式越简单速度越快
    • 尽可能不要设置PCRE_DOTALL修饰符
    • 用^.*代替.*
    • 简化正则表达式。(比如使用a*代替(a+)*

    迭代结构 (Iteration Constructs (for, while))

    迭代(重复,循环)是最基本的结构化编程方法,很难想像有不使用它的程序。这里有些技巧,帮助我们改进迭代结构的性能:

    • 尽可能讲代码移出到循环外(函数调用、SQL查询等等……)
    • 使用i=maxval;while(i–)代替for(i=0;i<maxval;i++),这样可以减少一个操作,如果maxval是一个函数调用就更明显了。
    • 使用foreach迭代集合与数组

    选择结构 (Selection Constructs (if, switch))

    与迭代结构相同,选择结构也是最基本的结构化变成方法。以下技巧或许能改善性能:

    • switches和else-if中,应该将最近常出现true的列在前面,较少出现true的请靠后
    • 有人说if-else比swtich/case快,当然,有人反对。
    • 用elseif替代else if.

    函数与参数 (Functions & Parameters)

    将函数的代码分解成小函数代码可以消除冗余,让代码具有可读性,但代价是什么?这里有些技巧,以帮助更好的使用函数:

    • 引用传递出对象和数组,而不是传值
    • 如果只在一个地方使用,使用内联。如果在多个地方调用,考虑内联,但请注意可维护性
    • 了解你所用函数的复杂度。比如similar_text()为O(N^3),这意味着字符串长度增加一倍,处理时间将增加8倍
    • 不要通过“返回引用”来提升性能,引擎会自动优化它。
    • 以常规方式调用函数,而不是使用call_user_func_array()或eval()

    面向对象结构 (Object-Oriented Constructs)

    PHP的面向对象特性,可能会影响到性能。以下提示可以帮助我们尽量减少这种影响:

    • 不是一切都需要面向对象, 性能的损失可能会超过其优点本身
    • 创建对象比较慢
    • 如果可以,尽可能时候用数组而不是对象
    • 如果一个方法可以静态化,请静态声明
    • 函数调用比派生类方法调用要快,派生类方法调用比基类调用要快
    • 考虑将基类中最常用的代码复制到派生类中,但要注意维护性隐患
    • 避免使用原生的getters与setters。如果不需要他们,请删除并且属性公开
    • 创建复杂的PHP类时,考虑使用单件模式

    Session处理 (Session Handling)

    创建sessions有很多好处,但有时会产生没必要的性能开支。以下技巧可以帮助我们最大限度减少性能开支:

    • 不要使用auto_start
    • 不要启用use_trans_sid
    • 将session_cache_limited设置为private_no_expire
    • 为虚拟主机(vhost)中的每个用户分配自己的目录
    • 使用基于内存的session处理,而不是基于文件的session处理

    类型转换 (Type Casting)

    从一种类型转换为另一种类型需要成本

    压缩(Compression)

    在传输前,压缩文本和数据:

    • 使用ob_start()在代码起始处
    • 使用ob_gzhandler()可以下载提速,但是注意CPU开支
    • Apache的mod_gzip模块可以即使压缩

    错误处理(Error Handling)

    错误

        
    [2]PHP时间格式控制符对照表 - arlenhou
        来源:    发布时间: 2013-11-07

              

    format 字符说明返回值例子日------d月份中的第几天,有前导零的 2 位数字01 到 31j月份中的第几天,没有前导零1 到 31S每月天数后面的英文后缀,2 个字符st,nd,rd 或者 th。可以和 j 一起用z年份中的第几天0 到 366星期------l(“L”的小写字母)星期几,完整的文本格式Sunday 到 SaturdayD星期中的第几天,文本表示,3 个字母Mon 到 SunNISO-8601 格式数字表示的星期中的第几天(PHP 5.1.0 新加)1(表示星期一)到 7(表示星期天)w星期中的第几天,数字表示0(表示星期天)到 6(表示星期六)WISO-8601 格式年份中的第几周,每周从星期一开始(PHP 4.1.0 新加的)例如:42(当年的第 42 周)月------F月份,完整的文本格式,例如 January 或者 MarchJanuary 到 Decemberm数字表示的月份,有前导零01 到 12M三个字母缩写表示的月份Jan 到 Decn数字表示的月份,没有前导零1 到 12t给定月份所应有的天数28 到 31年------L是否为闰年如果是闰年为 1,否则为 0oISO-8601 格式年份数字。这和 Y 的值相同,只除了如果 ISO 的星期数(W)属于前一年或下一年,则用那一年。(PHP 5.1.0 新加)Examples: 1999 or 2003Y4 位数字完整表示的年份例如:1999 或 2003y2 位数字表示的年份例如:99 或 03时间------a小写的上午和下午值am 或 pmA大写的上午和下午值AM 或 PMBSwatch Internet 标准时000 到 999g小时,12 小时格式,没有前导零1 到 12G小时,24 小时格式,没有前导零0 到 23h小时,12 小时格式,有前导零01 到 12H小时,24 小时格式,有前导零00 到 23i有前导零的分钟数00 到 59>s秒数,有前导零00 到 59>时区------e时区标识(PHP 5.1.0 新加)例如:UTC,GMT,Atlantic/AzoresI是否为夏令时如果是夏令时为 1,否则为 0O与格林威治时间相差的小时数例如:+0200P与格林威治时间(GMT)的差别,小时和分钟之间有冒号分隔(PHP 5.1.3 新加)例如:+02:00T本机所在的时区例如:EST,MDT(【译者注】在 Windows 下为完整文本格式,例如“Eastern Standard Time”,中文版会显示“中国标准时间”)。Z时差偏移量的秒数。UTC 西边的时区偏移量总是负的,UTC 东边的时区偏移量总是正的。-43200 到 43200完整的日期/时间------cISO 8601 格式的日期(PHP 5 新加)2004-02-12T15:19:21+00:00rRFC 822 格式的日期例如:Thu, 21 Dec 2000 16:01:07 +0200U从 Unix 纪元(January 1 1970 00:00:00 GMT)开始至今的秒数 即时间戳参见 time()

     

     


    本文链接:http://www.cnblogs.com/arlenhou/p/3202555.html,转载请注明。


        
    [3]Codeigniter 隐藏URL中index.php - wtx2338
        来源:    发布时间: 2013-11-07

    最经有点想架设一个个人网站玩一玩, 前段时间试了试 zend framwork 觉得对于个人网站来说太过复杂, 所以开始尝试 Codeigniter。 基本原理是差不多的, 文档也比较全。

     

    开始

    Codeigniter  这个框架所有的链接都通过 index.php 来传递。 在默认情况下 链接中都需要加上 index.php 的, 当然在我们实际使用时, 是希望把这个去掉的。 很多人讲了很多方法, 我这里只有一点不同。

    google搜了一下,官方文档上也有说明 :http://codeigniter.org.cn/user_guide/general/urls.html 。

    大致上需要改两个地方 :

    1) 修改根目录的.htaccess 文件 以修改服务器的 重新定向。 这个个人有不同改法, 我最终采用的是官方版本稍微修改了一下的形态 :

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond $1 !^(index\.php|images|js|img|css|robots\.txt)
    RewriteRule ^(.*)$ /index.php/$1 [QSA,L]

    这一步需要你确认你的服务器开启了重新定向。

     

    2) application/config/config.php 将 index_page 的值设’’

    $config['index_page'] = '';

     

    但是就在我完成了这两步之后, 重新定向任然不能成功。 具体表现是这样的 :

    www.mysite/home 失败
    www.mysite//home 成功

    需要 加上 // 才可以是重新定向成功。 我尝试了许多方法, 也尝试修改 .htaccess  文件的最后一行都不可以。 最后的解决方法是 修改 application/config/config.php

    $config['uri_protocol'] = 'PATH_INFO';

    将原来的 AUTO 改为 PATH_INFO, 这里也有别人改为 REQUEST_URI, 在我的虚拟空间上是不可以的,应该跟服务器有关。

     

    之后, 为了搜索引擎优化, 想使所有 带index.php的链接失效的, 可以参考这篇文章 : http://jsnwork.byethost7.com/blog/?p=217


    本文链接:http://www.cnblogs.com/wushuang9011/p/3202678.html,转载请注明。


        
    最新技术文章:
    ▪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数组去重的函数代码示例
     


    站内导航:


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

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

    浙ICP备11055608号-3