乐趣区

关于php:PHP中的一些杂项函数学习

明天来学习的这些杂项函数在官网文档中都是放在一个杂项扩大中的,其实这些函数都并不是什么什么特地的扩大,也不须要装置什么货色就能够应用,它们就是一些简略的性能函数而已。当然,其中不少内容也是咱们常常会应用的,这里就带大家一起再学习学习。

常量操作

常量的操作置信对于咱们日常应用 PHP 开发的小伙伴来说相对不会生疏。不论是应用框架还是本人写代码,常常会应用到常量相干的内容。

define("A", "Test A");
var_dump(A); // string(6) "Test A"
var_dump(B); // Warning: Use of undefined constant B - assumed 'B'

var_dump(constant('A')); // string(6) "Test A"
var_dump(constant('B')); // NULL
// PHP Warning:  Use of undefined constant B - assumed 'B'   

var_dump(defined('A')); // bool(true)
var_dump(defined('B')); // bool(false)

简略地定义常量就是应用 define() 这个函数,它有两个参数,第一个参数是常量的名称,第二个参数就是常量的值。这里须要留神的是,常量的值只能是标量类型,也就是数字、字符串这类的内容,不能是变量或者对象类型,因为这类型的内容都有随时扭转的可能。

间接应用常量名就能够打印出常量的内容,当然,咱们也能够应用 constant() 这个函数来获取常量的内容,它能够接管字符串类型的参数的常量名。

defined() 这个函数是用于判断指定的常量是否存在,它只比 define() 函数多了一个字母 d,在应用的时候要小心,不要在定义常量的时候多写了这个 d 哦。

对于接口和类来说,也能够在它们的外部应用 const 关键字来定义外部常量。

interface A1{const TEST = 'Test A1';}

class A2{const TEST = 'Test A2';}

var_dump(constant('A1::TEST')); // string(7) "Test A1"
var_dump(constant('A2::TEST')); // string(7) "Test A2"

var_dump(defined('A1::TEST')); // bool(true)
var_dump(defined('A2::TEST')); // bool(true)

外部常量是有作用域范畴的,它们只在类的外部失效。而且在默认状况下,这些常量间接就是动态类型的,不须要咱们再独自增加 static 关键字。

代码高亮及文件格式相干

咱们能够应用一个函数,来让代码实现高亮的成果。其实也就是给指定的代码内容减少了 code 以及一些格局标签。

var_dump(highlight_string('<?php phpinfo(); ?>', true));
// string(195) "<code><span style="color: #000000">
// <span style="color: #0000BB">&lt;?php&nbsp;phpinfo</span><span style="color: #007700">();&nbsp;</span><span style="color: #0000BB">?&gt;</span>
// </span>
// </code>"

highlight_string() 的第二个参数是指定返回的类型,如果咱们不给这个参数的话,它的默认值是 false,这样调用 highlight_string() 时就会间接输入而不是将内容作为返回值返回。也就是说,像 phpinfo() 这类函数一样,它会间接将后果打印进去。

另外,咱们也能够间接对一个文件外面的内容进行高亮操作。

var_dump(highlight_file('1.PHP 中的一些杂项函数学习.php', true));
// string(10610) "<code><span style="color: #000000">
// <span style="color: #0000BB">&lt;?php<br /><br /><br />define</span><span style="color: #007700">(</span><span style="color: #DD0000">"A"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"Test&nbsp;A"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">A</span><span style="color: #007700">);&nbsp;</span><span style="color: #FF8000">//&nbsp;string(6)&nbsp;"Test&nbsp;A"<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">B</span><span style=" ……………………………………

var_dump(show_source('1.PHP 中的一些杂项函数学习.php', true));
// string(10610) "<code><span style="color: #000000">
// <span style="color: #0000BB">&lt;?php<br /><br /><br />define</span><span style="color: #007700">(</span><span style="color: #DD0000">"A"</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">"Test&nbsp;A"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">A</span><span style="color: #007700">);&nbsp;</span><span style="color: #FF8000">//&nbsp;string(6)&nbsp;"Test&nbsp;A"<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">B</span><span style=" ……………………………………

highlight_file() 函数的第一个参数须要的是一个文件的门路,而第二个参数的作用就和 highlight_string() 中的第二个参数的作用是一样的。另外,highlight_file() 还有一个别名函数叫做 show_source()。

