首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
182 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
30
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
560
篇与
的结果
2023-08-07
编写更高性能的PHP代码
编写更高性能的PHP代码PHP4.2版本以后,使用mt_rand() 代替rand()函数2.使用echo代替printfor结构可以这样写for ($i=0, $j = count($citys); $i < $j ; $i++)4.挂起进程的三个函时顺函数nanosleep, usleep, sleep.5.include, include_one, require, require_once包含文件的时候,尽量使用绝对路径。比如define('DOCUMNET_ROOT', dirname(__FILE__));require DOCUMENT_ROOT . '/common.inc';6.尽量避免使用str_replace(),尤其是preg_replace()6.1, stripos(‘http://’, $website)比preg_match(‘/http:\/\//i’, $website)快.6.2, ctype_alnum()比preg_match(‘/^\s*$/’);快6.3, if ($test == (int)$test)比preg_match(‘/^\d*$/)快6.4, if (!strncasecmp(“foo_”, “FoO_”, 4))比if (preg_match(“!^foo_!i”, “FoO_”))快6.5, if (strpbrk(“a8f9″, “sometext”))比if (preg_match(“![a8f9]!”, “sometext”))快.7.不要使用$row[id],应该使用$row['id']8.尽量少用错误抑制符(@)。除非特别情况,比如:$success = db_query("INSERT INTO users (uid, name) VALUES (2, 't')");if (!$success) { db_query("UPDATE users SET name = 't' WHERE uid = 2");}9.不要泛滥地使用global 变量,尤其要避免使用global 变量来替代local变量使用is_file()的效率比file_exists()更高11.通过&引用访问多维数组<?php$a'b' = array();// slow 2 extra hash lookups per accessfor($i = 0; $i < 5; $i++) { $a['b']['c'][$i] = $i;}// much faster reference based approach$ref =& $a'b';for($i = 0; $i < 5; $i++) {$ref[$i] = $i;}
2023年08月07日
35 阅读
0 评论
0 点赞
2023-08-07
一些PHP Coding Tips(php小技巧)
一些PHP Coding Tips(php小技巧)使用list来实现一次获取explode后的特定段值:list( , $mid) = explode(';', $string);使用NULL === 来代替is_null:is_null和 NULL === 完全是一样的效果, 但是却节省了一次函数调用.使用===尽量不用==:PHP有俩组相等比较运算符===/!==和==/!=, ==/!=会有隐式类型转换,而===/!==会严格比较俩个操作时是否类型相同并且值相等.我们应该尽量使用===而不是==, 除了因为转换规则比较难记以外, 还有一点就是如果使用===, 对于日后的维护或者阅读你代码的人也会很舒服:”在这个时刻, 这一行语句, 这个变量就是这个类型的!”.少用/不用 continue:continue是回到循环的头部, 而循环结束本来就是回到循环的头部, 所以通过适当的构造, 我们完全可以避免使用这条语句, 使得效率得到改善.警惕switch/in_array等的松比较(loose comparision):switch和in_array都是采用松比较, 所以在要比较的变量之间类型不一样的时候, 很容易出错:复制代码 代码如下:switch ($name) {case "laruence":...break;case "eve":...break;}对于上面的switch, 如果$name是数字0, 那么它会满足任何一条case. 同理在in_array中也是.解决的办法就是, 在switch之前, 把变量类型转换成你所期望的类型.复制代码 代码如下:switch (strval($name)) {case "laruence":...break;case "eve":...break;}而, in_array提供了第三个可选的参数, 通过这个参数可以改变默认的比较方式.switch不仅仅只用来判别变量:比如, 对于如下的一段代码:复制代码 代码如下:if($a) {} else if ($b) {} else if ($c || $d) {}可以简单的改写为:复制代码 代码如下:switch (TRUE) {case $a:break;case $b:break;case $c:case $d:break;}是不是看起来更清晰呢?变量先定义后使用:使用一个未定义的变量, 比使用一个定义好的变量要慢8倍以上!可以相像, PHP引擎会首先按照正常的逻辑来获取这个变量, 然而这个变量不存在, 所以PHP引擎需要抛出一个NOTICE, 并且进入一段使用未定义变量时应该走的逻辑, 然后返回一个新的变量.另外, 阅读代码的角度讲, 当你使用一个未定义的变量时, 会让阅读你代码的人困惑:”这个变量在那里初始化的, 和之前的代码有关系么? 和include进来的文件有关系么?”最后, 从规范编程的角度来讲, 你也需要这样做.不用第三变量交换俩个变量的值:list($a, $b) = array($b, $a),但其实还是有匿名临时变量的产生, 对于整数来说, 采用互逆的运算来做, 还是比较靠谱:复制代码 代码如下:$a = $a + $b;$b = $a - $b;$a = $a - $b;不过, 还是用异或比较好, 因为+ – * /容易产生精度丢失或者溢出.floor == 俩次非运算(此条由skiyo提供)复制代码 代码如下:echo ~~4.9;echo floor(4.9);用俩次非运算的速度基本上是floor的3倍, 不过有一点, 对于大数来说, 可能会发生溢出:复制代码 代码如下:echo ~~99999999999999.99; //276447231echo floor(99999999999999.99); //99999999999999do{}while(0)妙用(此条由Qianfeng提供)我们知道do{}while(0)在c/c++中, 有很多妙用, 比如消除goto, 宏定义代码块.所以, PHP中同理, 也可以用do{}while(0)来做一些巧妙的应用复制代码 代码如下:do{if(true) {break;}if(true) {break;}} while(false);//好过if(true) {} else if(true) {} else {}尽量少用@错误抑制符如下代码:复制代码 代码如下:@func();就相当于(参见深入理解PHP原理之错误抑制与内嵌HTML):复制代码 代码如下:$report = error_reporting(0);func();error_reporting($report);另外错误抑制符号, 可能会造成一些问题, 参看(http://www.fengfly.com);最后,错误抑制符在发生错误调试的时候也可能会带来麻烦.尽量避免使用递归(此条来自lazyboy)递归性能堪忧, 而大部分的递归都是尾递归, 都是可以消除的.复制代码 代码如下:function f($n) {if ($n = 0) return 1;return $n * f($n - 1);}//变为:$result = 1;for ($y = 1; $y < $n + 1; $y++ ) {$result *= $y;}使用$_SERVER['REQUEST_TIME']代替time()time()会引来一次函数调用, 而如果对时间的精确值要求不高, 可以使用$_SERVER['REQUEST_TIME']代替, 快很多.避免在for判断条件中做运算(此条来自留言的Anonymous)如下的代码:for($i=0; $i<strlen($str); $i++) {}会导致每次循环都调用strlen, 改为for ($i=0, $j=strlen($str); $i<$j; $i++) {}尽量避免使用正则(此条来自pangyontao)正则耗时, 尽量避免, 而采用直接的字符串处理函数代替, 如:复制代码 代码如下:if (preg_match("!^foo_!i", "FoO_")) { }// 替换为:if (!strncasecmp("foo_", "FoO_", 4)) { }if (preg_match("![a8f9]!", "sometext")) { }// 替换为:if (strpbrk("a8f9", "sometext")) { }if (preg_match("!string!i", "text")) {}// 替换为:if (stripos("text", "string") !== false) {}等等.用大括号括起在双引号和heredoc中的变量如下的代码:echo "$name[2]";PHP不知道程序员的意图是$name . “[2]“还是$name[2],所以建议, 都加上大括号:复制代码 代码如下:echo "{$name}[2]";//或者echo "${name}[2]";用FALSE表示错误, 用NULL表示不存在.对于操作类的函数, 失败返回FALSE, 表示”操作失败了”, 而对于查询类的函数, 如果找不到想要的值, 则应该返回NULL, 表示”找不到”.
2023年08月07日
16 阅读
0 评论
0 点赞
2023-08-07
php 静态变量
php 静态变量什么是静态变量? 静态变量是指 用static声明的变量,这种变量与局部变量的区别是,当静态变量离开了它的作用范围后,它的值不会自动消亡,而是继续存在,当下次再用到它的时候,可以保留最近一次的值。 下面举例:<?php function add() { static $i=0; $i++; echo $i; } add(); echo " "; add(); ?>这段程序中,主要定义了一个函数add(),然后分两次调用add()。如果用局部变量的方式来分工这段代码,两次的输出应该都是1。但实际输出却是1和2。这是因为,变量i在声明的时候被加上了一个修饰符static,这就标志着i变量在add()函数内部就是一个静态变量了,具备记忆自身值的功能,当第一次调用add时,i由于自加变成了1,这个时候,i就记住自己不再是0,而是1了,当我们再次调用add时,i再一次自加,由1变成了2。由此,我们就可以看出静态变量的特性了。
2023年08月07日
14 阅读
0 评论
0 点赞
2023-08-07
PERL(PCRE)和POSIX模式正则区别
PERL(PCRE)和POSIX模式正则区别POSIX 是 UNIX 遵循的标准, UNIX 的命令如 grep、sed 能用的正则是 POSIX。PERL 正则在 POSIX 上做了扩展,实现了很多方便的功能。举个匹配数字的例子,Perl 用 \d,POSIX 用 [0-9](POSIX 老版本,现在也有 \d 了)。POSIX 里面还有“类”的概念,比如 [:digit:] 用来匹配数字, Perl 原先没有,后来支持 POSIX,也能用了。再举个例子,Perl 里面的正则 a.b 和 a.?b,匹配的对象是不一样的。a.b 实现最长匹配,a.?b 实现最短匹配,用这两个表达式匹配字符串"a 1b 2b",第一个的匹配结果是 "a 1b 2b",第二个的匹配结果是 "a 1b"。PHP同时使用两套正则表达式规则,一套是由电气和电子工程师协会(IEEE)制定的POSIX Extended 1003.2兼容正则(事实上PHP对此标准的支持并不完善),另一套来自PCRE(Perl Compatible Regular Expression)库提供PERL兼容正则,这是个开放源代码的软件,作者为 Philip Hazel。使用POSIX兼容规则的函数有:ereg_replace()ereg()eregi()eregi_replace()split()spliti()sql_regcase()mb_ereg_match()mb_ereg_replace()mb_ereg_search_getpos()mb_ereg_search_getregs()mb_ereg_search_init()mb_ereg_search_pos()mb_ereg_search_regs()mb_ereg_search_setpos()mb_ereg_search()mb_ereg()mb_eregi_replace()mb_eregi()mb_regex_encoding()mb_regex_set_options()mb_split()使用PERL兼容规则的函数有:preg_grep()preg_replace_callback()preg_match_all()preg_match()preg_quote()preg_split()preg_replace()定界符:POSIX兼容正则没有定界符,函数的相应参数会被认为是正则。PERL兼容正则可以使用任何不是字母、数字或反斜线(\)的字符作为定界符,如果作为定界符的字符必须被用在表达式本身中,则需要用反斜线转义。也可以使用(),{},[] 和 <> 作为定界符修正符:POSIX兼容正则没有修正符。PERL兼容正则中可能使用的修正符(修正符中的空格和换行被忽略,其它字符会导致错误):i (PCRE_CASELESS):匹配时忽略大小写。m(PCRE_MULTILINE):当设定了此修正符,行起始(^)和行结束($)除了匹配整个字符串开头和结束外,还分别匹配其中的换行符(\n)的之后和之前。s(PCRE_DOTALL):如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。x(PCRE_EXTENDED):如果设定了此修正符,模式中的空白字符除了被转义的或在字符类中的以外完全被忽略。e:如果设定了此修正符,preg_replace() 在替换字符串中对逆向引用作正常的替换,将其作为 PHP 代码求值,并用其结果来替换所搜索的字符串。 只有 preg_replace() 使用此修正符,其它 PCRE 函数将忽略之。A(PCRE_ANCHORED):如果设定了此修正符,模式被强制为“anchored”,即强制仅从目标字符串的开头开始匹配。D(PCRE_DOLLAR_ENDONLY):如果设定了此修正符,模式中的行结束($)仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,也会被匹配在里面。如果设定了 m 修正符则忽略此选项。S:当一个模式将被使用若干次时,为加速匹配起见值得先对其进行分析。如果设定了此修正符则会进行额外的分析。目前,分析一个模式仅对没有单一固定起始字符的 non-anchored 模式有用。U(PCRE_UNGREEDY):使“?”的默认匹配成为贪婪状态的。X(PCRE_EXTRA):模式中的任何反斜线后面跟上一个没有特殊意义的字母导致一个错误,从而保留此组合以备将来扩充。默认情况下,一个反斜线后面跟一个没有特殊意义的字母被当成该字母本身。u(PCRE_UTF8):模式字符串被当成UTF-8。逻辑区隔:POSIX兼容正则和PERL兼容正则的逻辑区隔符号作用和使用方法完全一致:[]:包含任选一操作的相关信息。{}:包含匹配次数的相关信息。():包含一个逻辑区间的相关信息,可被用来进行引用操作。|:表示“或”,[ab]和a|b是等价的。元字符与“[]”相关:有两组不同的元字符:一种是模式中除了方括号内都能被识别的,还有一种是在方括号“[]”内被识别的。POSIX兼容正则和PERL兼容正则“[]之外”“一致”的元字符:\ 有数种用途的通用转义符^ 匹配字符串的开头$ 匹配字符串的结尾? 匹配0或者1匹配 0 个或多个前面指定类型的字符匹配 1 个或多个前面指定类型的字符POSIX兼容正则和PERL兼容正则“[]之外”“不一致”的元字符:. PERL兼容正则匹配除了换行符外的任意一个字符. POSIX兼容正则匹配任意一个字符POSIX兼容正则和PERL兼容正则“[]之内”“一致”的元字符:\ 有数种用途的通用转义符^ 取反字符,但仅当其为第一个字符时有效指定字符ASCII范围,仔细研究ASCII码,你会发现[W-c]等价于[WXYZ\^_`abc]POSIX兼容正则和PERL兼容正则“[]之内”“不一致”的元字符:POSIX兼容正则中[a-c-e]的指定会抛出错误。PERL兼容正则中[a-c-e]的指定等价于[a-e]。匹配次数与“{}”相关:POSIX兼容正则和PERL兼容正则在匹配次数方面完全一致:{2}:表示匹配前面的字符2次{2,}:表示匹配前面的字符2次或多次,默认都是贪婪(尽可能多)的匹配{2,4}:表示匹配前面的字符2次或4次逻辑区间与“()”相关:使用()包含起来的区域是一个逻辑区间,逻辑区间的主要作用是体现出一些字符出现的逻辑次序,另一个用处就是可以用来引用(可以将此区间内的值引用给一个变量)。后一个作用比较奇特:<?php$str = "http://www.163.com/";// POSIX兼容正则:echo ereg_replace("(.+)","\1",$str);// PERL兼容正则:echo preg_replace("/(.+)/","
2023年08月07日
15 阅读
0 评论
0 点赞
2023-08-07
PHP 序列化变量的 4 种方法
PHP 序列化变量的 4 种方法序列化是将变量转换为可保存或传输的字符串的过程;反序列化就是在适当的时候把这个字符串再转化成原来的变量使用。这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性。serialize和unserialize函数这两个是序列化和反序列化PHP中数据的常用函数。 $a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut'); //序列化数组 $s = serialize($a); echo $s; //输出结果:a:3:{s:1:"a";s:5:"Apple";s:1:"b";s:6:"banana";s:1:"c";s:7:"Coconut";} echo ''; //反序列化 $o = unserialize($s); print_r($o);当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用base64_encode和base64_decode。PHP代码$obj = array();//序列化$s = base64_encode(serialize($obj));//反序列化$original = unserialize(base64_decode($s));但是base64编码将增加字符串的长度。为了克服这个问题,可以和gzcompress一起使用。//定义一个用来序列化对象的函数 function my_serialize( $obj ) { return base64_encode(gzcompress(serialize($obj))); } //反序列化 function my_unserialize($txt) { return unserialize(gzuncompress(base64_decode($txt))); }json_encode 和 json_decode使用JSON格式序列化和反序列化是一个不错的选择:使用json_encode和json_decode格式输出要serialize和unserialize格式快得多。JSON格式是可读的。JSON格式比serialize返回数据结果小。JSON格式是开放的、可移植的。其他语言也可以使用它。$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut'); //序列化数组 $s = json_encode($a); echo $s; //输出结果:{"a":"Apple","b":"banana","c":"Coconut"} echo ''; //反序列化 $o = json_decode($s);在上面的例子中,json_encode输出长度比上个例子中serialize输出长度显然要短。var_export 和 evalvar_export 函数把变量作为一个字符串输出;eval把字符串当成PHP代码来执行,反序列化得到最初变量的内容。$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut'); //序列化数组 $s = var_export($a , true); echo $s; //输出结果: array ( 'a' => 'Apple', 'b' => 'banana', 'c' => 'Coconut', ) echo ''; //反序列化 eval('$my_var=' . $s . ';'); print_r($my_var);wddx_serialize_value 和 wddx deserializewddx_serialize_value函数可以序列化数组变量,并以XML字符串形式输出。$a = array('a' => 'Apple' ,'b' => 'banana' , 'c' => 'Coconut'); //序列化数组 $s = wddx_serialize_value($a); echo $s; //输出结果(查看输出字符串的源码):<header/>ApplebananaCoconut echo ''; //反序列化 $o = wddx_deserialize($s); print_r($o);//输出结果:Array ( [a] => Apple => banana 1 => Coconut )可以看出,XML标签字符较多,导致这种格式的序列化还是占了很多空间。结论上述所有的函数在序列化数组变量时都能正常执行,但运用到对象就不同了。例如json_encode序列化对象就会失败。反序列化对象时,unserialize和eval将有不同的效果。
2023年08月07日
13 阅读
0 评论
0 点赞
1
...
95
96
97
...
112