PHP 常用方法 (一)

获取当前时间,精确到微秒

1
2
3
4
5
6
7
8
9
10
/**
* 获取当前时间,精确到微秒
*
* @return string
*/
function getCurrentTime()
{
list($usec, $sec) = explode(' ', microtime());
return date('Y-m-d H:i:s', $sec) . substr((float)$usec, 1);
}

递归创建目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 递归创建目录
*
* @param string $dir
* @param int $mode

* @return bool
*/
function recursive_mkdirs($dir, $mode = 0777)
{
if (is_dir($dir) || @mkdir($dir, $mode)) {
return true;
}

if (!mkdirs(dirname($dir), $mode)) {
return false;
}

return @mkdir($dir, $mode);
}

获取指定目录下所有文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* 获取指定目录下所有文件
*
* @param string $dir 指定目录
* @param array $files
*
* @return array
*/
function getAllFiles($dir, &$files)
{
$handle = @opendir($dir);
if ($handle) {
while (($file = readdir($handle)) !== false) {
if ($file != '.' && $file != '..') {
$curPath = $dir . DIRECTORY_SEPARATOR . $file;
if (is_dir($curPath)) {
getAllFiles($curPath, $files);
} else {
$files[] = $curPath;
}
}
}
}
}

递归删除目录和目录下所有文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* 递归删除目录和目录下所有文件
*
* @param string $dir
*/
function recursive_deldirs($dir)
{
$handle = @opendir($dir);
while (($file = readdir($handle)) !== false) {
if ($file != '.' && $file != '..') {
$curPath = $dir . DIRECTORY_SEPARATOR . $file;
if (is_dir($curPath)) {
recursive_deldirs($curPath);
} else {
@unlink($curPath);
}
}
}

if (readdir($handle) == false) {
closedir($handle);
@rmdir($dir);
}
}

过滤emoji表情

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 过滤emoji表情
*
* @param string $str
*
* @return string
*/
function filterEmoji($str)
{
$str = preg_replace_callback('/./u', function (array $match) {
return strlen($match[0]) >= 4 ? '' : $match[0];
}, $str);

return $str;
}

cURL 毫秒级,也可作为异步请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
/**
* curl模拟GET|POST请求
*
* @param string $url 请求地址
* @param array $params 请求参数
* @param array $headers 请求头
* @param bool $isPost 默认post请求
* @param int $timeOut 超时秒数

* @return mixed
*/
function curlRequest($url, $params = [], $headers = [], $isPost = true, $timeOut = 1)
{
if (!preg_match('/^(http|https)/is', $url)) {
$url = 'http://' . $url;
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 忽略证书和host的验证
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

// 超时时间为毫秒级 的话,需要配置 NOSIGNAL
if ($timeOut > 0 && $timeOut < 1) {
$timeOut = (int)($timeOut * 1000);
curl_setopt($ch, CURLOPT_NOSIGNAL, true);
curl_setopt($ch, CURLOPT_TIMEOUT_MS, $timeOut);
} else {
$timeOut = (int)$timeOut;
curl_setopt($ch, CURLOPT_TIMEOUT, $timeOut);
}

// 设置请求头
if (!empty($headers)) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}

// POST请求
if ($isPost) {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
}

$result = curl_exec($ch);
curl_close($ch);

return $result;
}

友好时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
* 友好的时间显示
*
* size = 1, 显示1位,如: 1年、3个月、5天、20小时...
* size = 2, 显示2位,如: 1年1个月、1年3天、5天4小时、2小时25分...
* size = 3, 显示3位,如: 1年1个月4天、1年3天20小时、5天4小时3秒、2小时25分10秒...
* size = 4, 显示4位,如: 1年1个月4天16小时...
* size >= 5, 显示5位,如: 1年1个月4天16小时15分钟...
*
* @param string|DateTime $datetime 日期字符串或日期 DateTime 对象
* @param int $size 精确到位数

* @return string
*/
function friendlyDate($datetime, $size = 1)
{
if (is_string($datetime)) {
$datetime = new DateTime($datetime);
}

$now = new DateTime();
$interval = $now->diff($datetime);
$intervalData = [$interval->y, $interval->m, $interval->d, $interval->h, $interval->i, $interval->s];
$intervalFormat = ['年', '个月', '天', '小时', '分钟', '秒'];
print_r($intervalData);
foreach ($intervalData as $key => $value) {
if ($value) {
$intervalData[$key] = $value . $intervalFormat[$key];
} else {
unset($intervalData[$key]);
unset($intervalFormat[$key]);
}
}

return implode('', array_slice($intervalData, 0, $size));
}

验证字符串是否序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/**
* 验证字符串是否序列化
*
* @param string $string
* @param bool $strict
*
* @return bool
*/
function validateSerialized($string, $strict = true)
{
if (!is_string($string)) {
return false;
}

$string = trim($string);
if ('N;' == $string) {
return true;
}

if (strlen($string) < 4) {
return false;
}

if (':' !== $string[1]) {
return false;
}

if ($strict) {
$lastc = substr($string, -1);
if (';' !== $lastc && '}' !== $lastc) {
return false;
}
} else {
$semicolon = strpos($string, ';');
$brace = strpos($string, '}');
if (false === $semicolon && false === $brace) return false;
if (false !== $semicolon && $semicolon < 3) return false;
if (false !== $brace && $brace < 4) return false;
}

$token = $string[0];
switch ($token) {
case 's' :
if ($strict) {
if ('"' !== substr($string, -2, 1)) {
return false;
}
} elseif (false === strpos($string, '"')) {
return false;
}
case 'a' :
case 'O' :
return (bool)preg_match("/^{$token}:[0-9]+:/s", $string);
case 'b' :
case 'i' :
case 'd' :
$end = $strict ? '$' : '';
return (bool)preg_match("/^{$token}:[0-9.E-]+;$end/", $string);
}

return false;
}
0%