除了代码高亮的性能之外,还有一个函数 php_strip_whitespace() 能够帮忙咱们间接去掉代码中的空格和换行以及正文内容。就像压缩代码之类的工具一样。

var_dump(php_strip_whitespace("1.PHP 中的一些杂项函数学习.php"));
// string(570) "<?php
//  define("A", "Test A"); var_dump(A); var_dump(B); var_dump(constant('A')); var_dump(constant('B')); var_dump(defined('A')); var_dump(defined('B')); interface A1{const TEST = 'Test A1';} class A2{const TEST = 'Test A2';} var_dump(constant('A1::TEST')); var_dump(constant('A2::TEST')); var_dump(defined('A1::TEST')); …………………………

工夫操作函数

在杂项函数中,也有一些工夫相干的操作函数,比方零碎运行的工夫。

echo hrtime(true), PHP_EOL; // 2636292334692
print_r(hrtime());
// Array
// (//     [0] => 2636
//     [1] => 292338001
// )

在之前的文章中咱们其实有讲过这个 hrtime() 函数的作用。它返回的是以后操作系统开机到当初通过的工夫,比方我的电脑是早上开机的,从开机到当初只通过了 2636 秒。它返回的是纳秒级别的,如果不加那个布尔类型为 true 的参数的话,它就会以数组的模式返回,0 下标的是秒数,1 下标的是纳秒数。而如果加了 true 参数的话,它就会间接以数字格局返回整体的秒加上纳秒数。

另外一些工夫相干的函数就是暂停程序执行的一些函数,比方咱们常常会用到的 sleep() 函数。

$time = microtime(true);
echo $time, PHP_EOL; // 1609723496.283
sleep(1);
echo microtime(true) - $time, PHP_EOL; // 1.0041399002075
usleep(2000);
echo microtime(true) - $time, PHP_EOL; // 1.0062718391418
time_nanosleep(2, 100000);
echo microtime(true) - $time, PHP_EOL; // 3.0067868232727
time_sleep_until(time()+3); 
echo microtime(true) - $time, PHP_EOL; // 5.7171077728271

sleep() 是以秒为距离暂停程序的执行。而其它的两个函数 usleep() 则是以微秒,time_nanosleep() 是以纳秒来进行暂停的。最初一个 time_sleep_until() 所须要的参数则是暂停到指定的工夫,比方这里咱们指定在三秒后暂停,它须要的参数就是 time() + 3 这个工夫戳。当然,咱们在日常开发中最罕用的还是 sleep() 和 usleep()。这里大家能够当做裁减一下知识点,咱们 PHP 是能够实现纳秒级的暂停的。

生成惟一 ID

生成惟一 ID 这个函数置信不少同学也常常应用,就是那个 uniqid() 函数。不过它的原理和参数你理解嘛?

var_dump(uniqid()); // string(13) "5ff270b0014b4"

var_dump(uniqid('pre_')); // string(17) "pre_5ff270b0014d7"

var_dump(uniqid('pre_', true)); // string(27) "pre_5ff270b0014df3.11521937"

uniqid() 是基于以后工夫微秒数来生成惟一 ID 的,也就说它并不能齐全地保障生成的这个 ID 是惟一的。在超大并发的前提下,很有可能在一微秒内就有多个申请达到,所以也是有可能生成多个反复的 ID 的。

在这种状况,咱们能够通过它的参数来让生成的 ID 更具备的唯一性。第一个参数是能够指定生成 ID 的前缀,对于不同的业务或者不同的负载平衡之后的解决机器咱们就能够应用不同的前缀来进行辨别。第二个参数则是在返回的字符串结尾减少额定的熵,它能够进一步晋升唯一性的可能性。

其它函数

除了下面介绍的那些比拟常见和罕用的函数外,杂项函数中还蕴含其它一些不是那么罕用的内容。

零碎负载

咱们能够通过一个函数 sys_getloadavg() 来查看以后操作系统的负载状况,返回的后果数组对应的就是 Linux 零碎中的 1m、5m 和 15m 的负载状况。

var_dump(sys_getloadavg());
// array(3) {//     [0]=>
//     float(2.98828125)
//     [1]=>
//     float(2.4775390625)
//     [2]=>
//     float(2.341796875)
//   }

执行代码

