随机字符串在Web 开发中用得非常广泛,比如生成用户身份认证令牌等,随机字符串一般是由大小写字母和数字等组成,长度可以自定义。
PHP 原生提供了rand() 和 mt_rand() 函数,可以用来生成伪随机数,但是生成的数值有一定的规律性,不足以被作为随机字符串使用。
为此,PHP 提供了更为强大的函数 random_bytes() 和 random_int(),它们使用真正的随机数生成器,生成的随机数可以更好的保证安全性。
PHP 7 以前的版本没有提供 random_bytes() 函数,需要通过扩展或外部库实现。可以使用 OpenSSL 扩展或 Mcrypt 扩展来生成随机字节串。
使用 OpenSSL 扩展
要使用 OpenSSL 扩展,首先要安装 OpenSSL 库和 PHP 的 OpenSSL 扩展。可以使用以下命令来检查系统是否已经安装了 OpenSSL:
```
openssl version
```
如果返回了 OpenSSL 的版本号,则表示已经安装。否则可以使用以下命令安装:
```
sudo apt-get update
sudo apt-get install openssl libssl-dev
```
可以使用以下命令来检查 PHP 是否已经安装了 OpenSSL 扩展:
```
php -m | grep openssl
```
如果有返回,则表示已经安装。否则需要使用以下命令安装:
```
sudo apt-get update
sudo apt-get install php-openssl
```
具体代码如下:
```php
function random_str($length)
{
$str = '';
if (function_exists('random_bytes')) {
$bytes = random_bytes(ceil($length / 2));
$str = substr(bin2hex($bytes), 0, $length);
} elseif (function_exists('openssl_random_pseudo_bytes')) {
$bytes = openssl_random_pseudo_bytes(ceil($length / 2));
$str = substr(bin2hex($bytes), 0, $length);
} elseif (function_exists('mcrypt_create_iv')) {
$bytes = mcrypt_create_iv(ceil($length / 2), MCRYPT_DEV_URANDOM);
$str = substr(bin2hex($bytes), 0, $length);
} else {
for ($i = 0; $i < $length; $i++) {
$str .= chr(mt_rand(97, 122));
}
}
return $str;
}
echo random_str(16);
```
这个函数首先尝试使用随机字节串生成器 random_bytes() 来生成随机字符串,如果不可用,则尝试使用 OpenSSL 扩展提供的函数 openssl_random_pseudo_bytes() 或 Mcrypt 扩展提供的函数 mcrypt_create_iv() 生成随机字符串,如果这两个扩展也不可用,则使用 mt_rand() 函数生成随机字符串。
使用 random_bytes() 函数生成的随机字符串安全性最高,如果可用则优先使用。
PHP date() 函数可以返回当前日期和时间。该函数的第一个参数是格式字符串,用于指定输出的格式。
格式字符串可以使用各种符号和字符来指定日期和时间的格式,这些符号和字符的含义列举如下:
- d:表示月份中的第几天,带前导零(01-31)
- D:表示星期中的缩写名称(Mon-Sun)
- j:表示月份中的第几天(1-31)
- l:表示星期的完整名称(Monday-Sunday)
- N:表示星期中的数字形式(1-7)
- S:表示月份中的英文后缀(st, nd, rd, th)
- w:表示星期中的数字形式(0-6)
- z:表示年份中的天数(0-365)
- F:表示月份的完整名称(January-December)
- m:表示月份,带前导零(01-12)
- M:表示月份的缩写名称(Jan-Dec)
- n:表示月份(1-12)
- t:表示指定月份的天数(28-31)
- L:表示是否为闰年(1为是,0为否)
- Y:表示四位数的年份(如:2019)
- y:表示两位数的年份(如:19)
- a:表示上午或下午的小写字母形式(am, pm)
- A:表示上午或下午的大写字母形式(AM, PM)
- g:表示小时,12 小时制(1-12)
- G:表示小时,24 小时制(0-23)
- h:表示小时,12 小时制,带前导零(01-12)
- H:表示小时,24 小时制,带前导零(00-23)
- i:表示分钟,带前导零(00-59)
- s:表示秒数,带前导零(00-59)
- O:表示与格林威治标准时间(GMT)的时差(如:+0800)
- P:表示与格林威治标准时间(GMT)的时差,格式为:±HH:MM(如:+08:00)
- T:表示时区的缩写名称(如:CST)
- Z:表示与格林威治标准时间(GMT)的秒差(如:28800)
使用 date() 函数可以输出各种格式的日期和时间。例如:
```php
echo date("Y-m-d H:i:s"); // 输出:2019-11-23 10:50:00
echo date("l"); // 输出:Saturday
echo date("l, F jS, Y"); // 输出:Saturday, November 23rd, 2019
```
当然,还可以使用更为复杂的格式字符串来自定义输出的格式,例如:
```php
echo date('D, j M Y G:i:s T'); // 输出:Sat, 23 Nov 2019 10:50:00 CST
```
PHP 还提供了一些关于日期和时间的处理函数,比如 strtotime() 函数可以将任何字符串转换为 Unix 时间戳,而 time() 函数可以返回当前的 Unix 时间戳。
例如:
```php
echo strtotime("10 September 2000"); // 输出:968064000
echo time(); // 输出:1574483400
```
在需要处理日期和时间的场景中,这些函数能够帮助我们快速地实现效果,并且方便易用。
总之,PHP 提供了丰富的函数和扩展库来处理字符串、日期和时间等常见需求,开发者只需要根据实际情况选择合适的函数即可。在编写代码时,要注意考虑安全性和效率,尽可能选择安全性更高、效率更快的函数。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.ynyuzhu.com/
自己种下的是葵花,秋天自己将收获一片金黄;如果自己种下的是小树,夏天自己将收获一片绿荫;如果自己种下的是刻苦,来年自己将收获一份成功!