分类 PHP 下的文章

/**
     * 获取两个日期之间的所有日期
     * @param string $startDate 2022-08-08
     * @param string $endDate 2022-08-08
     * @return array
     */
    function get_between_date($startDate = null, $endDate = null): array
    {
        $dates = [];
        $startTime = strtotime($startDate);
        $endTime = strtotime($endDate);
        if ($startTime > $endTime) {
            //如果开始日期大于结束日期,直接return 防止下面的循环出现死循环
            return $dates;
        } elseif ($startTime == $endTime) {
            //开始日期与结束日期是同一天时
            $dates[] = $startDate;
            return $dates;
        } else {
            $dates[] = date('Y-m-d', $startTime);
            while ($startTime < $endTime) {
                $startTime = strtotime('+1 day', $startTime);
                $dates[] = date('Y-m-d', $startTime);
            }
            return $dates;
        }
    }

<?php
echo date('Y-m-d H:i:s',strtotime('now'));//当前时间戳 2017-01-09 21:04:11
echo date('Y-m-d H:i:s',strtotime('+1second'));//当前时间戳+1秒 2017-01-09 21:04:12
echo date('Y-m-d H:i:s',strtotime('+1minute'));//当前时间戳+1分 2017-01-09 21:05:11
echo date('Y-m-d H:i:s',strtotime('+1hour'));//当前时间戳+1小时 2017-01-09 22:04:11
echo date('Y-m-d H:i:s',strtotime('+1day'));//当前时间戳+1天 2017-01-10 21:04:11
echo date('Y-m-d H:i:s',strtotime('+1week'));//当前时间戳+1周 2017-01-16 21:04:11
echo date('Y-m-d H:i:s',strtotime('+1month'));//当前时间戳+1月 2017-02-09 21:04:11
echo date('Y-m-d H:i:s',strtotime('+1year'));//当前时间戳+1年 2018-01-09 21:04:11
echo date('Y-m-d H:i:s',strtotime('+12year 12month 12day 12hour 12minute 12second'));//当前时间戳+12年,12月,12天,12小时,12分,12秒 2030-01-22 09:16:23
$t=1483967416;//指定时间戳
echo $dt=date('Y-m-d H:i:s',$t);//2017-01-09 21:10:16
/*方法一*/
echo date('Y-m-d H:i:s',$t+1*24*60*60);//指定时间戳+1天 2017-01-10 21:10:16
echo date('Y-m-d H:i:s',$t+365*24*60*60);//指定时间戳+1年 2018-01-09 21:10:16
/*方法二*/
//$dt是指定时间戳格式化后的日期
echo date('Y-m-d H:i:s',strtotime("$dt+1day"));//指定时间戳+1天 2017-01-10 21:10:16
echo date('Y-m-d H:i:s',strtotime("$dt+1year"));//指定时间戳+1年 2018-01-09 21:10:16
/*方法三*/
//$t是指定时间戳
echo date('Y-m-d H:i:s',strtotime("+1day",$t));//指定时间戳+1天 2017-01-10 21:10:16
echo date('Y-m-d H:i:s',strtotime("+1year",$t));//指定时间戳+1年 2018-01-09 21:10:16
//指定时间戳加1月、1周、1小时、1分、1秒原理同上;

一、分析:

https://blog.csdn.net/weixin_44717746/article/details/106651480

二、总结:

  我们知道在没有面向对象编程语言的时候,我们都是用面向过程的方式来编写程序的,典型的就有C语言,Fortran等等,面向对象的思想,无疑带来了编程思维的一个新的飞跃,但因为多增加一层抽象,也面临着性能问题,典型的就是内存问题。

  面向对象编程,主要围绕着三大特性,封装,继承,多态来实现的,主要的实现方式多以基于类来实现。我们在实例化类的时候,一般会定义一个变量引用我们实例化的对象,引用,即代表着这个变量存放的不是这个实例化的对象,而是这个对象内存首地址,进而达到间接访问的目的。

  在这里,要谈到两个概念,栈和堆,栈一般来说,指的是cpu内部中的寄存器(Register)空间,而堆指的是电脑中的主存(Random Access Memory)。我们在定义一般变量的时候,变量会存放在栈中,而实例化的类会存放在堆中,因此我们要访问堆中的类时,我们要先在栈中提取该类的引用变量得到类的内存地址,进而访问到类中的数据,进行读,写操作。

  但其实一般来说,定义的变量和类的多少是人来决定的,机器的内存大小也就那样,因此,内存分配的工作主要由编译器(或者解释器)的算法来实现的,大概原理是把cpu的寄存器,缓存(cache),内存映射到虚拟内存列表上,再由算法分配最常使用的变量优先以快到慢的存储介质中存放,但类都是放在内存中的。

  现在2022年了,大部分的用户内存都处于16G,32G这个范围,而cpu的寄存器,就算比较牛逼最新的i7 8,9系cpu,也不过个位数的KB大小,cache可能还好一点,几MB到十几MB的大小已经是不错的了,速度大概是内存的5到10倍把,主要涉及到公式1/r+(1-r)h,其中h为Nc/Nc+Nm,Nc为cache存取的次数,Nm为内存存取次数,h为cache命中率,可以知道为了提高命中率,5到10是比较合理的。可想而知,栈内存的空间是如此地稀缺,因此合理地运用栈内存,是可以提高程序的速度的。

  所以,在写程序的时候,尽可能地把类相同的函数方法放入父类中,用继承的方式去引用这些公共的方法,把相同的变量放入连接属性中,或者父类中,减少内存中相同的拷贝,是可以节省不少内存的,同时合理编写算法,高效运用栈内存,尽可能地使用局部变量,在作用域结束的时候可以释放栈内存。

if (!in_array('sm4-cbc', openssl_get_cipher_methods())) {
    printf("不支持 sm4\n");
}

$key = 'her-cat.com';
$iv = random_bytes(openssl_cipher_iv_length('sm4-cbc'));

$plaintext = '她和她的猫';

$ciphertext = openssl_encrypt($plaintext, 'sm4-cbc', $key, OPENSSL_RAW_DATA , $iv);

printf("加密结果: %s\n", bin2hex($ciphertext));

$original_plaintext = openssl_decrypt($ciphertext, 'sm4-cbc', $key, OPENSSL_RAW_DATA , $iv);

printf("解密结果: %s\n", $original_plaintext);

结果如下:

加密结果: 45cd787b0a84603ae8fd443b81af4d17
解密结果: 她和她的猫


转载:https://her-cat.com/2021/08/23/php-openssl-sm4.html