eval() 这个函数和 JavaScript 中的 eval() 不论名称还是作用都是一样的,能够解析并运行一个字符串中的 PHP 代码。不过须要留神的是,它也是属于危险函数哦。要运行的字符串肯定是咱们本人可控的内容,千万不要运行用户可能上传的内容哦。

eval("echo'123', PHP_EOL;"); // 123

退出中断程序

exit;
die;
exit(0);
exit("End"); // End

exit() 和 die() 不必过多介绍了,它们两个的作用是一样的,能够将 die() 看成是 exit() 的别名。如果在没有参数的状况下,能够省略不写前面的括号。而参数的作用是在中断程序运行后进行输入。如果参数是字符串,则间接输入字符串的内容,如果参数是数字,则相当于是返回程序的运行状态码,和 Linux 中的状态码是一样的概念。

浏览器信息

当咱们应用浏览器拜访的时候,能够通过 get_browser() 函数来取得浏览器的一些信息。

var_dump(get_browser(null, true));
// array(15) {//     ["browser_name_regex"]=>
//     string(108) "~^mozilla/5\.0 \(.*mac os x 10.15.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) .*version/14\.0.* safari/.*$~"
//     ["browser_name_pattern"]=>
//     string(88) "Mozilla/5.0 (*Mac OS X 10?15*) applewebkit* (*khtml*like*gecko*) *Version/14.0* Safari/*"
//     ["parent"]=>
//     string(11) "Safari 14.0"
//     ["platform"]=>
//     string(5) "macOS"
//     ["comment"]=>
//     string(11) "Safari 14.0"
//     ["browser"]=>
//     string(6) "Safari"
//     ["browser_maker"]=>
//     string(9) "Apple Inc"
//     ["version"]=>
//     string(4) "14.0"
//     ["majorver"]=>
//     string(2) "14"
//     ["device_type"]=>
//     string(7) "Desktop"
//     ["device_pointing_method"]=>
//     string(5) "mouse"
//     ["minorver"]=>
//     string(1) "0"
//     ["ismobiledevice"]=>
//     string(0) ""//     ["istablet"]=>
//     string(0) ""//     ["crawler"]=>
//     string(0) ""
//   }

须要留神的是,这个函数须要一个 browscap.ini 文件的反对,能够从 http://browscap.org 这里下载到 browscap.ini 文件,并在 php.ini 文件中指定 browscap 的门路到你下载的这个 browscap.ini 文件。这个函数十分少见,大家理解一下即可。

连贯信息

最初就是对于 PHP 脚本的连贯信息的查看,也就是脚本与客户端的连贯信息的查看。

ignore_user_abort(true);
while(1){
    echo " ";
    if (connection_status()!=0){ob_start();
        var_dump(connection_aborted());
        $v = ob_get_contents();
        ob_end_flush();
        file_put_contents("1.txt", date("Y-m-d H:i:s") . "Connection aborted!" . $v . PHP_EOL, FILE_APPEND);
        exit;
    }
}

// 1.txt
// 2021-01-04 08:56:22 Connection aborted! int(1)

ignore_user_abort() 函数用于设置客户端断开连接时是否中断脚本的执行,当咱们拜访这个测试页面后,马上在浏览器上敞开它,就会触发这个函数。

上面的有限循环代码是用于监控以后连贯的状态,应用的是 connection_status() 这个函数,当它的值为 0 时,也就是 CONNECTION_NORMAL 这个状态是属于失常连贯的状态,而当它不为 0 的时候,咱们就记录到一个日志文件中。connection_aborted() 是判断连贯是否中断的函数,这是一个间接输入流的函数,咱们须要通过 输入输出流 来捕捉它的内容。

最初,当浏览器敞开的时候,连贯相干的内容就记录到了 1.txt 这个文件中。咱们能够查看这个文件外面的信息。

总结

怎么样,明天的内容尽管是 PHP 文档中的杂项扩大,而且内容也的确很杂,但它们有不少内容的确是咱们常常应用的。把握好它们,扩宽本人的眼界,总有一天这些内容会为你带来福报,加油吧,打工人。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/2021/01/source/1.PHP 中的一些杂项函数学习.php

参考文档:

https://www.php.net/manual/zh/book.misc.php

==============

各自媒体平台均可关注【硬核项目经理】

退出移动版