需求
場景分析
踩坑
解決方案
回顧
總結
最後
前一段時間用laravel寫了個站點,但是客戶有一個需求着實難住了我,那就是結算測試。因為在系統裡面寫的是按每天0點1分以計劃任務方式結算前一天的傭金。然後測試的時候需要在一天内模拟很多天的時間點送出訂單和自動結算傭金。
我最開始想到的是修改源代碼以達到效果,但是源代碼都已經寫好了如果改掉做測試那測完還得還原老版本到生産環境,而這兩個就造成了生産環境和測試環境完全是兩套代碼,那測試還有什麼意義?于是我就想起了剛學不久的docker,試想我能不能使用docker安裝一個測試環境在docker裡面然後使用計劃任務隔一段時間[比如一個小時累加一天]自動修改docker沙箱的系統時間?恩,果然還是巨人的肩膀上能看更遠!
一号坑:于是說幹就幹,搭建了docker,部署了測試環境,然鵝就在成功的大門離我越來越近的時候,成功我被自己的小聰明坑哭。那就是docker的時間居然是和主控端共享的。于是各種度娘各種谷歌,一弄就是一整天,終于黃天不負有心人讓我找到一個方法。使用github上一位大佬基于C寫的假時間插件(具體方法請看下面解決方案)。
二号坑:當我一陣心花路放準備慶幸大功告成的時候,突然發現我寫的shell無法全局生效[具體表現就是我的sh檔案在計劃任務中執行完輸出的是假時間,開的指令行時間依然還是主控端的時間,php擷取得到的系統時間也是主控端的真實時間],心中頓時十萬隻羊駝奔騰而過。這個問題最終還是通過我的深思熟慮得到答案。
三号坑:解決好時間無法全局生效問題後我以為就可以直接使用了,然鵝,被現實啪啪打臉,我終于承認終究還是我想得太美好了,一切都準備好做最後測試的時候問題又出現了,那就是在php裡面時間隻能持續跳動10秒,後面又自動擷取主控端時間。這個問題一直困擾了我好幾天,一直都一籌莫展。其實針對這個問題網上有很多很多的文章都是轉載或則直接複制粘貼某一位大神的一篇文章,最後的10秒無法繼續問題最終都沒得到解決,最後還是自己想各種辦法解決。
一号坑解決方案:
在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中有沒有别人遇到這個問題的時候,有一個人的回答令我眼前一亮雖然和我的需求并不符合但是他解決了我的問題。在這裡我把那位大神的解決方法截圖貼出來,分享給大家。

對的你沒有看錯,把假時間持續時間加大即可。說幹就幹改一下我的腳本,果然問題迎刃而解。
下面是完整的shell腳本也是我最好幾天的勞動成果,在此開源貢獻給大家。
至此完成。
假時間功能已經解決好2天時間了,今天回首一想,腦海裡突然浮現一個觀念,那就是這個虛假時間可不可以放主控端直接做測試,實作方法是安裝多個php然後某一個php使用虛假時間做測試,其他的php依然正常運作?答案是坑定的。由于暫時沒有這方面需求而且測試次數不夠穩定性也不是很好【之前為了實作時間分離玩壞了好幾個容器。真機試驗風險固然更大,而且沒有docker備份友善。】,這裡就不做試驗了。這裡把我的解決方案寫出來,如果老鐵們有需要就自己折騰折騰把。
挖坑天天有,新手特别多。在學習的長河中問題固然是會層出不窮,但是我們解決問題的那一顆恒心更重要。最好的學習效果,莫過于多年以後遇到一個很難解決的問題。你會想起曾幾何時在記憶深處留下過類似的痕迹。然後問題迎刃而解。
如果覺得我的文章對你有幫助,請點個小贊支援支援。也可以留言加我好友我們一起探讨學習。程式人生,如果不是在倒騰那就是在搭建倒騰需要的環境。走在倒騰的道路上你并不孤單。