1.任意数目的参数

 // 两个默认参数的函数
function foo($arg1 = '', $arg2 = '') { echo "arg1: $arg1\n";
echo "arg2: $arg2\n"; } foo('hello','world');
/* 输出:
arg1: hello
arg2: world
*/ foo();
/* 输出:
arg1:
arg2: 现在我们来看一看一个不定参数的函数,其使用到了?func_get_args()方法: // 是的,形参列表为空
function foo() { // 取得所有的传入参数的数组
$args = func_get_args(); foreach ($args as $k => $v) {
echo "arg".($k+1).": $v\n";
} } foo();
/* 什么也不会输出 */ foo('hello');
/* 输出
arg1: hello
*/ foo('hello', 'world', 'again');
/* 输出
arg1: hello
arg2: world
arg3: again
*/

2.glob()查找文件

 // 取得所有的后缀为PHP的文件
$files = glob('*.php'); print_r($files);
/* 输出:
Array
(
[0] => phptest.php
[1] => pi.php
[2] => post_output.php
[3] => test.php
)
*/ 你还可以查找多种后缀名 // 取PHP文件和TXT文件
$files = glob('*.{php,txt}', GLOB_BRACE); print_r($files);
/* 输出:
Array
(
[0] => phptest.php
[1] => pi.php
[2] => post_output.php
[3] => test.php
[4] => log.txt
[5] => test.txt
)
*/ 你还可以加上路径: $files = glob('../images/a*.jpg'); print_r($files);
/* 输出:
Array
(
[0] => ../images/apple.jpg
[1] => ../images/art.jpg
)
*/ 如果你想得到绝对路径,你可以调用?realpath() 函数: $files = glob('../images/a*.jpg'); // applies the function to each array element
$files = array_map('realpath',$files); print_r($files);
/* output looks like:
Array
(
[0] => C:\wamp\www\images\apple.jpg
[1] => C:\wamp\www\images\art.jpg
)
*/

3.内存使用查看

echo "Initial: ".memory_get_usage()." bytes \n";
/* 输出
Initial: 361400 bytes
*/ // 使用内存
for ($i = 0; $i < 100000; $i++) {
$array []= md5($i);
} // 删除一半的内存
for ($i = 0; $i < 100000; $i++) {
unset($array[$i]);
} echo "Final: ".memory_get_usage()." bytes \n";
/* prints
Final: 885912 bytes
*/ echo "Peak: ".memory_get_peak_usage()." bytes \n";
/* 输出峰值
Peak: 13687072 bytes
*/

5.CPU使用

print_r(getrusage());
/* 输出
Array
(
[ru_oublock] => 0
[ru_inblock] => 0
[ru_msgsnd] => 2
[ru_msgrcv] => 3
[ru_maxrss] => 12692
[ru_ixrss] => 764
[ru_idrss] => 3864
[ru_minflt] => 94
[ru_majflt] => 0
[ru_nsignals] => 1
[ru_nvcsw] => 67
[ru_nivcsw] => 4
[ru_nswap] => 0
[ru_utime.tv_usec] => 0
[ru_utime.tv_sec] => 0
[ru_stime.tv_usec] => 6269
[ru_stime.tv_sec] => 0
) */ 这个结构看上出很晦涩,除非你对CPU很了解。下面一些解释: ru_oublock: 块输出操作
ru_inblock: 块输入操作
ru_msgsnd: 发送的message
ru_msgrcv: 收到的message
ru_maxrss: 最大驻留集大小
ru_ixrss: 全部共享内存大小
ru_idrss:全部非共享内存大小
ru_minflt: 页回收
ru_majflt: 页失效
ru_nsignals: 收到的信号
ru_nvcsw: 主动上下文切换
ru_nivcsw: 被动上下文切换
ru_nswap: 交换区
ru_utime.tv_usec: 用户态时间 (microseconds)
ru_utime.tv_sec: 用户态时间(seconds)
ru_stime.tv_usec: 系统内核时间 (microseconds)
ru_stime.tv_sec: 系统内核时间?(seconds) 要看到你的脚本消耗了多少CPU,我们需要看看“用户态的时间”和“系统内核时间”的值。秒和微秒部分是分别提供的,您可以把微秒值除以100万,并把它添加到秒的值后,可以得到有小数部分的秒数。 // sleep for 3 seconds (non-busy)
sleep(3); $data = getrusage();
echo "User time: ".
($data['ru_utime.tv_sec'] +
$data['ru_utime.tv_usec'] / 1000000);
echo "System time: ".
($data['ru_stime.tv_sec'] +
$data['ru_stime.tv_usec'] / 1000000); /* 输出
User time: 0.011552
System time: 0
*/ sleep是不占用系统时间的,我们可以来看下面的一个例子: // loop 10 million times (busy)
for($i=0;$i<10000000;$i++) { } $data = getrusage();
echo "User time: ".
($data['ru_utime.tv_sec'] +
$data['ru_utime.tv_usec'] / 1000000);
echo "System time: ".
($data['ru_stime.tv_sec'] +
$data['ru_stime.tv_usec'] / 1000000); /* 输出
User time: 1.424592
System time: 0.004204
*/ 这花了大约14秒的CPU时间,几乎所有的都是用户的时间,因为没有系统调用。 系统时间是CPU花费在系统调用上的上执行内核指令的时间。下面是一个例子: $start = microtime(true);
// keep calling microtime for about 3 seconds
while(microtime(true) - $start < 3) { } $data = getrusage();
echo "User time: ".
($data['ru_utime.tv_sec'] +
$data['ru_utime.tv_usec'] / 1000000);
echo "System time: ".
($data['ru_stime.tv_sec'] +
$data['ru_stime.tv_usec'] / 1000000); /* prints
User time: 1.088171
System time: 1.675315
*/ 我们可以看到上面这个例子更耗CPU。

