php循环执行多次效率执行速度例子
在设计的 php 生成静态页面中,静态页面越来越多,在不断的执行生成 html 的过程中,效率越来越慢,所以优化 php 语句就变得刻不容缓了,先检查了自己之前写的 php 生成 html 的程序,原来就是直接的循环,没有附加任何的优化,先看一下夏日博客之前的 PHP 循环语句:
$stat = time(); for($i=1;$i<=10000;$i++){ $strTemp = $strTemp."<option value='".$i."'"; $strTemp=$strTemp.">第".$i."页</option>"; } $end = time(); echo $end-$stat;
这个循环只是把 php 生成静态语句给简化来了,主要了解一下循环生成的效率时间,具体的生成 html 这里就不具体讲解了,可以参看以前夏日博客的文章,这里是使用 php 执行循环 10000 次,如果变成 10000 00 之后呢,循环的速度会越来越慢,echo 出来的秒数也会越来越大,最后的解决方法就是将这段 PHP 循环语句进行简单的改造,如下:
$stat = time(); $strTemp = ''; for($i=1;$i<=10000;$i++){ $strTemp .= "<option value='".$i."'"; $strTemp .= ">第".$i."页</option>"; } $end = time(); echo $end-$stat;
再次运行,不需要一秒的时间,时间效率非常的快,通过两段代码的对比可以看出,第一段是在每执行一次循环再重新赋值,要赋值 10000 次,速度肯定会慢,而第二段代码则是通过 点 的符号将值直接连接成一个字符串,只进行一次赋值就可以了,所以效率很高,我们可以把后面的代码放在任何执行多次的循环语句中,比如 php 生成多条 html 的时候。
实现代码如下:
<?php $Stime=0; $Etime=0; $Ttime=0; $Stime=microtime(true);//获取程序开始执行的时间 //echo $Stime."<br/>"; for ($i=1;$i<=10000000;$i++){} //为了实现有一定的时间差,所以用了一个FOR来消耗一些资源. $Etime=microtime(true);//获取程序执行结束的时间 //echo $Etime."<br/>"; $Ttime=$Etime-$Stime;//计算差值 //echo $Ttime."<br/>"; $str_total=var_export($Ttime,TRUE); if(substr_count($str_total,"E")){ //为了避免1.28746032715E-005这种结果的出现,做了一下处理. $float_total=floatval(substr($str_total,5)); $Ttime=$float_total/100000; } echo $Ttime.'秒'; ?>
百恒开发工程师在对相关函数进行介绍:
microtime() 函数返回当前 Unix 时间戳和微秒数。
var_export() 函数返回关于传递给该函数的变量的结构信息,它和 var_dump() 类似,不同的是其返回的表示是合法的 PHP 代码。
substr_count() 函数计算子串在字符串中出现的次数。
备注:南昌网站制作公司工程师提醒广大开发人员:$Stime=microtime(true);要放在页面的首要位置,$Etime=microtime(true);要放页面的未位置,否则计算不出时间.
linux需开启zlib。下面是具体的开启方法
1. 下载安装zlib
http://www.gzip.org/zlib/
解压tar包,进入目录执行命令:
./configure && make && make install
2. 添加php扩展,命令如下:
[root@Ansen zlib]# pwd
/root/lnmp/php-5.3.0/ext/zlib #php源码包目录
[root@Ansen zlib]#mv config0.m4 config.m4
[root@Ansen zlib]#/usr/local/php5/bin/phpize
[root@Ansen zlib]#./configure --with-php-config=/usr/local/php/bin/php-config
[root@Ansen zlib]#make
[root@Ansen zlib]# cp modules/zlib.so /usr/local/php/lib/php/extension/ #php扩展目录
[root@Ansen zlib]#vi /usr/local/php5/lib/php.ini
添加extension=zlib.so
3.重启apache
php 在线压缩打包rar代码
<?php
$filename = "./zip/" . date ( 'YmdH' ) . ".zip"; // 生成的压缩包名称(含路径)
// 生成文件
$zip = new ZipArchive (); // linux需开启zlib,
if ($zip->open ( $filename, ZIPARCHIVE::CREATE ) !== TRUE) {
exit ( '无法打开文件,或者文件创建失败' );
}
$fileNameArr = array('/upload/20140606/20140606011813-0.jpg','/upload/20140606/20140606013717-0.jpg');
foreach ( $fileNameArr as $val ) {
$zip->addFile ( $val, basename ( $val ) ); // 第二个参数是放在压缩包中的文件名称,要检查一下文件是否已经有了
}
$zip->close (); // 关闭
//发送到浏览器提示下载;
header ( "Cache-Control: max-age=0" );
header ( "Content-Description: File Transfer" );
header ( 'Content-disposition: attachment; filename=' . basename ( $filename ) ); // 文件名
header ( "Content-Type: application/zip" ); // zip格式的
header ( "Content-Transfer-Encoding: binary" ); // 告诉浏览器,二进制文件
header ( 'Content-Length: ' . filesize ( $filename ) ); // 告诉浏览器,文件大小
readfile ( $filename );//输出文件;
?>
<?php header("Content-type: text/html; charset=utf-8"); /** * 将字符串转换成二进制 * @param type $str * @return type */ function StrToBin($str){ //1.列出每个字符 $arr = preg_split('/(?<!^)(?!$)/u', $str); //2.unpack字符 foreach($arr as &$v){ $temp = unpack('H*', $v); $v = base_convert($temp[1], 16, 2); unset($temp); } return join(' ',$arr); } /** * 讲二进制转换成字符串 * @param type $str * @return type */ function BinToStr($str){ $arr = explode(' ', $str); foreach($arr as &$v){ $v = pack("H".strlen(base_convert($v, 2, 16)), base_convert($v, 2, 16)); } return join('', $arr); } echo StrToBin("php二次开发:www.111cn.net");; echo '<br/>'; echo BinToStr("1110000 1101000 1110000 111001001011101010001100 111001101010110010100001 111001011011110010000000 111001011000111110010001 111011111011110010011010 1110111 1110111 1110111 101110 1110000 1101000 1110000 110010 101110 1100011 1100011");字符串截取我们这里有简单的办法,通常如果只对于简单的可以使用substr函数了,如果要删除字符串中的字符我们也可以使用substr函数了,下面来看看。
修复了一个获取控制器名称方法的bug
控制器的名称都是使用act结尾,使用过程中要删除act。
1。原来的方法
//使用替换act的方法获取控制器名称,很显然当控制器的名称出现act三个字符的时候都会被替换掉产生bug $actName = str_replace( 'act', '', 'ad_client_contactact');
控制器名称 ad_client_cont
2。修复后的方法
//从结尾删除三个字符串
$actName = substr('ad_client_contactact',0,-3);
控制器名称ad_client_contact
1、从第4个字符开始截取到字符串末尾,类似asp中的left:
<?php $str = "www。icoa。cn"; echo substr($str,4); ?> 输出: icoa。cn
2、PHP substr函数从右边截取3个字符,类似asp中的right:
<?php $str = "www。icoa。cn"; echo substr($str,-3); ?> 输出:。cn
3、PHP substr函数从第4个字符开始截取3个字符:
<?php $str = "www。icoa。cn"; echo substr($str,4,3); ?> 输出:ico
4、有时我们知道一个字符串的开始和结尾,中间是不定长的字符,这时除了用PHP substr函数的正则外我们还可以用substr实现(当然要得到中间的字符方法有N种,在此只是举例substr的应用):
本例去掉开头4个字符和结尾3个字符,输出中间的字符串:
<?php $str = "www。icoa。cn"; echo substr($str,4,-3); ?> 输出:icoa
5、对中文看看
$a="直的、竖的、横的、方的、" $a=substr($a,0,-1); 输出结果为:直的、竖的、横的、方的
6、查找指定字符串并删除
$a = "abcababa"; $count=strpos($a,"ab"); $str=substr_replace($a,"",$count,2); 输出结果:cababa
代码虽短,但也算是一个小算法!
7、删除字符串中任何字符的函数
function delStr($start, $end, $orgenStr) { //读取要删除字符位置的前一部分字符串,并赋值给$temp //strpos读取字符第一次出现的位置 //substr读取指定开始与结束位置的子字符串 //echo $before."—". $last; $temp=$orgenStr; while(strpos($temp, $start) && strpos($temp, $end)){ $temp=substr($temp, 0, strpos($temp, $start)).substr($temp,strpos($temp, $end)+strlen($end));; //读取要删除字符位置的后一部分字符串,然后将前后部分连接,并赋值给$temp //返回最后是字符串 } return $temp; } //应用实例 $a="aaaa12345678bbbbtttttttttttttttttttttaaaa12345678bbbb kkkkkkkkkkkkaaaa12345678bbbbttttttttttttttttttttt"; $b="1234"; $c="5678"; echo delStr($b,$c,$a);接口签名现在在应用开发中我们通常会用到了,像做支付接口时就必须要用到接口签名了,我们下面来看一个简单的在app应用中的接口签名实现原理了。
接口开发是各系统之间对接的重要方式,其数据是通过开放的互联网传输,对数据的安全性要有一定要求。为了提高传输过程参数的防篡改性,签名sign的方式是目前比较常用的方式。
我这里介绍一种方式,是目前国内互联网公司常用的一种方式,其中淘宝的支付宝支付接口、淘宝开放平台接口、腾讯开放平台等应用的一种方式。
一、签名参数sign生成的方法
第1步: 将所有参数(注意是所有参数),除去sign本身,以及值是空的参数,按参数名字母升序排序。
第2步: 然后把排序后的参数按参数1值1参数2值2…参数n值n(这里的参数和值必须是传输参数的原始值,不能是经过处理的,如不能将"转成”后再拼接)的方式拼接成一个字符串。
第3步: 把分配给接入方的验证密钥key拼接在第2步得到的字符串前面。
第2步: 在上一步得到的字符串前面加上验证密钥key(这里的密钥key是接口提供方分配给接口接入方的),然后计算md5值,得到32位字符串,然后转成大写.
第4步: 计算第3步字符串的md5值(32位),然后转成大写,得到的字符串作为sign的值。
举例:
假设传输的数据是/interface.php?sign=sign_value&p2=v2& p1=v1&method=cancel&p3=&pn=vn(实际情况最好是通过post方式发送),
其中sign参数对应的sign_value就是签名的值。
第一步,拼接字符串,首先去除sign参数本身,然后去除值是空的参数p3,剩下p2=v2&p1=v1&method=cancel& amp;pn=vn,然后按参数名字符升序排序,method=cancel&p1=v1&p2=v2&pn=vn.
第二步,然后做参数名和值的拼接,最后得到methodcancelp1v1p2v2pnvn
第三步,在上面拼接得到的字符串前加上验证密钥key,我们假设是abc,得到新的字符串abcmethodcancelp1v1p2v2pnvn
第四步,然后将这个字符串进行md5计算,假设得到的是abcdef,然后转为大写,得到ABCDEF这个值即为sign签名值。
注意,计算md5之前请确保接口与接入方的字符串编码一致,如统一使用utf-8编码或者GBK编码,如果编码方式不一致则计算出来的签名会校验失败。
二、签名验证方法:
根据前面描述的签名参数sign生成的方法规则,计算得到参数的签名值,和参数中通知过来的sign对应的参数值进行对比,如果是一致的,那么就校验通过,如果不一致,说明参数被修改过。
例子
代码如下 | 复制代码 |
<?php //header('Content-Type: text/xml; charset=utf-8'); include_once(dirname(dirname(__FILE__)).DIRECTORY_SEPARATOR.'phpsec'.DIRECTORY_SEPARATOR.'Math'.DIRECTORY_SEPARATOR.'BigInteger.php'); include_once(dirname(dirname(__FILE__)).DIRECTORY_SEPARATOR.'phpsec'.DIRECTORY_SEPARATOR.'Crypt'.DIRECTORY_SEPARATOR.'AES.php'); include_once(dirname(dirname(__FILE__)).DIRECTORY_SEPARATOR.'phpsec'.DIRECTORY_SEPARATOR.'Crypt'.DIRECTORY_SEPARATOR.'RSA.php'); //密文 $crypttext = 'v66YKULHFld2JElhm/J9qik2Edr1JHdZIc/k/OesU2GbTX2usXyvF4jGvzvoihrrE8FsfKmllmjsMIjO5fdrS/FD20bYFii4JW3BO3bzshXmz6AEs2DWwG4sK9mNojfOC0IsMoV311X5/JlgUoQXkDy4F5HHpYE9d/xGb0g2XE/hnGSSy2cpQcvQtBlBmixwSckNhsEG92lovlOz8ULwkqG5o7x+qB7P/EMII/WaFAXBJXDXvZX7lmGcOgon6wLhKJLGXorP6BIxOg6LGc6Ux7BAt3i9+0lujNgxIq/sDsl23hsr3yOUpV5C5a813nrHx4HJyd/hBT1UvIUml+eTmJwWCpSfs2cvxIUr0CE57JAZVyXjK13shK3IsZHLPPsm/JcDCrdy0Co/d5uIGJAdzXdsQ56xsju+tlvnA1J6yq2tDIfYK/x6k911A5WXLKYxztD1nq+bTYN3Gv/WFfrzVtgWQBrh06ihS2cwvna0S9EV/YPmhnAjJmrX4trNr9NXQ9xaZaW4lGRg87U5QDV+nQjj1THk0XHFc69N9g2+DsAGyEs9tK6U0ZQ72hJZqZhBCDH1UKw0PLyIhJdxpgPPOWGp8/QVVU2julTeKunvgAAEc3n+GoZfqjsCDi1S6T2MTnjWYWNoFRBhvEZFD/revgpasTOzDQa5NqR1B+mUF70r6uw6MWLJ7cT9Tz3jq+CA'; $aeskey = base64_decode('qZe60QZFxuirub2ey4+7+Q=='); //AES解密,采用ECB模式 $aes = new Crypt_AES(CRYPT_MODE_ECB); //设置AES密钥 $aes->setKey($aeskey); //解密AES密文 $plaintext = $aes->decrypt(base64_decode($crypttext)); echo $plaintext; echo '<hr />'; //AES加密明文 //echo $aes->encrypt($plaintext); //rsa公钥 $publickey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCffOeIVYut9jW5w1L5uKX4aDvd837a8JhaWm5S8YqNQfgEmfD9T+rDknXLqMT+DXeQAqGo4hBmcbej1aoMzn6hIJHk3/TfTAToNN8fgwDotHewsTCBbVkQWtDTby3GouWToVsRi1i/A0Vfb0+xM8MnF46DdhhrnZrycERBSbyrcwIDAQAB'; //echo base64_decode($publickey); //rsa签名 $signature = 'XHin4uUFqrKDEhKBD/hQisXLFFSxM6EZCvCPqnWCQJq3uEp3ayxmFuUgVE0Xoh4AIWjIIsOWdnaToL1bXvAFKwjCtXnkaRwUpvWrk+Q0eqwsoAdywsVQDEceG5stas1CkPtrznAIW2eBGXCWspOj+aumEAcPyYDxLhDN646Krzw='; //echo base64_decode($signature); $rsa = new Crypt_RSA(); //设置RSA签名模式 CRYPT_RSA_SIGNATURE_PSS or CRYPT_RSA_SIGNATURE_PKCS1 $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); //var_dump($rsa->createKey()); //生成RSA公钥、私钥 //extract($rsa->createKey()); //使用RSA私钥生成签名 //$rsa->loadKey($privatekey); //$signature = $rsa->sign($plaintext); //使用RSA公钥验证签名 echo $plaintext; $rsa->loadKey(base64_decode($publickey)); echo $rsa->verify($plaintext, base64_decode($signature)) ? 'verified' : 'unverified'; echo '<hr />'; //生成RSA公钥、私钥 //var_dump($rsa->createKey()); extract($rsa->createKey()); //使用RSA私钥加密数据 $rsa->loadKey($privatekey); $ciphertext = $rsa->encrypt($plaintext); //使用RSA公钥解密数据 $rsa->loadKey($publickey); echo $rsa->decrypt($ciphertext); |
相关文章
- 安装curl扩展支持https是非常的重要现在许多的网站都使用了https了,下面我们来看一篇关于PHP安装curl扩展支持https例子吧。 问题: 线上运行的lamp服务器,默认yu...2016-11-25
- 关于mysql效率优化一般通过以下两种方式定位执行效率较低的sql语句。通过慢查询日志定位那些执行效率较低的 SQL 语句,用 --log-slow-queries[=file_name] 选项启动时, mysqld 会 写一个包含所有执行时间超过 long_quer...2015-11-08
- floor会产生小数了如果我们不希望有小数我们是可以去除小数点的了,下面一聚教程小编来为各位介绍php使用floor去掉小数点的例子,希望对各位有帮助。 float floor (...2016-11-25
- 这篇文章主要介绍了python基于opencv检测程序运行效率,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-05-09
- 这篇文章主要介绍了如何用Node.js编写内存效率高的应用程序,对Node.js感兴趣的同学,可以参考下...2021-05-01
- 在本篇文章里小编给大家分享的是一篇关于mysql事务对效率的影响分析总结内容,有需要的朋友们可以跟着学习下。...2021-10-24
- 下面我们来看一篇关于纯Css实现下拉菜单的简单例子,希望这篇文章能够给各位同学带来帮助,具体步骤如下. 大家可能会经常用到hover这属性,用hover实现鼠标经过的颜...2017-01-22
- JavaScript数组去重是前端面试酷爱的问题,问题简单而又能看出程序员对计算机程序执行过程的理解如何。数组去重的方法有很多,到底哪种是最理想的我不清楚。于是我测试了下数组去重的效率。测试二十万个数据,随着数据越多效率很明显的就体验了出来。下面来一起看看吧。...2016-10-25
- 这篇文章主要为大家详细的介绍了Redis高效的原因以及分析了Redis高效的数据结构,有需要的朋友可以借鉴参考下,希望能够有所帮助...2021-09-27
- 在php中日期对比用得比较多了,还有一个日期加减也用到不少,下面我拿两个例子来给大家介绍在php中日期操作方法吧,希望文章能给你带来帮助 功能需求 文章发布时段操...2016-11-25
- 本例子不是读取Excel或生成新的Excel,而是读取现有的Excel文件,然后修改Excel中的数据,就像修改mysql中数据一样的哦。 代码如下 ...2016-11-25
- 正则提取图片中的地址我们介绍过很多的相关文章了,下面再来给各位介绍一个可以提取内容中第一张图片的例子,希望对各位有帮助。 代码如下 复制代码 ...2016-11-25
- 最近看到博客留言的头像有点别扭,因为游客的头像都是同一个头像,看着不是很舒服。虽然现在绝大多数的主题集成了Gavatar头像功能,先不说gavatar被墙的问题,我自己现在都没...2016-11-25
- CuPy是一个开源矩阵库,使用NVIDIA CUDA加速。CuPy使用Python提供GPU加速计算。CUPY使用CUDA相关库,包括 CuBLAS、CUDNN、Curand、CuoSver、CuPaSeSE、Cufft和NCCL,以充分利用GPU架构...2021-11-10
- 关于$i++与++$i是什么区别了,下面来看看这些区别的分别。 <?php 方式一: $begin = time(); $i = 0; while(++$i < 10000) { $j = 0; while(++$j < 10000)...2016-11-25
- 在遇到数据之间的联系很复杂,建表就很纠结,到底该怎么去处理这些复杂的数据呢,是单表查询,然后在业务层去处理数据间的关系,还是直接通过多表连接查询来处理数据关系呢...2021-09-27
- php判断字符串是否包含另一个字符串的实现方法有许多的办法,像我们在网上一搜索可看到大量关于字符是否包含指定字符的方法,下面我把这些实用的例子整理一起与大家分享...2016-11-25
- date函数是php中一个非常好用的日期获取函数了,我们可以使用它来获取指定日期或者当前日期了,下面我来简单的介绍一下date函数用法与常用用法吧。 PHP星期几获取代...2016-11-25
php中 strtr 和 str_replace 的效率问题
下面小编就为大家带来一篇关于php中 strtr 和 str_replace 的效率问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 在网上看了...2017-07-06哪款手机快充技术最快安全省心呢?全球TOP5手机快充速度对比
目前来说,处理器芯片厂商一般都会内置快充技术方案。比如说主流的有高通家的Quick Charge 3.0、联发科的Pump Express Plus以及华为SuperCharge。哪款手机快充技术最快安全省心呢?下面为大家带来全球TOP5手机快充速度对比,来看看吧...2017-07-06