php docker宿主机容器时间分离,linux软件时钟与系统时钟分离
-
- 需求
- 场景分析
- 踩坑
- 解决方案
- 回顾
- 总结
- 最后
需求
前一段时间用laravel写了个站点,但是客户有一个需求着实难住了我,那就是结算测试。因为在系统里面写的是按每天0点1分以计划任务方式结算前一天的佣金。然后测试的时候需要在一天内模拟很多天的时间点提交订单和自动结算佣金。
场景分析
我最开始想到的是修改源代码以达到效果,但是源代码都已经写好了如果改掉做测试那测完还得还原老版本到生产环境,而这两个就造成了生产环境和测试环境完全是两套代码,那测试还有什么意义我就想起了刚学不久的docker,试想我能不能使用docker安装一个测试环境在docker里面然后使用计划任务隔一段时间[比如一个小时累加一天]自动修改docker沙箱的系统时间果然还是巨人的肩膀上能看更远!
踩坑
解决方案
一 坑解决方案:
在docker容器中使用虚假时间
https://github.com/wolfcw/libfaketime
按需求我编写了下面的shell文件放到 libfaketime目录【用于计划任务执行】
run.sh
然鹅当我执行上面这个文件的时候就出现了【二 坑】里面说的问题,使用 . ./ssh.sh或则 source ./ss.sh结果都是php里面获取到的系统时间为宿主机系统时间。
二 坑解决方案:
分析:想了很多解决方案,别人都说shell里面的变量有局限性,建议放到文件中然后再source【这种方法我也试过不知道为什么我这里就是不行】,这不符合我的需求啊因为我的时间是需要每隔一段时间实时变化的,并不能只依赖开机启动。最后灵机一动,既然shell中的变量有局限性,那我能否把需要用到假时间的软件进程放到当前shell中运行在ssh中加上重启php服务,问题迎刃而解。
解决:
解决上面两个坑运行起来,然后php里面能看到假时间,但是持续10秒后又变成了宿主机的真实时间。以下则是这个问题的解决方案。
三 坑解决方案:
这个问题一直困扰了我好几天,一直无解于是又是各种搜索各种试验各种请教大神,甚至还在github的假时间项目里面提交了我的问题,问完我的问题后我抱着看看issues中有没有别人遇到这个问题的时候,有一个人的回答令我眼前一亮虽然和我的需求并不符合但是他解决了我的问题。在这里我把那位大神的解决方法截图贴出来,分享给大家。
回顾
假时间功能已经解决好2天时间了,今天回首一想,脑海里突然浮现一个观念,那就是这个虚假时间可不可以放宿主机直接做测试,实现方法是安装多个php然后某一个php使用虚假时间做测试,其他的php依然正常运行是坑定的。由于暂时没有这方面需求而且测试次数不够稳定性也不是很好【之前为了实现时间分离玩坏了好几个容器。真机试验风险固然更大,而且没有docker备份方便。】,这里就不做试验了。这里把我的解决方案写出来,如果老铁们有需要就自己折腾折腾把。
总结
挖坑天天有,新手特别多。在学习的长河中问题固然是会层出不穷,但是我们解决问题的那一颗恒心更重要。最好的学习效果,莫过于多年以后遇到一个很难解决的问题。你会想起曾几何时在记忆深处留下过类似的痕迹。然后问题迎刃而解。
最后
如果觉得我的文章对你有帮助,请点个小赞支持支持。也可以留言加我好友我们一起探讨学习。程序人生,如果不是在倒腾那就是在搭建倒腾需要的环境。走在倒腾的道路上你并不孤单。
针对此功能本人有出一个宝塔插件,详情请参阅如下地址
https://blog.csdn.net/qq_38883889/article/details/106731520
文章知识点与官方知识档案匹配,可进一步学习相关知识C技能树首页概览115938 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!