5.系统常量

__LINE__ 行号
__FIEL__文件
__DIR__目录
__FUNCTION__函数名
__CLASS__类名
__METHOD__方法名
__NAMESPACE__命名空间

6.唯一的ID

有很多人使用md5(time() . mt_rand(1,1000000)); 来生成唯一的ID
其实uniqid()就可以达到目的,而且前几位还是一样的,因为生成器依赖于系统的事件,方便为ID排序
甚至可以添加前缀
// 前缀
echo uniqid('foo_');
/* 输出
foo_4bd67d6cd8b8f
*/

 

  // 有更多的熵

echo uniqid('',true);

/* 输出

4bd67d6cd8b926.12135106

*/

7.序列化

序列化serialize()和反序列化 unserialize()
其实json_encode()和json_decode()可以实现类似的功能

8.字符串压缩

gzcompress() 和 gzuncompress()

9.注册停止函数

当我们的脚本执行完成或意外死掉导致PHP执行即将关闭时,我们的这个函数将会被调用
<?php
$clean = false;
function shutdown_func(){
  global $clean;
  if (!$clean){
    die("not a clean shutdown");
  }
  return false;
}
register_shutdown_function("shutdown_func");
$a = 1;
$a = new FooClass(); // 将因为致命错误而失败,这时会触发注册的停止函数,因为是存储在内存中的,所以没有相对路径可言
$clean = true;
?>

php九个很有用的功能的更多相关文章

  1. ipython, 一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数

    一个 python 的交互式 shell,比默认的python shell 好用得多,支持变量自动补全,自动缩进,支持 bash shell 命令,内置了许多很有用的功能和函数. 若用的是fish s ...

  2. 九个PHP很有用的功能

    1. 函数的任意数目的参数 你可能知道PHP允许你定义一个默认参数的函数.但你可能并不知道PHP还允许你定义一个完全任意的参数的函数 下面是一个示例向你展示了默认参数的函数: // 两个默认参数的函数 ...

  3. 九个很有用的php功能

    1. 函数的任意数目的参数 你可能知道PHP允许你定义一个默认参数的函数.但你可能并不知道PHP还允许你定义一个完全任意的参数的函数 下面是一个示例向你展示了默认参数的函数: 1 2 3 4 5 6 ...

  4. [转]redis-cli的一些有趣也很有用的功能

    本文转至:http://www.tuicool.com/articles/Yvqm2ev http://mdba.cn/category/redis/ redis-cli我们最常用的两个参数就是-h. ...

  5. redis-cli的一些有趣也很有用的功能

    redis-cli我们最常用的两个参数就是-h.-p.-a选项,分配用来指定连接的redis-server的host和port. 通过redis-cli –help发现,redis-cli还提供了其他 ...

  6. XMind十大最有用的功能

    XMind十大最有用的功能 XMind是一款顶级商业品质的思维导图软件和头脑风暴软件,在企业和教育领域都有很广泛的应用,XMind功能全面,易上手,在此小编给大家整理出了XMind十大最有用的功能以供 ...

  7. 在网站开发中很有用的8个 jQuery 效果【附源码】

    jQuery 作为最优秀 JavaScript 库之一,改变了很多人编写 JavaScript 的方式.它简化了 HTML 文档遍历,事件处理,动画和 Ajax 交互,而且有成千上万的成熟 jQuer ...

  8. 对于 Web 开发很有用的 jQuery 效果制作教程

    如果你的项目中需要响应式滑块,炫丽的图片呈现,对话框提示,轻巧动画等效果,jQuery 是完美的解决方案.凭借这个快速,易用的 JavaScript 库,可以轻松处理语言之间的交互,它给人最快速的 W ...

  9. 今日推荐:10款在 Web 开发中很有用的占位图片服务

    设计网站时,将要使用的图像在一开始通常还不存在,这个时候布局是最重要的.然而,图像的尺寸通常是预先设置,实用一些占位图像可以帮助我们更好地预览和分析布局. 如今,有免费的占位图片自动生成工具可以使用, ...

