前言
PHP 本身已经是一种非常快速的语言,不过除了执行速度,PHP仍然有许多可以被优化的地方。
在本文中我们将介绍一下几点:
1. 为什么PHP中优化的有许多因素是和代码没有关系的
2. 在提升PHP性能的过程中,为什么我们还需要了解更多的关于其它方面的知识
3. 这些子系统导致瓶颈的原因以及解决的方法
4. 我们还讨论如何调整以及优化PHP代码使其拥有更佳的性能
达到高性能
当我们谈论高性能时,我们并不仅仅指一个PHP脚本运行的有多么快速,性能是指速度和可伸缩性的折中权衡。使用较少资源的脚本因该会比另一个使用了缓存的脚本要慢,但是在web服务器中,某一时刻可能运行同一个脚本的多个拷贝。
在下面的例子中,我们假设脚本a.php是一位跑得十分快速赛跑选手,而b.php是一位马拉松长跑健将,他的速度是基本不变的。在负载较轻时,a.php 运行的要比b.php快,然而随着web服务器的负载不断增加,b.php的性能只是降低了一些,而a.php却大势已去!
现在我们以一个现实中的例子来解释上面发生的情况。我们要写一个PHP脚本,它从一个250k的文件中读取数据,并且生成一个HTML文件。为了便于比较,我们写了两个实现同样功能脚本:“hare.php” 将文件一次性读入内存,并且一次性处理所有的数据;“tortoise.php” 一次只从文件中读取一行,并且决不在内存中保留多于一行的信息。结果是tortoise.php因为使用了更多的系统调用而明显的慢与hare.php。
脚本hare.php要求有0.04秒的CPU时间和
当有10个脚本被同时运行时,hare.php将会占用掉所有的内存(
下表中较快的PHP脚本使用了粗体以示区别:
连接数 | 1个HTTP连接时的CPU时间 | 10个HTTP连接时的CPU时间 | 11个HTTP连接时的CPU时间 |
hare.php | 0.04 | 0.40 | 0.88 |
tortoise.php | 0.06 | 0.06 | 0.66 |
上面的例子说明:提供好的性能并不是仅仅指编写一个快速的PHP脚本。实现高性能的PHP还要求对底层硬件、操作系统、以及常用的配套软件像web服务器和数据库系统都有良好的认识。
总结下php程序效率优化的一些策略:
1.在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题;
2.尽量的少进行文件操作,虽然PHP的文件操作效率也不低的;
3.优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作(在update上,我被恶批过);
4.尽可能的使用PHP内部函数(但是我却为了找个PHP里面不存在的函数,浪费了本可以写出一个自定义函数的时间,经验问题啊!);
5.循环内部不要声明变量,尤其是大变量:对象(这好像不只是PHP里面要注意的问题吧?);
6.多维数组尽量不要循环嵌套赋值;
7.在可以用PHP内部字符串操作函数的情况下,不要用正则表达式;
8.foreach效率更高,尽量用foreach代替while和for循环;
9.用单引号替代双引号引用字符串;
10.“用i+=1代替i=i+1。符合c/c++的习惯,效率还高”;
11.对global变量,应该用完就unset()掉;
以上的策略所涉及的问题,我都在实践中遇到过,用了这些策略,效率提高了不少。试试吧。。。。
以下是一篇关于提高PHP效率的文章,很不错啦:
===================================================================================
榨干 php,提高效率
2006-12-22 14:35
原文地址:http://www.111cn.net/bbs/thread-13409-1-1.html
这篇杂文翻译整理自网络各路文档资料(见最末的参考资料),尤其是 Ilia Alshanetsky (佩服之至) 在多个 php 会议上的演讲,主要是各类提高 php 性能的技巧。为求精准,很多部分都有详细的效率数据,以及对应的版本等等。偷懒,数据就不一一给出了,直接给结论,如果需要看原文档,请到文末「参考资料」部分。橙色标题为推荐部分。
========================================================
静态调用的成员一定要定义成 static (PHP5 ONLY)
贴士:PHP 5 引入了静态成员的概念,作用和 php 4 的函数内部静态变量一致,但前者是作为类的成员来使用。静态变量和 Ruby 的类变量(class variable)差不多,所有类的实例共享同一个静态变量。
QUOTE:
// php CODE Highliting for CU by dZ902
<?php
class foo {
function bar() {
echo ''foobar'';
}
}
$foo = new foo;
// instance way
$foo-
我查询一个表比如xinxi 里面的其中有字段为name,id
select name from xinxi where id="变量"
如果查出来的name 的长度的字符 的值大于3比如为"aaaaaaaaaaaaaaa"我想显示为"aaa...";
怎么实现望大家帮忙.......
--
如果是SQL语句则为:
- SQL code
select name = case when len(name) > 3 then left(name,3) else name end from xinxi where id=''变量''
好久没有装过了,这次安装又发现了些问题,gg,baidu搜了一大圈,有的解决方法,有的不可以,把我的配置方法写一遍,留备用。
目标:win2003下配置iis+php+zend+mysql+phpmyadmin
需要软件列表:
IIS6: win2003自带
php: 版本 5.2.5 (最开始用的win下面的msi的安装包,总是出问题,最后换了zip包进行安装)
zend: 版本 2.2.0
phpmyadmin: 版本 2.11.5
mysql: 版本 5.0.22-community-nt
以下为参考某网站版本,对于我个人适用
===================================
WIN2003 IIS6.0+ASP.NET+PHP+MYSQL+ZEND配置
第一步 IIS安装
首先在控制面板里运行"添加删除程序" 打开 应用程序服务器 钩上ASP.NET
双击Internet 信息服务(IIS)-- 万维网服务 钩上Active Server Pages 确定 安装
把Win 2003系统盘插入光驱安装 或者指向系统文件I386目录安装
然后启用IIS父路径
打开我的电脑 -- 控制面板 -- 管理工具 -- Internet 信息服务(IIS)管理器 -- 双击打开列表
点网站 -- 属性 -- 主目录 -- 配置 -- 选项 -- 钩上 启用父路径 确定
然后修改默认访问文件 在文档里添加删除
我一般设置Default.htm Default.html Default.asp Default.aspx Index.htm Index.html Index.asp Index.aspx
第二步 PHP配置
先到php官网下载php安装包
http://www.php.net/downloads.php
目前最新版是 PHP 5.2.3 zip package
将下载来的 php-5.2.3-Win32.zip 解压缩到C:PHP
先将C:PHPphp.ini-recommended 重命名为 php.ini,
将这个文件剪贴到C:windows中,确认它有users读与运行的权限。
用记事本打开C:windowsphp.ini
查找short_open_tag = Off,把off改成On,此处一般能解决运行安装Discuz!论坛时出现空白的问题
查找extension_dir = "./" 改为 extension_dir = "C:phpext"
查找;extension=php_mbstring.dll,把分号;去掉
查找;extension=php_mysql.dll,把分号;去掉,注意是mysql
查找;extension=php_gd2.dll,把分号;去掉
查找safe_mode = Off 改为: safe_mode = On
查找magic_quotes_gpc = Off 改为: magic_quotes_gpc = On
下面的是否要修改自己决定:
一些文件上传以及内存使用最大限制:
post_max_size = 20M 闪存容量
upload_max_filesize = 20M 附件容量
去掉前面的;
extension=php_bz2.dll
extension=php_curl.dll
extension=php_dba.dll
extension=php_dbase.dll
extension=php_gd2.dll
extension=php_imap.dll
extension=php_interbase.dll
extension=php_ldap.dll
extension=php_mbstring.dll
extension=php_mssql.dll
extension=php_mysql.dll
extension=php_pdo_mssql.dll
extension=php_pdo_mysql.dll
extension=php_pdo_odbc.dll
extension=php_sockets.dll
extension=php_xmlrpc.dll
exten
function auto_charset($fContents,$from='''',$to='''')
{
if( strtoupper($from) === strtoupper($to) || empty($fContents) || (is_scalar($fContents) && !is_string($fContents)) ){
//如果编码相同或者非字符串标量则不转换
return $fContents;
}
$from = strtoupper($from)==''UTF8''? ''utf-8'':$from;
$to = strtoupper($to)==''UTF8''? ''utf-8'':$to;
if(is_string($fContents) ) {
if(function_exists(''mb_convert_encoding'')){
return mb_convert_encoding ($fContents, $to, $from);
}elseif(function_exists(''iconv'')){
return iconv($from,$to,$fContents);
}else{
exit(''转换失败'');
return $fContents;
}
}
elseif(is_array($fContents)){
foreach ( $fContents as $key => $val ) {
$_key = auto_charset($key,$from,$to);
$fContents[$_key] = auto_charset($val,$from,$to);
if($key != $_key ) {
&