澳门新葡萄京娱乐场优化PHP程序

网上很多文章介绍优化php程序,是通过安装Zend
Optimizer之类的加速软件实现的,但这种加速是有限的。本文主要从程序代码着手介绍一些优化手段。1、程序的抽象层越多,各抽象层分离得越严格,程序效率越低。最原始的应用于网页的php程序模式莫过于脚本嵌入模式,即仅仅在一个网页中需要动态处理或显示数据的地方通过加入标识符嵌入php脚本。一般来说这是php程序员最早学习的模式,它只有一个抽象层,就是网页,故本文称其为单层模式。随着网站规模逐渐增大,程序员可能会发现单层模式的程序很难维护,当想对程序修改或扩充功能时,会发现代码非常混乱,感觉无从下手。于是模板类诞生了,它使一个网页由两个文件组成:一个php程序文件,一个html模板文件。常用的模板类有PHPLib库带的Template模板类,Smarty模板类等。由于加入了额外的处理程序,程序效率下降了。你若不信可自己测试一下。其实一般情况下,不用函数比用函数的效率高,而用函数的效率又比对象封装高。所以就算在编译语言中,需要高效率的地方会用C写而不用C++,例如FreeBSD操作系统的内核;而需要极端高效的地方还要用汇编写。为了使程序可以适应多种数据库系统,或者方便随时转换数据库系统,常常还会用一个类把跟数据库打交道的函数封装起来,这样当转换数据库系统时只要把封装类换掉就行了,主程序不需要修改。这里又用了一个类,效率又打折扣了。上述模板类的使用,使程序分成两个抽象层:程序层和表现层。而数据库类的使用又把程序层分为数据接口层和数据处理层。项目越庞大,需要分离的抽象层就越多,这样使得分工清晰,方便管理,但是以牺牲程序执行效率为代价。对于抽象层造成的效率下降,优化的方法有二:减小抽象层、优化抽象层之间的接口。一般地,不应该为了提高效率而盲目减小抽象层,这样会使得代码混乱、难于管理。但是不应该为小项目建立过多的抽象层,除非你有将来把它做得很大的计划。关于如何恰当分割抽象层,本文不作更深入讨论。对于上文说的两个分层例子,优化抽象层之间的接口分别是模板类和数据库操作类。抽象层接口在程序中需要被频繁调用,以在不同层之间交换信息,所以层接口是很值得优化的。对于数据库接口类,可能仅仅是封装一些数据库函数,优化余地恐怕不大。对于模板类,很多时候是有较大优化余地的。一般地,模板模型越通用,模板类功能越强大,效率就越低,例如PHPLib库带的Template类就有极大的优化余地。而Smarty模板类比PHPLib的Template更复杂,我没有用过,据称有缓存机制,不知是否可以弥补其性能损耗。下面就来看看PHPLib的Template类有多少东西可以优化掉。(1)
读入模板文件时,file函数效率低,改用get_file_content函数。(2)
匹配子模板时,正则表达式替换函数preg_replace效率低,改用str_pos函数进行定位和用str_replace函数进行替换操作。此优化手段后文会详细分析。(3)
模板模型通用性很强,能适应各种情况,但在具体细节的处理上,通用的方法效率可能很低。可以对模板模型作适当修改。我的做法是建一个相对通用的模板类,然后再派生出一个只适用于特定程序的模板类。在通用模板类的模板模型上可以作些优化,例如在处理二维数据表的时候用PHPLib的Template处理就比较复杂,需要多次调用类方法,所以重写的时候可以把处理二维数据表的功能封装到一个高效率的方法中,直接避免方法的多次调用。(4)
调试功能在小项目上不需要用,跟调试相关的代码全部去掉。我在按上面4点重写了模板类之后,一个复杂页面的执行时间缩小了一个数量级。现在就优化你的程序的抽象层之间的接口,特别是当这些接口是使用现成的函数或类的时候。因为这些函数或类在设计时会为了适应普遍情况而牺牲一些效率,而且它们的作者也可能没有考虑效率问题。像如此著名的PHPLib的模板类的效率也不见得就高。2、细节代码优化(1)
上文模板类优化已提到的,正则表达式匹配比一般字符串匹配慢得多,尽可能用字符串匹配而不用正则表达式匹配。有时候虽然用正则表达式匹配使程序代码更简洁,而一般字符串匹配使代码更冗繁,但很多时候字符串匹配仍比正则表达式高效。(2)
字符串替换函数str_replace和preg_replace都是可以接受数组参数的。有时候需要对字符串进行批量替换,则用数组参数比循环调用替换函数来得高效。例如下面的代码:for
($i = 0; $i $n; $i++) {$str = str_replace($search[$i],
$replace[$i], $str);}应该换成:$str = str_replace($search, $replace,

<?
  1  函数ereg的使用示例。
  2  函数eregi()的用法示例。
  3  替换匹配的字符串。
  4  用eregi_repalce()替换匹配字符串。
  5  使用函数split()。
  6  函数split()的使用。
  7  函数sql_regcase()生成正则表达式。
  8  正则表达式函数preg_grep()的用法示例。
  9  用函数preg_match()进行正则表达式匹配。
  10 匹配函数preg_match_all()的应用。
  11 表达式搜索和替换的函数preg_repalce()。
  12 通过正则表达式匹配的串分割字符串。
  13 检查ip地址的正则表达式示例1。
  14 检查ip地址的正则表达式示例2。
  15 匹配中文字符串。
  16 email正则表达式。
  17 url正则表达式。

*/

 // 1、函数ereg的使用示例。
 

 代码如下

$arr_date = array(
‘2004-06-01’,
‘2005-0x-10’,
’12-12-12′,
‘2000-12-25 00:10:20’,
‘2007-12-05’
);

for ($i=0; $i<5; ++$i)
{
 $date = $arr_date[$i];
 if(ereg(“([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})”, $date, $regs))
 {
     echo “日期字符串$date 符合’yyyy-mm-dd’格式:”;
     echo “$regs[1].$regs[2].$regs[3]<br/><br/>”;
 }
 else
 {
     echo “<b>日期字符串$date
不符合’yyyy-mm-dd’格式的日期字符串</b><br/><br/>”;
 }
}

 

 

 // 2、函数eregi()的用法示例。
 

 

 代码如下

$arr_str = array(
‘python’,
‘php’,
‘perl’,
‘ruby’
);

for($i=0; $i<4; ++$i)
{
    $str = $arr_str[$i];
    if(eregi(‘p|h’, $str))
    {
        echo “‘$str’ 含有p、p、h或h<br/><br/>”;
    }
    else
    {
        echo “<b>’$str’ 不含
p、p、h或h</b><br/><br/>”;
    }
   
    if(ereg(‘p’,$str))
    {
        echo “在ereg()中 ‘$str’ 匹配’p'<br/><br/>”;
    }
    else
    {
        echo “<b>在ereg()中 ‘$str’
不匹配’p'</b><br/><br/>”;
    }
}
 

// 3、替换匹配的字符串。

 代码如下

 $str = “1fish2fish3fish4fish5fish”;
echo “<b>替换前字符串为:</b><br/>”;
echo $str;
echo “<br/>”;
echo “<br/>”;

$str_rpc = ereg_replace(“[0-9]”, ” “, $str);
echo “<b>替换后字符串为:</b><br/>”;
echo $str_rpc;

 

 

 // 4、用eregi_repalce()替换匹配字符串。

 

 代码如下

 $str = “you have a car, i have a car, we have cars!”;
echo “<b>替换前字符串为:</b><br/>”;
echo $str;
echo “<br/>”;
echo “<br/>”;

$pattern = “car”;
$replacement = “apple”;
$str_rpc = eregi_replace($pattern, $replacement, $str);
echo “<b>替换后字符串为:</b><br/>”;
echo $str_rpc;
 

// 5、使用函数split()。
 

 代码如下

$str = “aaa~bbb~ccc~ddd”;
echo “字符串截取前:$str”;
echo “<br/>”;
echo “<br/>”;

$sep_arr = split(“~”,$str);
echo “<b>字符串截取后:</b><br/>”;
echo “<pre>”;
print_r($sep_arr);
 

 

 

// 6、函数split()的使用。

 

 代码如下

 $str = “aaaaaaa~bbbbc~dccce~fdddzzz”;
echo “<b>字符串截取前:</b><br/>$str”;
echo “<br/>”;
echo “<br/>”;

$sep_arr = split(“[a-z]{3}”,$str);
echo “<b>使用aaa,bbb,ccc,ddd做分割字符串后:</b>”;
echo “<pre>”;

print_r($sep_arr);
 

// 7、函数sql_regcase()生成正则表达式。
 

 代码如下

$str = “k#v3050”;
echo “<b>原字符串:</b><br/>$str”;
echo “<br/>”;
echo “<br/>”;

$reg_str = sql_regcase ($str);
echo “<b>使用函数sql_regcase()生成的正则表达式为:</b>”;
echo “<br/>”;
echo $reg_str;
 

 

 

// 8、正则表达式函数preg_grep()的用法示例。

 

 代码如下

 $test_preg = array(
“ak47”,
“163.com”,
“happy new year!”,
“ex0000”,
“007 in usa”,
“abc123”,
“test-abc-315”,
“123654789”,
“euapa00!”
);

echo “<b>原数组:</b>”;
echo “<pre>”;
print_r($test_preg);
echo “</pre>”;

$preg_arr = preg_grep(“/^[a-z].*[0-9]$/”,$test_preg);
echo “<br>”;
echo
“<b>将原数组中以任意大写字母开头的、中间任意个字符、最后以数字结尾的字符串找出:</b>”;
echo “<pre>”;
print_r($preg_arr);
echo “</pre>”;
 

// 9、用函数preg_match()进行正则表达式匹配。
 

 代码如下

$str_arr = array(
“php 是优秀的web脚本语言”,
“perl的文本处理功能很强大”
);

foreach($str_arr as $str)
{
    //模式定界符后面的修正符”i” 表示匹配时不区分大小写字母
    if(preg_match(“/php/i”, $str))
    {
        echo “在字符串’ $str ‘中找到对’php’的匹配”;
        echo “<br/>”;
        echo “<br/>”;
    }
    else
    {
        echo “在字符串’ $str
‘中<b>未</b>找到对’php’的匹配”;
        echo “<br/>”;
        echo “<br/>”;
    }
}
 

 

 

// 10、匹配函数preg_match_all()的应用。
 

 

 代码如下

$html = “<b>粗体字符</b><a
href=howdy.html>可点击的连接</a>”;

preg_match_all (“/(<([w]+)[^>]*>)(.*)(</2>)/”,
$html, $matches);

for ($i=0; $i< count($matches[0]); $i++)
{
    echo “匹配:”.$matches[0][$i].” “;;
    echo “第一部分:”.$matches[1][$i].” “;
    echo “第二部分:”.$matches[3][$i].” “;
    echo “第三部分:”.$matches[4][$i].” “;
}
 

// 11、表达式搜索和替换的函数preg_repalce()。

 代码如下

 $string = “the quick brown fox jumped over the lazy dog.”;
echo “原字符串:<br/>”;
echo $string;
echo “<br/><br/>”;

$patterns[0] = “/quick/”;
$patterns[1] = “/brown/”;
$patterns[2] = “/fox/”;

$replacements[2] = “bear”;
$replacements[1] = “black”;
$replacements[0] = “slow”;

$str1 = preg_replace($patterns, $replacements, $string);
echo “使用函数ksort()之前字符串替换为:<br/>”;
echo $str1;
echo “<br/><br/>”;

ksort($patterns);
ksort($replacements);

$str2 = preg_replace($patterns, $replacements, $string);
echo “使用函数ksort()之前字符串替换为:<br/>”;
echo $str2;
echo “<br/><br/>”;
 

 

 

// 12、通过正则表达式匹配的串分割字符串。

 

 代码如下

 $str = ‘php language programming in web’;
echo “<b>原字符串:</b><br>”;
echo $str;
echo “<br/><br/>”;

$chars = preg_split(‘/ /’, $str, -1, preg_split_offset_capture);
echo “<b>调用函数preg_split()后:</b>”;
echo “<pre>”;
print_r($chars);
 

// 13、检查ip地址的正则表达式示例1。

 代码如下

 $arr_ip = array(
“127.0.0.1”,
“218.206.10.123”,
“192.221.515.0”,
“123.0.0.0.1”,
“-12.255.0.10”,
“10.9c.132.69”,
“255.10.10.255”
);

foreach ($arr_ip as $ip)
{
    if(validateip($ip))
    {
        echo “<b>$ip 是正确的ip地址</b>”;
        echo “<br/><br/>”;
    }
    else
    {
        echo “$ip 不是正确的ip地址”;
        echo “<br/><br/>”;
    }
}

function validateip($ip)
{
    $iparray = explode(“.”,$ip);
    for($i=0;$i<count($iparray);$i++)
    {
        if($iparray[$i]>255)
            return (0);
    }
    return
ereg(“[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}”,$ip);
}
 

 

 

// 14、检查ip地址的正则表达式示例2。
 

 

 代码如下

$arr_ip = array(
“127.0.0.1”,
“218.206.10.123”,
“192.221.515.0”,
“123.0.0.0.1”,
“-12.255.0.10”,
“10.9c.132.69”,
“255.10.10.255”
);

foreach ($arr_ip as $ip)
{
    if(validateip($ip))
    {
        echo “<b>$ip 是正确的ip地址</b>”;
        echo “<br/><br/>”;
    }
    else
    {
        echo “$ip 不是正确的ip地址”;
        echo “<br/><br/>”;
    }
}

function validateip($ip)
{
    $iparray = explode(“.”,$ip);
    for($i=0;$i<count($iparray);$i++)
    {
        if($iparray[$i]>255)
            return (0);
    }
    return
ereg(“^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$”,$ip);
}
 

// 15、匹配中文字符串。
 

 代码如下

$str_arr = array(
“iameverysorry”,
“快乐编程,快乐生活”,
“php编程”,
“1997年香港回归”,
“英语学习abc”,
“123456789”
);

$patt_ch = chr(0xa1) . “-” . chr(0xff);

foreach ($str_arr as $str)
{
    echo “字符串’$str’ 是”;
    if (preg_match(“/^[$patt_ch]+$/”, $str))
    {
        echo “<b>完全中文</b>”;
        echo “<br>”;
        echo “<br>”;
    }
    else
    {
        echo “非完全中文”;
        echo “<br>”;
        echo “<br>”;
    }
}
 

 

 

// 16、email正则表达式。
 

 

 代码如下

$str_arr = array(
“mymail@somesite.com”,
“my_mail@somesite.com”,
“my-mail@somesite.com”,
“my.mail@site.com.cn”,
“mymail@site.com.ccoomm”,
“mymail@site.cn”,
“mymail@@@lsite.com”,
“mymail@site”,
“mymail@somesite.com”,
“my2007@somesite.com”,
“163mail_for-me777@somesite.com”,
);

$patt_email =
“/^[_a-za-z0-9-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,4}$/”;

foreach ($str_arr as $str)
{
    echo “字符串’$str’:是”;
    if (preg_match($patt_email, $str))
    {
        echo “<b>合法的email格式</b>”;
        echo “<br>”;
        echo “<br>”;
    }
    else
    {
        echo “不合法的email格式”;
        echo “<br>”;
        echo “<br>”;
    }
}
 // 17、url正则表达式。
 $str_arr = array(
“”,
“mb.111cn.net”,
“”,
“http//down.111cn.net”,
“:www.myoosite.com”
);

$patt_url = “/^(“;

foreach ($str_arr as $str)
{
    echo “字符串’$str’:是”;
    if (preg_match($patt_url, $str))
    {
        echo “<b>合法的url格式</b>”;
        echo “<br>”;
        echo “<br>”;
    }
    else
    {
        echo “不合法的url格式”;
        echo “<br>”;
        echo “<br>”;
    }
}

?>

发表评论

电子邮件地址不会被公开。 必填项已用*标注