随机推荐

  1. 一、深入学习c++先要练好的内功

    掌握进程虚拟地址空间区域的划分 课程讲的内容建立在x86 32位的Linux系统下. 任何的编程语言会产生两种东西:指令和数据.磁盘上的可执行文件在启动时都会加载到内存当中,但是不会加载到物理内存中, ...

  2. 872. Leaf-Similar Trees - LeetCode

    Question 872. Leaf-Similar Trees Solution 题目大意: 如果两个二叉树的叶子节点相同就认为这两个二叉树相似.给两个二叉树判断是否相似. 思路: 用递归把两个二叉 ...

  3. 推荐一款新框架PyScript:在 HTML 嵌入 Python 代码!

    一.介绍 网页浏览器是目前世界上最普遍,最可携的计算机环境.几乎所有人都可以在计算机或是手机上使用网页浏览器,以没有基础设施障碍的方式访问程序. 在 PyCon US 2022 上,知名 Python ...

  4. 戏说领域驱动设计(廿七)——Saga设计模型

    上一节我们讲解了常用的事务,也提及了Saga,这是在分布式环境下被经常使用的一种处理复杂业务和分布式事务的设计模式.本章我们的主要目标是编写一个简单版本的Saga处理器,不同于Seata框架中那种可独 ...

  5. 《回炉重造 Java 基础》——集合(容器)

    整体框架 绿色代表接口/抽象类:蓝色代表类. 主要由两大接口组成,一个是「Collection」接口,另一个是「Map」接口. 前言 以前刚开始学习「集合」的时候,由于没有好好预习,也没有学好基础知识 ...

  6. 一个恢复CSI挂载信息的解决方法

    一个恢复CSI挂载信息的解决方法 问题描述 之前有做过一个华为OBS 的CSI插件,其基本运作原理如下图所示.CSI插件Pod挂载了主机的/var/lib/kubelet/pods目录,当创建挂载Pv ...

  7. React简单教程-6-单元测试

    前言 我想大部分人的前端测试,都是运行项目,直接在浏览器上操作,看看功能正不正常.虽然明明有测试库可以使用,但是因为"要快"的原因,让好好做测试变成了一件影响效率的事. 因为这种无 ...

  8. ROS基本程序实现

    0.前言 现在介绍ROS基本程序实现的教程有很多,步骤无非就是建工作空间,编译,创建功能包,创建文件和修改CMakeList,之后再编译.运行程序这几步.但是这些教程中很多在文件夹切换的很混乱,导致会 ...

  9. Redis - Redlock算法

    Redis - Redlock算法 在Redis的分布式环境中,我们假设有N个Redis master.这些节点完全互相独立,不存在主从复制或者其他集群协调机制.之前我们已经描述了在Redis单实例下 ...

  10. Conda 虚拟环境移植

    这时候你应该位于具有待移植的环境的服务器: 1 进入你要移植的环境 conda activate your_env 2 导出当前conda环境到某个文件(文件名字可以自定义) conda env ex ...