Deprecated
: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in
/www/wwwroot/testblog.58heshihu.com/var/Widget/Archive.php
on line
1057
首页
关于
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
篇文章
累计收到
28
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
31
篇与
的结果
2023-08-11
100 个最常用的 PHP 函数
100 个最常用的 PHP 函数下面的列表是最常用的前 100 个 PHP 函数:它们是最常用的 PHP 中自带的函数。这些函数被命名使用,并从 1 到 100 进行排序。 其他的 4500 个函数现在还没在排名中。 下面频率列表表示在 PHP 代码中使用此函数的频率:参考资料来自于 1900 个 PHP 开源项目。 他们使用了 Exakat static analysis engine 静态分析引擎的 1.2.5 版本进行了审核。平均值是在一个项目中调用此函数的次数。有些函数是被封装使用的,而另一些则是主要函数。比如说,5 个项目里面有 4 个用到了 count 函数,函数被调用大概 150 次。说明它很流行且被大量使用。单击函数名跳转到 PHP 文档。在 Top 100 文章的底部有一些总结见解。排行 函数 频率 平均值1 count 81.41 % 147.672 is_array 77.32 % 117.863 substr 74.62 % 142.924 in_array 74.16 % 79.555 explode 73.19 % 71.516 str_replace 72.32 % 101.057 implode 72.27 % 66.598 strlen 70.07 % 98.329 array_merge 69.46 % 64.0110 strpos 67.98 % 78.1811 preg_match 67.31 % 76.6012 sprintf 67.16 % 119.4613 trim 66.75 % 81.2814 strtolower 65.99 % 59.6215 file_exists 65.12 % 45.1316 is_string 61.39 % 45.1017 preg_replace 60.27 % 54.2818 file_get_contents 59.96 % 20.7119 array_key_exists 59.70 % 57.5020 array_keys 59.35 % 39.5921 dirname 56.44 % 54.8422 function_exists 53.58 % 42.6223 array_map 53.22 % 19.4524 get_class 53.12 % 33.0725 class_exists 52.50 % 23.1326 is_object 51.94 % 35.3527 time 51.79 % 41.4228 json_encode 51.48 % 24.8129 date 50.72 % 52.1830 is_null 49.69 % 60.5231 is_numeric 49.49 % 40.6932 array_shift 49.49 % 23.2833 defined 48.72 % 86.8234 is_dir 48.57 % 22.8635 json_decode 48.42 % 17.3936 header 48.16 % 59.7137 strtoupper 47.80 % 30.9538 array_values 47.24 % 17.2739 md5 46.88 % 23.7440 method_exists 46.73 % 19.0541 file_put_contents 46.68 % 12.4942 rtrim 45.91 % 18.0843 array_pop 45.51 % 20.6044 unlink 44.59 % 23.5545 basename 44.59 % 27.2346 realpath 44.08 % 15.9047 call_user_func 43.97 % 16.4148 call_user_func_array 43.92 % 18.4049 fopen 43.77 % 25.6150 microtime 43.46 % 14.4151 fclose 42.85 % 28.3652 is_int 42.75 % 15.7853 is_file 42.08 % 20.5254 array_slice 41.83 % 13.2055 preg_match_all 40.55 % 14.6656 ucfirst 40.25 % 17.0257 intval 40.19 % 88.1358 str_repeat 40.14 % 19.5159 serialize 40.14 % 22.0560 array_filter 39.99 % 13.8761 mkdir 39.79 % 11.1762 is_callable 39.43 % 11.9463 ltrim 39.17 % 10.9064 ob_start 39.12 % 13.2665 round 39.07 % 28.5666 fwrite 38.97 % 23.3967 array_unique 38.87 % 15.9668 array_search 38.82 % 14.1969 reset 38.71 % 20.7970 array_unshift 38.10 % 10.3271 parse_url 37.90 % 9.6172 func_get_args 37.79 % 28.3373 end 37.49 % 12.7074 base64_encode 37.39 % 14.1575 unserialize 37.18 % 18.3576 max 36.98 % 22.8877 preg_split 36.98 % 13.2778 gettype 36.93 % 16.1679 strrpos 36.67 % 11.9580 version_compare 36.67 % 14.8781 array_push 36.67 % 26.1882 floor 36.11 % 18.7883 strtotime 36.01 % 27.9484 htmlspecialchars 35.96 % 51.0885 ini_get 35.85 % 19.2586 ini_set 35.60 % 14.4987 chr 35.34 % 186.9788 extension_loaded 35.29 % 14.1789 is_bool 35.24 % 11.4490 ksort 34.98 % 10.8291 array_reverse 34.93 % 8.2792 ord 34.73 % 53.1793 uniqid 34.68 % 9.8394 strtr 34.47 % 12.9095 array_diff 34.32 % 11.1396 error_reporting 34.17 % 8.9997 ceil 33.35 % 11.9998 urlencode 33.30 % 29.6399 min 32.69 % 18.31100 print_r 32.64 % 14.12前 100 分析最常用的 PHP 函数是字符串函数,然后是数组函数,接着是文件函数。 (运算函数不在此列主要是因为他们通常基于运算符)每个函数的链接都指向其对应的文档,事实上许多函数经过发展以及获得了许多新特性,例如:count() 的第二个参数,dirname() 的第二个参数以及 preg_match() 和 str_replace() 接受数组作为参数等。有很多彩蛋。以上 100 个函数没有近期要废弃的计划。在非内置库中,mbstring 排名第一、curl 第二,然后是 gd、filter 和 iconv。md5 是最常用的加密函数,其次是 Sha1 (#147)。print_r 出现在 1/3 的项目代码里面的某处,任何地方 ...由于 dirname(dirname(dirname())) 的调用,dirname 的使用频率非常高。array、echo、print、empty、isset 这些没有纳入此排名,它们的使用度肯定是非常高的。如下几个函数应该用运算符替代 : array_push, is_object, func_get_arg, chr, call_user_func。相当多的调用是为了知道值的类型。数据库函数没有在这里排名:他们经常使用类,但功能仍然很频繁。可能是另一个前 100 名?相比写入文件 PHP 更多的应用于读取文件。它还解码 base64。使用键排序比使用值或使用键更频繁。通常使用 file_get_contents 读取文件,使用 fwrite 写入文件。后记如果你正在学习 PHP,最好回顾一下这里排名的 100 个功能。它们是你加入一个编码团队后最常找到的功能。它们不是唯一的,但遇到它们时你会不那么惊讶。PHP 函数
2023年08月11日
13 阅读
0 评论
0 点赞
2023-08-10
PHP中的pack和unpack函数
PHP中的pack和unpack函数PHP有两个重要的冷门函数:pack和unpack。在网络编程,读写图像文件等场景,这两个函数几乎必不可少。鉴于文件读写/网络编程,或者说字节流处理的重要性,掌握这两个函数是迈向高级PHP编程的基础。本文先介绍字节和字符的区别,说明两个函数存在的必要性和重要性。然后介绍基本用法和使用场景,让读者对其有大体了解,为实际使用中奠定基础。字节和字符PHP的优势是简单易用,熟练运用 字符串 和 数组 相关函数就能抗住一般的需求。日常工作中多用到字符串,所以PHP开发对字符都比较熟悉,稍微资深点基本能也能弄清字符编码。但字符的伴生概念:字节,不少PHP开发并不知晓/熟悉。这不怪他们。PHP世界里极少出现“字节(流)”的概念:没有byte关键字(当然也没有char),官方文档也没提字节;没有原生的数组支持(常用的array其实是hashtable);当然字符串(string)能表达其他语言中的字节数组(Byte Array, byte[])。字节和字符有什么联系和区别呢?简单来说字节是计算机存储和操作的最小单位,字符是人们阅读的最小单位;字节是存储(物理)概念,字符是逻辑概念;字节代表数据(内涵和本质),字符代表其含义;字符由字节组成。举几个例子说明两者区别:“中国”包含2个字符,GBK编码表示需要4个字节,UTF-8编码需要6个字节;数字“1234567890”,包含10个字符,用int32类型表示只需4个字节;下面的图片占用42582个字节,用字符表示是“我老婆”,只占用3个字符:再举一个常用的例子说明字符和字节的区别。开发中我们常用md5算法获取数据的哈希值,算法返回一个128位(bit)的数据(16个字节)。为方便查看其值,人们约定成俗地用十六进制表示,结果就是我们熟知的32位长度的字符串(不区分大小写)。32长度字符串不是md5算法的必然结果,16字节数据才是其本质。如果你愿意,可以用一个小于2^128的数字表示哈希结果,也可以将16字节base64编码后作为其结果。所以常用的32位哈希值与md5返回的16字节关系为:一个是字符表示,另一个则是其本质(字符数组)(PHP的md5函数第二个参数值为true便可得到16字节数据,或hash函数第三个参数为true)。相关概念还有字节序、字符编码等,本文不做展开。感兴趣的读者可参考本人之前的博客“文件和字符编码”或相关材料。引言PHP中专门处理字符串的函数有几十个,加上正则、时间等函数,字符串处理的函数不下百个。相比之下字节处理门庭冷落,相关函数寥寥无几。除了常用的ord/chr,哈希加密函数返回的原始字节、openssl库的openssl_random_pseudo_bytes等函数真正处理或返回 字节外,最重要的两个字节处理函数是pack和unpack。本节从问题引出pack函数的使用。问题考虑一个简单的问题:宇宙的终极答案42在内存中是如何表示的(或者说怎么获取其字节数组)?因为42是一个整数,根据硬件不同,其占用字节大小可能为1, 2, 4, 8等。这里我们限定一个整数占用4个字节,于是问题的等价表述为:怎样将一个整数转换成字节数组(本机序,4个字节)?分析因为是多字节,所以要考虑字节序的问题。42不超过255,只占用一个字节,故而其他三个字节都是0。据此得到结论:如果是大端序(低位字节存放在地址高位),四个字节分别是:0 0 0 42;如果是小端序,结果则是:42 0 0 0。那怎么知道机器的字节序呢?PHP没有提供相关功能,也不能像C语言直接取地址访问字节数据。无所不能的PHP该怎么搞定字节序,或者说完成数据向字节的转换?方案PHP应用层面,数据向字节(数组)的转换是pack的专场,字节(数组)向数据的转换则是unpack的专场。除这两个函数,字节数组(或二进制数据)向数据的转换几无可能(如果有请不吝指教)。现在我们用pack函数获取42在内存中的字节数组。相关代码如下:function intToBytes(int $num) : string {return pack("l", $num);}function outputBytes(string $bytes) {echo "bytes: "; for ($i = 0; $i < strlen($bytes); ++ $i) { echo ord($bytes[$i]), " "; } echo PHP_EOL;}outputBytes(intToBytes(42));// 程序输出:bytes: 42 0 0 0本人计算机用的英特尔的CPU,x86架构是小端序,所以程序输出符合预期。延伸一下,怎么判断机器的字节序?有了pack函数,答案非常简单:function bigEndian() : bool {$data = 0x1200; $bytes = pack("s", $data); return ord($bytes[0]) === 0x12;}调用函数便返回本机是否大端序。上述是pack函数简单的使用场景,接下来分别介绍pack和unpack函数。pack和unpackpack函数pack是“打包/封包”的意思。如其名,pack函数的工作是将数据按照格式打包成字节数组。函数原型为:pack ( string $format [, mixed $… ] ) : string形式上与printf系列函数相同:第一个参数是格式字符串,其余参数是要格式化的参数。不同之处在于pack函数的格式中不能出现元字符和量词外的其他字符,所以不需要%符号。上文的例子中使用了”l”和”s”两个格式化元字符,pack函数的元字符主要分为三类:字符串:a、A等;将数据转成字符串,功能上与sprintf类似,例如整数32转换成字符串”32″;字节:h和H;对字节进行16进制编码,区别在于低位还是高位在前,功能上与dechex等函数类似;char/short/int/long/float/double六种基本类型:c/s/i/l等;将数据转换成对应类型的字节数组,除char类型外(暂)没有其他函数可替代;注意:char和a/A等的区别是a/A等输入为字符(串),而’s/S’的输入要求是小于256的整数,输入字符会得到0。量词比较简单:数字和”“两种。例如”i2″表示将两个参数按照整数转换,”c“表示后续都按照char类型转换。unpackunpack是pack的反向操作:将字节数组解析成有意义的数据。其函数原型为:unpack ( string $format , string $data [, int $offset = 0 ] ) : arrayunpack函数需要注意的是第一个参数和返回值。返回值好理解,pack函数相当于将除格式化参数外的参数数组(想象成call_user_func_array的参数)变成一个字节数组;unpack做相反的事情:释放数据,得到输入时的参数数组。返回一个数组,其键分别是什么呢?这便是格式化参数($format)在pack和unpack的不同之处:unpack应该对释放出来的数据命名,用”/”分隔各组数据。由于格式化参数允许有非元字符和量词外的字符,为了区分数据,不同数据间的”/”分隔符必不可少。一个例子:$bytes = pack("iaa*", 42, ":", "The answer to life, the universe and everything");outputBytes($bytes);$result = unpack("inumber/acolon/a*word", $bytes);print_r($result);// 程序输出:bytes: 42 0 0 0 58 84 104 101 32 97 110 115 119 101 114 32 116 111 32 108 105 102 101 44 32 116 104 101 32 117 110 105 118 101 114 115 101 32 97 110 100 32 101 118 101 114 121 116 104 105 110 103Array([num] => 42 [colon] => : [word] => The answer to life, the universe and everything)如果不对释放出来的数据命名会怎么样?例如上例中unpack的格式化参数为:“i/a/a*”,结果是什么呢?其结果为:Array([1] => The answer to life, the universe and everything)为何?官方文档上如是说:Caution If you do not name an element, numeric indices starting from 1 are used. Be aware that if you have more than one unnamed element, some data is overwritten because the numbering restarts from 1 for each element.翻译过来就是:如果你不对数据命名,默认的1, 2, 3…就用来当作键值。如果有多组数据,每组都用同样的下标,会导致数据覆盖。所以能理解 “i/a/a*” 为何只剩最后一组数据了吧?应用场景读取图像、word/excel文件,解析binlog、二进制ip数据库文件等场合,pack和unpack几乎必不可少。本文举例说一下pack和unpack在网络编程时协议解析的用途。假设我们的tcp包格式为:前四个字节表示包大小,其余字节为数据内容。于是客户(发送)端的send函数可以长这样:public function send($data) { // 这里假设$data已经做了序列化、加密等操作,是字节数组 // 计算报文长度,封装报文 $len = strlen($data); $header = pack("L", $len); // 转换成网络(大端)序 $header = xxx // 封包 $binary = $header . $data; // 调用fwrite/socket_send等将数据写入内核缓冲区 ...}服务(接收)端根据协议解析接收到的数据流:public function decodable($session, $buffer) { $dataLen = strlen($buffer); // 非法数据包 if ($dataLen < 4) {// 关闭连接、记录ip等 .... return NOT_OK;} // 获取前四个字节 $header = substr($buffer, 0, 4); // 转换成主机序 $header = xxx // 解析数据长度 $len = unpack("L", $header); // 单个报文不能超过8M,例如限制上传的图像大小 if ($len > 8 1024 1024) {// 关闭连接等 return NOT_OK;}// 检查数据包是否满足协议要求 if ($dataLen - 4 >= $len) {return OK;} // 数据未全部到达,继续等待 return NEED_DATA;}通过pack和unpack,我们顺利的处理报文协议和二进制字节流的发送和解析。如果你用\n作为报文分隔符,pack和unpack也许用不到。但在网络通讯中直接传递字符毕竟少数(相当于明文传送),大多数情况下的二进制数据流的解析还是要靠pack和unpack。总结除分配内存,最重要的系统调用莫过于文件读写和网络连接,而两者的本质操作对象都是字节流。pack和unpack为PHP提供了底层字节操作的能力,在二进制数据处理中十分有用。有志于跳出web编程的PHP开发应该都要掌握这两个函数。参考文件和字符编码PHP Manual: packPHP Manual: unpackHandling binary data in PHP with pack() and unpack()PHP: 深入pack/unpack
2023年08月10日
13 阅读
0 评论
0 点赞
2023-08-10
PHP控制缓存输出之ob系列函数详解
PHP控制缓存输出之ob系列函数详解ob,输出缓冲区,是output buffering的简称,而不是output cache。ob用对了,是能对速度有一定的帮助,但是盲目的加上ob函数,只会增加CPU额外的负担ob的基本原则:如果ob缓存打开,则echo的数据首先放在ob缓存。如果是header信息,直接放在程序缓存。当页面执行到最后,会把ob缓存的数据放到程序缓存,然后依次返回给浏览器。基本作用下面我说说ob的基本作用:1)防止在浏览器有输出之后再使用setcookie()、header()或session_start()等发送头文件的函数造成的错误。其实这样的用法少用为好,养成良好的代码习惯。2)捕捉对一些不可获取的函数的输出,比如phpinfo()会输出一大堆的HTML,但是我们无法用一个变量例如$info=phpinfo();来捕捉,这时候ob就管用了。3)对输出的内容进行处理,例如进行gzip压缩,例如进行简繁转换,例如进行一些字符串替换。4)生成静态文件,其实就是捕捉整页的输出,然后存成文件。经常在生成HTML,或者整页缓存中使用。对于刚才说的第三点中的GZIP压缩,可能是很多人想用,却没有真用上的,其实稍稍修改下代码,就可以实现页面的gzip压缩。代码如下:ob_start(ob_gzhandler);要缓存的内容没错,加一个ob_gzhandler这个回调函数就可以了,不过这么做有些小问题,一是需要zlib支持,二是没有判断浏览器是否支持gzip(现在好像都支持,iphone浏览器好像都支持了)。以前的做法是判断一下浏览器是否支持gzip,然后用第三方的gzip函数来压缩ob_get_contents() 的内容,最后echo。';ob_start();echo 'level 2';ob_start();echo 'level 3';ob_end_flush();ob_end_flush();ob_end_flush();很明显,结果为:level 1level 2level 3当程序修改一下,修改一个ob_end_flush() 变成 ob_end_clean() 成为以下这个,你觉得结果会是怎样呢?附上这几个函数的讲解:ob_clean — 清空(擦掉)输出缓冲区ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲ob_end_flush — 冲刷出(送出)输出缓冲区内容并关闭缓冲ob_flush — 冲刷出(送出)输出缓冲区中的内容ob_start — 打开输出控制缓冲';ob_start();echo 'level 2';ob_start();echo 'level 3';ob_end_clean();//修改处ob_end_flush();ob_end_flush();结果:level 1level 2可能你会认为ob_end_clean()会清除与他最近的ob_start()的输出;其实这个说法不是很全面,看下面的例子';ob_start();echo 'level 2';ob_start();echo 'level 3';ob_end_clean(); //第一次修改ob_end_flush();ob_end_clean(); //第二次修改这次,什么都没有输出来。中间不是有一个ob_flush()吗?按理来说应该是输出 level2 的。其实造成这样的主要原因是输出的多级缓冲机制。这个程序例子有三个ob_start(),就意味着他有3个缓冲区A,B,C,而其实php程序本身也有一个最终输出的缓冲区,我们就把他叫做F。在这个程序中他这几个缓冲区是有一定层次的,C->B->A->F,F层次最高,是程序最终的输出缓冲,我们按上面的程序来进行讲解。刚开始。 F:nullob_start();新建缓冲区A。 A: null -> F:nullecho 'level 1';程序有输出,输出进入最低的缓冲区A A: 'level 1' -> F:nullob_start();新建缓冲区B 。 B:null -> A: 'level 1' -> F:nullecho 'level 2';程序有输出,输出进入最低的缓冲区B B:'level 2' -> A: 'level 1' ->F:nullob_start();新建缓冲区C C:null B:'level 2' A: 'level 1' -> F:nullecho 'level 3';程序有输出,输出进入最低的缓冲区C C:'level 3' -> B:'level 2' -> A: 'level 1' -> F:nullob_end_clean(); //第一次修改缓冲区C被清空并关闭。 B:'level 2' -> A: 'level 1' -> F:nullob_end_flush();缓冲区B输出到上一级的缓冲区A并关闭。 A: 'level 1level 2' -> F:nullob_end_clean(); //第二次修改缓冲区A被清空并关闭。 此时缓冲区A的东西还没真正输出到最终的F中,因此也就整个程序也就没有任何的输出了。ob其他的函数还有很多,但只要能懂得这些机理应该也是不难懂的。附上其余函数ob_start(); //打开一个输出缓冲区,所有的输出信息不再直接发送到浏览器,而是保存在输出缓冲区里面。ob_clean(); //删除内部缓冲区的内容,不关闭缓冲区(不输出)。ob_end_clean(); //删除内部缓冲区的内容,关闭缓冲区(不输出)。ob_get_clean(); //返回内部缓冲区的内容,关闭缓冲区。相当于执行 ob_get_contents() and ob_end_clean()ob_flush(); //发送内部缓冲区的内容到浏览器,删除缓冲区的内容,不关闭缓冲区。ob_end_flush(); //发送内部缓冲区的内容到浏览器,删除缓冲区的内容,关闭缓冲区。ob_get_flush(); //返回内部缓冲区的内容,并关闭缓冲区,再释放缓冲区的内容。相当于ob_end_flush()并返回缓冲区内容。flush(); //将ob_flush释放出来的内容,以及不在PHP缓冲区中的内容,全部输出至浏览器;刷新内部缓冲区的内容,并输出。ob_get_contents(); //返回缓冲区的内容,不输出。ob_get_length(); //返回内部缓冲区的长度,如果缓冲区未被激活,该函数返回FALSE。ob_get_level(); //Return the nesting level of the output buffering mechanism.ob_get_status(); //Get status of output buffers.ob_implicit_flush(); //打开或关闭绝对刷新,默认为关闭,打开后ob_implicit_flush(true),所谓绝对刷新,即当有输出语句(e.g: echo)被执行时,便把输出直接发送到浏览器,而不再需要调用flush()或等到脚本结束时才输出。ob_gzhandler //ob_start回调函数,用gzip压缩缓冲区的内容。ob_list_handlers //List all output handlers in useoutput_add_rewrite_var //Add URL rewriter valuesoutput_reset_rewrite_vars //Reset URL rewriter values这些函数的行为受php_ini设置的影响:output_buffering //该值为ON时,将在所有脚本中使用输出控制;若该值为一个数字,则代表缓冲区的最大字节限制,当缓存内容达到该上限时将会自动向浏览器输出当前的缓冲区里的内容。output_handler //该选项可将脚本所有的输出,重定向到一个函数。例如,将 output_handler 设置为 mb_output_handler() 时,字符的编码将被修改为指定的编码。设置的任何处理函数,将自动的处理输出缓冲。implicit_flush //作用同ob_implicit_flush,默认为Off。1、使 header() 函数前可以有echo代码Output Control 函数可以让你自由控制脚本中数据的输出。它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况。输出控制函数不对使用 header() 或 setcookie(),发送的文件头信息产生影响,只对那些类似于 echo() 和 PHP 代码的数据块有作用。ob_start(); //打开缓冲区echo "Hello\n"; //输出header(“location:index.php”); //把浏览器重定向到index.phpob_end_flush(); //输出全部内容到浏览器所有对header()函数有了解的人都知道,这个函数会发送一段文件头给浏览器,但是如果在使用这个函数之前已经有了任何输出(包括空输出,比如空格,回车和换行)就会提示出错。如果我们去掉第一行的ob_start(),再执行此程序,我们会发现得到了一条错误提示:"Header had all ready send by"!但是加上ob_start,就不会提示出错,原因是当打开了缓冲区,echo后面的字符不会输出到浏览器,而是保留在服务器,直到你使用flush或者ob_end_flush才会输出,所以并不会有任何文件头输出的错误!2、保存 phpinfo() 函数的输出ob_start(); //打开缓冲区phpinfo(); //使用phpinfo函数$info = ob_get_contents(); //得到缓冲区的内容并且赋值给$info$file = fopen('info.txt', 'w'); //打开文件info.txtfwrite($file, $info); //写入信息到info.txtfclose($file); //关闭文件info.txt3、静态模版技术所谓静态模版技术就是通过某种方式,使得用户在client端得到的是由PHP产生的html页面。如果这个html页面不会再被更新,那么当另外的用户再次浏览此页面时,程序将不会再调用PHP以及相关的数据库,对于某些信息量比较大的网站,例如sina、163、sohu。类似这种的技术带来的好处是非常巨大的。ob_start(); //打开缓冲区php页面的全部输出$content = ob_get_contents(); //取得php页面输出的全部内容$fp = fopen("output00001.html", "w"); //创建一个文件,并打开,准备写入fwrite($fp, $content); //把php页面的内容全部写入output00001.html,然后……fclose($fp);注意事项:1、一些Web服务器的output_buffering默认是4069字符或者更大,即输出内容必须达到4069字符服务器才会flush刷新输出缓冲,为了确保flush有效,最好在ob_flush()函数前有以下语句:print str_repeat("", 4096); //以确保到达output_buffering值2、ob_* 系列函数是操作PHP本身的输出缓冲区,所以ob_flush只刷新PHP自身的缓冲区,而flush是刷新apache的缓冲区。所以,正确使用俩者的顺序是:先ob_flush,然后flush。ob_flush是把数据从PHP的缓冲中释放出来,flush是把缓冲内/外的数据全部发送到浏览器。3、不要误认为用了ob_start()后,脚本的echo/print等输出就永远不会显示在浏览器上了。因为PHP脚本运行结束后,会自动刷新缓冲区并输出内容。
2023年08月10日
17 阅读
0 评论
0 点赞
2023-08-09
PHP处理json的注意点
PHP处理json的注意点代码说明:<?php $json=json_encode($messagebody,JSON_UNESCAPED_UNICODE);//把数据转换成json格式时要加 JSON_UNESCAPED_UNICODE参数,不要把中文转换成 unicode $data =file_get_contents('php://input', 'r'); $data=ltrim($data,"\XEF\XBB\XBF");//去bom $json=json_decode($data,false,512,JSON_BIGINT_AS_STRING); //解析json时,记得加 JSON_BIGINT_AS_STRING参数,把大数字转为字符串,防止传入大的数字而解析不完整。 if (json_last_error() === JSON_ERROR_NONE) { //json格式检查 //没错误可以继续了 } else { //不是一个json格式,记录错误日志 $mmsg=json_last_error_msg(); error_log('not a json:'.$mmsg."\n".$data."\n",3,'errorjson.log'); }
2023年08月09日
10 阅读
0 评论
0 点赞
2023-08-09
关于PHP的回调函数及事件回调的用法
关于PHP的回调函数及事件回调的用法PHP的回调机制,是通过使用 call_user_func(call_user_func_array)实现的。回调函数可以很好地将一些功能从核心功能剥离开。回调机制类似于一种通知机制,在异步编程中经常用到。 就是 我让你做一件事情,你做好了,通过我提供的接口通知我。代码如下。<?php//php 回调函数示例class Callback{public function call(callable $Callback,$args) { call_user_func($Callback, $args);//核心实现 }}$Callback = new Callback();$Callback->call(function ($success) {//传入回调函数,这里以匿名函数实现,也可以传入函数名,或对象的方法名等echo "call $success" ;},999);//call 999//下面再看一个事件回调的示例,利用观察者模式,在事件编程中经常用到。class Event{public $eventMap = array(); function on($evtname , callable $callable ){ //注册一个事件上的响应回调函数 $this->eventMap[$evtname][]=$callable; } function trigger($evtname , $args=null){ //触发一个事件,也就是循环调用所有响应这个事件的回调函数 foreach ($this->eventMap[$evtname] as $key => $value) { call_user_func_array( $this->eventMap[$evtname][$key] , $args); } }}$MyClass = new Event();$MyClass->on('post' , function($a , $b ){echo " a = $a ; \n "; echo " b = $b ; \n "; echo " a + b = ".( $a + $b) . ";\r\n ";} );$MyClass->on('post' , function($a , $b ){echo " a = $a ; \n "; echo " b = $b ; \n "; echo " a * b = ".( $a * $b) . ";\r\n ";} ); $MyClass->trigger('post' , array( 123 , 321 ) );//触发事件 //a = 123 ; //b = 321 ; //a + b = 444;//a = 123 ; //b = 321 ; //a * b = 39483;
2023年08月09日
14 阅读
0 评论
0 点赞
1
...
4
5
6
7