## 訪問式的web服務(一)

web服務的特點都是快速服務的,一個操作要在短時間完成,并響應用戶。
但是這樣有一些耗時的操作就沒法做了,只能使用其他方式了。
還有一些問題,也是傳統web服務:“訪問一下就操作,再返回,沒人訪問就是死的”,這種模式所達不到的效果。
* * * * *
[RabbitMQ - RabbitMQ tutorial - Work Queues](http://www.rabbitmq.com/tutorials/tutorial-two-php.html)
> This concept is especially useful in web applications where it's impossible to handle a complex task during a short HTTP request window.(這個概念是特別有用的,**web應用程序是不可能在一個短的HTTP請求窗口中處理復雜的任務。**)
* * * * *
**要改變當前這種情況,就需要使用新的開發模式和技術了,目前來看主要有三種:**
1. 定時任務(例子:定時器)
<pre>比如每隔幾秒鐘執行一次什么任務,特點是高頻,定時器模式,強調的是每隔多長時間執行一次。例子:每隔三秒鐘做一次日志整理備份;每隔一秒鐘做一次緩存檢查;每隔一秒鐘掃描一次所有下線用戶,并作下線處理。</pre>
2. 計劃任務(例子:鬧鐘)
<pre>比如每天的鬧鐘,每個星期幾做什么事,特點是重復,比如每天的鬧鐘,每天都會響(如果我要設置一個十五天后提醒我的鬧鐘就不行了,這時就得用代辦提醒的程序了)</pre>
3. 延時任務(例子:代辦提醒)
<pre>比如三天后提醒我做什么,一個月之后自動執行什么事情,特點是單次,執行后就完成了,如果你需要3天后做什么,還需要9天后在做一次,那么你就添加兩個這樣的任務就行了</pre>
4. 隊列(例子:餐廳排隊)
<pre>隊列的意義其實是緩沖,如果某個操作費時,并且業務不依賴它馬上返回執行結果的操作就可以放到隊列去,要求的是越快做完越好,</pre>
>[danger] 注意這里面很重要的一點要考慮,那就是阻塞。被調用方執行過程中是否會阻塞當前調用方。比如定時器是否會被阻塞,如果被阻塞了,那么就不能按照理想的狀態一秒鐘執行一次了(目前定時使用無限循環和延時睡眠的方式實現的,不知道還有沒有其它方式實現),另外多任務的執行,是不是要開啟多進程,不然太耗時了。要弄懂這里面的細節,就必須徹底理解程序/進程底層有哪些調用方式。(TODO 待測試:可以拿swoole的定時器做下試驗)
<pre>
有時候需要這幾種方式配合起來應用,比如我網站有一億會員,我是管理員,我現在需要給每個發送會員通知,這么多人,我不可能直接執行發送的程序。
所以我可以把發送會員消息當成一個任務,任務里面有我要發的內容,以及是否為全部成員(也可以是幾個會員的id),我寫好內容后點擊發送就創建這樣一個任務可以了,然后另一個程序在后臺執行這個任務就可以了(得到任務數據,給每一個給用戶發消息),讓它在后臺慢慢發就可以了,這樣我就不用守著程序執行了,其實這就是隊列(這個群發的隊列跟普通的還有點 差別呢,那就是它在執行的過程中還會更新任務的數據,比如更新已發送了多少,當然可以用其他方式)。
如果情況變成我需要三天后執行這樣的任務,那么此時就可以使用2,3兩種配合了。創建一個2的任務,任務要做的事就是三天后在創建3的任務/隊列。甚至這個給一億會員發消息做一個隊列不好,還可以拆分為每個用戶一個隊列,總之任務自己還可以創建任務。任務之間是靈活的。
這樣不光解決了大任務(復雜耗時任務)不適合<span style="color:#D60000"> **“傳統的基于訪問式的web服務”**</span>來做的問題,更重要的意義其實是系統的解耦,這樣將復雜的系統模塊化了,降低了系統的耦合程度,系統的穩定性,可用性將大大提高,而這是大型系統所必須的面對和考慮的。
定時取決于你對時間精度的要求,最小時間是xx,你不會有這樣的要求吧,就算你要求的時間精度很高,要知道cpu的時鐘頻率是xx,當然每個進程不可能完全獨占cpu的時間片,而是每個進程占用一小部分cpu的時間片,cpu每次執行每個進程的一小段,不斷地在各個進程中來回切換的。不過它還是很快。對于你的時間精度要求足夠了。
時間要求精確的用延時隊列(精確程度還是取決于工人數量),比如,半個小時后通知我,15分鐘未支付訂單自動關閉/三天后自動確認收貨等等。要求不精確的用計劃任務,比如每天晚上統計一些信息,給超過三十天未登錄的用戶發送郵件等等這樣的任務可以使用計劃任務做。
計劃任務和隊列;計劃任務,按時間計劃,做某事。而計劃,展開那就多種多樣了,有一次的,有每個月的,多次的,等等,總之是圍繞時間的計劃。
隊列類型:1. 即時隊列;2. 延時隊列。
</pre>
*(RPC本質其實也是訪問時模型的)*
這三類又帶來了一個問題,那就是:處理程序在什么時候執行?或者說被觸發:
1. 在死循環中執行
2. 用系統的定時任務觸發
3. 其他程序的觸發
(有些情況可以讓用戶訪問時觸發,有些則需要單獨用后臺進程去觸發,比如DZ的定時任務就是訪問觸發的,文章的按時發布,還有的針對用戶的業務功能,也可以讓用戶訪問時觸發,當然也可以其他進程觸發,如果其他進程不及時/實時的話,那么訪問時觸發就彌補了這個問題。)
~~~
觀空調有感
什么時候觸發,這要看你對時間精度的要求了,比如鬧鐘,都是精確到秒的,那么鬧鐘服務程序就得每隔一秒檢測一次,要是大于一秒那就有點后知后覺了,所以這個需要看你的應用場景對時間的精度要求。還有一種情況,現實生活中,空調一關閉,扇葉就能歸位,明明已經斷電了,它這個是怎么做的呢,難道也有程序觸發的嗎,其實也是觸發,不過這個觸發時機和情況有所不同,它是有一個繼電器,帶磁性,通電時有磁性,所以自動打開了,不通電時由于沒有磁性,那么撥片在彈力的作用下就會自動關閉,也就是說彈力一直存在著,只是繼電器的磁力與彈力抗衡著使得打開,一旦失去磁力就會關閉,所以這個情況不是檢測機制,不過你也可以理解成它是一直檢測著,監控著,這是因為它的結構和材料決定了它的這個特性。所以計算機對待此類問題,也肯定有它自身的結構的,所以看清問題的本質很重要。拋開問題的本質和所處空間的環境(計算機),空談解決方式是沒有任何意義的。
note date:2017-7-21 00:22:50
~~~
* * * * *
**可以利用 [第三方監控服務](http://jk.cloud.#/) 來觸發**(不過還是不能保證第三方服務的穩定性和可靠性)
[定時任務 · 【官方版】ThinkPHP小程序拼團 && WeiPin3小程序 安裝手冊 · 看云](http://www.hmoore.net/tpcms/wxshop/462852)
* * * * *
[Laravel 5.2 文檔 服務 —— 任務調度 – Laravel學院](http://laravelacademy.org/post/3267.html)
> 檢測的時間精度/粒度是秒
[在WordPress中使用wp-cron插件來設置定時任務_php實例_腳本之家](http://www.jb51.net/article/76183.htm#cmid=167401)
> 它的原理就是將創建的定時任務存儲到數據庫里,當有人訪問的時候就去判斷一下是否到時間需要執行這個定時任務,如果到時間則執行。
>
> **因為這種原理,所以執行的時間可能會有一些偏差,但隨著網站的瀏覽量攀升和網絡爬蟲的不斷訪問,會讓定時任務執行的時間越來越準確。**
DZ的定時任務,是由用戶訪問觸發的,原因是因為DZ要讓使用者安裝門檻比較低,使用者大多只有虛擬主機而沒有服務器,所以這種方式是最好的,但是這樣的話就需要考慮并發了,不會可能會出現任務被重復執行的問題,其實DZ這里是使用了鎖的,來看一下DZ是怎么做的 [class_cron.php](https://github.com/bluelovers/Discuz/blob/818e2ec412daeabeace808f9a398f84d728d8ec1/discuzx/upload/source/class/class_cron.php)

可以看到是使用了鎖的,再來看一下它的鎖是怎么實現的:
DZ的鎖不是基于文件的,而是使用的 `common_process 進程鎖管理 表 MEMORY 存儲引擎`(用內存表做,還是沒用鎖,這只是把“縫隙”降得最低而已,并發量大的時候還是會出現重復執行的問題的) 做的。
待分析……
2017-7-2 17:59:11
* * * * *
還有,有的時候要保證處理程序只有一個在執行,不能出現并發的情況,那么程序執行時就要檢測當前是否在運行了,如果已經在執行當中了,那就什么都不做退出,沒有在執行時才去執行。至于怎么防止并發問題,可以用文件鎖之類的。
所有的東西都不是憑空捏造,胡亂想象出來的,而是為了解決實際問題而誕生出來的解決方案。所以要以解決問題為目的,看清本質,知道你自己要什么,才是最重要的。否則你就掉進技術的黑洞旋渦,找不到方向。
其實從來都沒有什么編程,從來都只是為了解決實際問題而已啊。
web、網站被創造出來也是為了解決實際問題的,當有些問題它不能很好的解決的時候,就要尋找其他的解決方法,而不是web不行,只是它不是專門為解決這個問題而創造的,它是為了其他的,為了解決它擅長的領域的問題而創造的,你像個潑婦一樣的為難它,埋怨它有什么意義呢。
* * * * *
一件事物要想發生,要么是自主意識的,要么是被另一個什么事件的發生而觸發的。自主就是通過自己不斷的循環,觸發就是在特定的時機被別人調用,至于這個特定的時機是什么時候,要看應用的實際情況和應用場景。
* * * * *
### web服務也是一種程序
一直以來,我們對程序的執行,都局限于 **[請求-響應]** 的模型,這是web開發做久了的原因。
受學習php影響,腳本執行有超時和內存限制(命令行模式沒有這個限制),這就意味著腳本不能夠長時間執行。所以潛意識中所有程序都是這樣的,不能接受無限循環的代碼,程序應該盡早執行完并退出,甚至受web訪問式影響,只能寫出被動運行的代碼,不了解常駐服務程序的結構。但其實并不是這樣的,這是思維受禁錮了。
* * * * *
### 參考:
[Discuz! X3 數據字典](http://faq.comsenz.com/library/database/x3/x3_index.htm)
[Discuz! X2 計劃任務原理分析](http://blog.csdn.net/fengda2870/article/details/40584315)
[Discuz!開發之進程鎖類discuz_process介紹](http://blog.csdn.net/lih062624/article/details/70135965)
[discuz防刷新、防外部提交研究](https://my.oschina.net/jiangbianwanghai/blog/68173?p=1)
[Discuz! X2 計劃任務原理分析](http://www.discuz.net/thread-2284868-1-1.html)
[discuz X2 計劃任務執行機制解析](http://down.admin5.com/edu/discuz/77126.html)
> Discuz! X2 即將到來新機制介紹:
在 Discuz! X2 中的計劃任務引用了新的外部控制機制,以前的機制都是在程序允許的時候,需要有用戶或者蜘蛛訪問論壇,才能夠執行計劃任務。現在,在 Discuz! X2 中引如新的遠程機制,可以在服務器上使用服務器的計劃任務或者服務器的獨立進程來監控執行論壇計劃任務,也就可以避免在**訪問用戶較少的時候計劃任務執行時間不準確的問題**了。
[discuzX2.5修改帖子點擊量](http://youlanzihun.blog.163.com/blog/static/37311710201452342859577/)
[關于計劃任務不執行或者重復執行](http://www.qlzhan.com/a/cmsjiaocheng/discuz/2013/60081.html)
[計劃任務(今日發帖)有問題的臨時解決方法 :)](http://www.qlzhan.com/a/cmsjiaocheng/discuz/2013/60080.html)
[PHP程序員未來發展的方向有哪些?](PHP程序員未來發展的方向有哪些?)
* * * * *
定時任務截圖(六星教育):

* * * * *
[fastadmin - 定時任務](http://demo.fastadmin.net/admin/general/crontab?ref=addtabs)

* * * * *
[Facebook創始人扎克伯格,講述編程中循環的原理](https://www.ixigua.com/a6452243849740812814/?utm_medium=feed_steam&utm_source=toutiao#mid=7644599489)
> 大公司有自己的分布式管理服務器,所有機器的定時任務都在一個集群上靠自動化達到目的。
[請求 · php筆記 · 看云](http://www.hmoore.net/xiak/php-node/365315)
[【系統架構】億級Web 系統的容錯性實踐【中】](http://mp.weixin.qq.com/s/VTJ3--4j6iJQb5IUe9JwHw)
> 設置超時:怪不得很多軟件都會設置超時時間,比如Nginx和PHP,原來是為了容錯和性能。
>
> 容錯很重要,比如糾錯碼使得瀏覽器得以運作。
* * * * *
[Golang在php的web開發中,可以替代哪些應用場景? - 知乎](https://www.zhihu.com/question/265388870/answer/293319812)
> **【短生命周期+同步】** 的PHP-FPM 和 **【長生命周期(邏輯內存常駐)+同步/異步】** 的Swoole聯合開發.
> 有個在后臺一直運行著的進程,提供主動的輔助php_cli模式,**而不是像原來的http那樣被動。**
[【PHP編程】服務器推送其實就是如此簡單(一)](https://www.toutiao.com/a6536804858329039363/?tt_from=weixin&utm_campaign=client_share×tamp=1522267086&app=news_article_lite&utm_source=weixin&iid=25315997380&utm_medium=toutiao_android&wxshare_count=1)
> 在 Web 應用中,瀏覽器和服務器之間使用的是請求 / 響應的**交互模式**。瀏覽器發出請求,服務器根據收到的請求來生成相應的響應。瀏覽器再對收到的響應進行處理,展現給用戶。
[想成為一名Web開發者?你應該學習Node.js而不是PHP](http://mp.weixin.qq.com/s/x8dm9e7gwLXSEzxE6sQYow)
> 它遵循經典的客戶端 - 服務器模型,其中每個頁面都初始化應用、數據庫連接和 HTML 渲染。這使得當你導航一個網站時,PHP 比 Node.js 應用要慢。Node.js 應用一直運行,只需要初始化一次。因此,隨著 HTML5、AJAX 和 WebSocket 等 Web 技術的出現,Node.js 更適合新的 Web 發展方向。
[專訪死馬:為什么說Egg.js是企業級Node框架](https://mp.weixin.qq.com/s/5aAgEc6lr5B3OerPv_IgGg)
> 清晰的定義了從配置、路由、擴展、中間件到控制器、**定時任務**等各個 Web 應用研發過程中一些最基礎的概念
[Systemd 定時器教程 - 阮一峰的網絡日志](http://www.ruanyifeng.com/blog/2018/03/systemd-timer.html)
[定時任務常見實現方式](https://mp.weixin.qq.com/s/MbaMgkRfvMUVt1i3a_nFtg)
[Java如何實現任務超時處理](https://mp.weixin.qq.com/s/2yEMqv6v26nnDR6s0kLZnw)
[【原創】分布式之延時任務方案解析 - 孤獨煙 - 博客園](https://www.cnblogs.com/rjzheng/p/8972725.html)
~~~
在開發中,往往會遇到一些關于延時任務的需求。例如
生成訂單30分鐘未支付,則自動取消
生成訂單60秒后,給用戶發短信
對上述的任務,我們給一個專業的名字來形容,那就是延時任務。那么這里就會產生一個問題,這個延時任務和定時任務的區別究竟在哪里呢?一共有如下幾點區別
定時任務有明確的觸發時間,延時任務沒有
定時任務有執行周期,而延時任務在某事件觸發后一段時間內執行,沒有執行周期
定時任務一般執行的是批處理操作是多個任務,而延時任務一般是單個任務
~~~
[為什么 PHP 程序員應該學習使用 Swoole](https://www.toutiao.com/a6568284224787317251/?tt_from=weixin&utm_campaign=client_share×tamp=1529319824&app=news_article_lite&utm_source=weixin&iid=33124962994&utm_medium=toutiao_android&wxshare_count=1)
> 【常駐內存】目前傳統 PHP框架,在處理每個請求之前,都要做一遍加載框架文件、配置的操作。這可能已經成為性能問題的一大原因,而使用 Swoole 則沒有這個問題,一次加載多次使用。
[一個著名的任務調度系統是怎么設計的?](https://mp.weixin.qq.com/s/uQB8uMg-zRfTCzcOt1FJIw)
~~~
“很簡單,就是數據庫的‘行’鎖嘛, 比如SELECT * FROM LOCKS where LOCK_NAME='TRIGGER' FOR UPDATE ,這就把那一行記錄給鎖住了, 別的事務只能等待當前事務commit以后才能訪問。”
隊列里面叫task,計劃任務里面叫job
定時任務,應該一次把到期的全部取出來,然后開多進程同時并發執行任務。不過進程數不要大于核心數,否則進程切換的開銷會很大,多進程并不會發揮高效率。(不過要考慮任務是否需要單例執行,即某一任務同一時刻只能有一個在執行,如果當前任務正在執行,又到時了,在準備起一個進程執行時發現該任務當前在執行,那么就放棄本次調度,不執行。不過還有一種方式,是放棄還是放到隊列呢?)
~~~
[ThinkPhp5與Swoole定時任務實踐+PHP筆記 · 看云](http://www.hmoore.net/dapeng235/thinkphp5_swoole_timer)
* * * * *
### php與nginx協同工作的原理
[初中級 PHP 面試基礎匯總](https://mp.weixin.qq.com/s/_lqodpKV2pYCEfS4zMf8qQ)(什么是CGI? 什么是FastCGI? php-fpm , FastCGI,Nginx 之間是什么關系?)
[深入NGINX:nginx高性能的實現原理 - panda521 - 博客園](https://www.cnblogs.com/chenjfblog/p/8715580.html)
[深入理解PHP之:Nginx 與 FPM 的工作機制 - 文章 - 伯樂在線](http://blog.jobbole.com/99314/)
[Nginx+Php-fpm運行原理詳解 - CSDN博客](https://blog.csdn.net/u013474436/article/details/52972699)
[nginx+php的配置與原理 - CSDN博客](https://blog.csdn.net/dengjiexian123/article/details/53358452)
[php-fpm安裝、配置與優化 - CSDN博客](https://blog.csdn.net/QFire/article/details/78680717?locationNum=1&fps=1)
[PHP: FastCGI 進程管理器(FPM) - Manual](http://www.php.net/manual/zh/install.fpm.php)
[PHP-FPM 調優:使用 ‘pm static’ 來最大化你的服務器負載能力](https://mp.weixin.qq.com/s/cWKzgR35zorWL9JYyS9utA)
[線上部署 - ThinkJS 文檔](https://thinkjs.org/zh-cn/doc/3.0/deploy.html)(使用 nginx:node.js與nginx)
[PM2實用入門指南 - CSDN博客](https://blog.csdn.net/maquealone/article/details/79550120)
[PHP Socket 初探 —— 硬著頭皮繼續 libevent(二)](https://mp.weixin.qq.com/s/J_Be3PI47PoLdKHCECJQhQ)
> 下面我們從開始寫一個php定時器來步入到代碼的節奏中。定時器是大家常用的一個工具,**一般phper一說定時器,腦海中第一個想起的絕逼是Linux中的crontab。難道phper們離開了crontab真的就沒法混了嗎?是的,真的好羞恥,現實告訴我們就是這樣的,他們離開了crontab真的就沒法混了。** 那么,是時候通過純php來搞一波兒定時器實現了!
[PHP declare(ticks=N); 的作用 - 睡著的糖葫蘆 - 博客園](https://www.cnblogs.com/loveyouyou616/p/5799933.html)
>[tip] 不要太低估PHP了,很多東西只是你不知道,沒有試過,并不代表它就是你想的那樣而已。
[Node 定時器詳解](https://mp.weixin.qq.com/s/YLpGdzlKkUDhfi_EhgxG7Q)
[運行模式 · easySwoole 3.x](https://www.easyswoole.com/Manual/3.x/Cn/_book/noobCourse/RunMode/Introduction.html) (php有著5種運行模式,常見的有4種:)
[php-cli和php-fpm的關系是什么? - SegmentFault 思否](https://segmentfault.com/q/1010000004664671)
[PHP的線程安全ZTS與非線程NTS安全版本的區別](http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%B1%87/8287.shtml)
[PHP 不會死 —— 我們如何使用 Golang 來阻止 PHP 走向衰亡](https://mp.weixin.qq.com/s/x1QSy6NxlLE_Yv9wX6et2Q)
> 對于開發者來說,理解?*php-fpm*?如何執行應用程序的代碼是最有趣的。當一個請求發送時,?*php-fpm*?啟動一個 PHP 子進程,并且將請求內容作為進程?*狀態的*?一部分(?`_GET`?,?`_POST`?和?`_SERVER`?等)。在執行 PHP 腳本期間,狀態無法更改,因此獲取一組新輸入數據的唯一方法是銷毀該進程并重新開始。
>
> **像這樣的執行模型有很多好處。你不必擔心內存使用情況,所有進程都完全隔離,如果其中任何進程死亡,那么它們將自動創建而不會影響其他進程。** 但與此同時,當你嘗試擴展應用程序時,這一特性會成為程序開發的絆腳石。
>
> 但任何事都有兩面性。所有的企業級框架都要求你加載至少十二個文件,構造多個類并解析一些配置,以便處理簡單的用戶請求或查詢數據庫。最糟糕的部分是每個任務完成后,你不得不拋棄這些代碼。你剛剛啟動的所有代碼現在都變得無用,并且永遠不能拿來處理另一個請求。**若是說給任何使用 PHP 之外的開發人員聽,他們一定會對此滿臉困惑,不能理解。**
>
> 多年來,聰明的 PHP 工程師一直試圖通過使用延遲加載技術,微框架,優化良好的庫,二級緩存等技術來緩解這些問題。但是在你項目結束時,你仍然不得不扔掉你的整個流程并一遍又一遍地重新開始重復的工作。
[動靜分離架構,究竟是啥?](https://mp.weixin.qq.com/s/4lgHMBy8UJDWI69h25hN5w)
[沒有Nginx,你還能做什么?](https://t.ti-node.com/thread/6494805245070147584)
> 搞Python的同行們,除了能用Flask碼Web,也能用Tornado搞異步非阻塞,能夠運用線程池來做一些task;相比之下,作為同行的我們,似乎除了會在fpm或者apache\_mod下搞一搞增刪改查,似乎別的什么也做不了了,而且在接收新概念的時候,不太容易能接納(后半句科班生以及優秀的非科班生忽略)。
[PHP-FPM源碼分析](https://mp.weixin.qq.com/s/nT60mx1vlEKpRhvSzUZg7g)
* * * * *
last update:2019-1-23 14:54:50
- 開始
- 公益
- 更好的使用看云
- 推薦書單
- 優秀資源整理
- 技術文章寫作規范
- SublimeText - 編碼利器
- PSR-0/PSR-4命名標準
- php的多進程實驗分析
- 高級PHP
- 進程
- 信號
- 事件
- IO模型
- 同步、異步
- socket
- Swoole
- PHP擴展
- Composer
- easyswoole
- php多線程
- 守護程序
- 文件鎖
- s-socket
- aphp
- 隊列&并發
- 隊列
- 講個故事
- 如何最大效率的問題
- 訪問式的web服務(一)
- 訪問式的web服務(二)
- 請求
- 瀏覽器訪問阻塞問題
- Swoole
- 你必須理解的計算機核心概念 - 碼農翻身
- CPU阿甘 - 碼農翻身
- 異步通知,那我要怎么通知你啊?
- 實時操作系統
- 深入實時 Linux
- Redis 實現隊列
- redis與隊列
- 定時-時鐘-阻塞
- 計算機的生命
- 多進程/多線程
- 進程通信
- 拜占庭將軍問題深入探討
- JAVA CAS原理深度分析
- 隊列的思考
- 走進并發的世界
- 鎖
- 事務筆記
- 并發問題帶來的后果
- 為什么說樂觀鎖是安全的
- 內存鎖與內存事務 - 劉小兵2014
- 加鎖還是不加鎖,這是一個問題 - 碼農翻身
- 編程世界的那把鎖 - 碼農翻身
- 如何保證萬無一失
- 傳統事務與柔性事務
- 大白話搞懂什么是同步/異步/阻塞/非阻塞
- redis實現鎖
- 淺談mysql事務
- PHP異常
- php錯誤
- 文件加載
- 路由與偽靜態
- URL模式之分析
- 字符串處理
- 正則表達式
- 數組合并與+
- 文件上傳
- 常用驗證與過濾
- 記錄
- 趣圖
- foreach需要注意的問題
- Discuz!筆記
- 程序設計思維
- 抽象與具體
- 配置
- 關于如何學習的思考
- 編程思維
- 談編程
- 如何安全的修改對象
- 臨時
- 臨時筆記
- 透過問題看本質
- 程序后門
- 邊界檢查
- session
- 安全
- 王垠
- 第三方數據接口
- 驗證碼問題
- 還是少不了虛擬機
- 程序員如何談戀愛
- 程序員為什么要一直改BUG,為什么不能一次性把代碼寫好?
- 碎碎念
- 算法
- 實用代碼
- 相對私密與絕對私密
- 學習目標
- 隨記
- 編程小知識
- foo
- 落盤
- URL編碼的思考
- 字符編碼
- Elasticsearch
- TCP-IP協議
- 碎碎念2
- Grafana
- EFK、ELK
- RPC
- 依賴注入
- 開發筆記
- 經緯度格式轉換
- php時區問題
- 解決本地開發時調用遠程AIP跨域問題
- 后期靜態綁定
- 談tp的跳轉提示頁面
- 無限分類問題
- 生成微縮圖
- MVC名詞
- MVC架構
- 也許模塊不是唯一的答案
- 哈希算法
- 開發后臺
- 軟件設計架構
- mysql表字段設計
- 上傳表如何設計
- 二開心得
- awesomes-tables
- 安全的代碼部署
- 微信開發筆記
- 賬戶授權相關
- 小程序獲取是否關注其公眾號
- 支付相關
- 提交訂單
- 微信支付筆記
- 支付接口筆記
- 支付中心開發
- 下單與支付
- 支付流程設計
- 訂單與支付設計
- 敏感操作驗證
- 排序設計
- 代碼的運行環境
- 搜索關鍵字的顯示處理
- 接口異步更新ip信息
- 圖片處理
- 項目搭建
- 閱讀文檔的新方式
- mysql_insert_id并發問題思考
- 行鎖注意事項
- 細節注意
- 如何處理用戶的輸入
- 不可見的字符
- 抽獎
- 時間處理
- 應用開發實戰
- python 學習記錄
- Scrapy 教程
- Playwright 教程
- stealth.min.js
- Selenium 教程
- requests 教程
- pyautogui 教程
- Flask 教程
- PyInstaller 教程
- 蜘蛛
- python 文檔相似度驗證
- thinkphp5.0數據庫與模型的研究
- workerman進程管理
- workerman網絡分析
- java學習記錄
- docker
- 筆記
- kubernetes
- Kubernetes
- PaddlePaddle
- composer
- oneinstack
- 人工智能 AI
- 京東
- pc_detailpage_wareBusiness
- doc
- 電商網站設計
- iwebshop
- 商品規格分析
- 商品屬性分析
- tpshop
- 商品規格分析
- 商品屬性分析
- 電商表設計
- 設計記錄
- 優惠券
- 生成唯一訂單號
- 購物車技術
- 分類與類型
- 微信登錄與綁定
- 京東到家庫存系統架構設計
- crmeb
- 命名規范
- Nginx https配置
- 關于人工智能
- 從人的思考方式到二叉樹
- 架構
- 今日有感
- 文章保存
- 安全背后: 瀏覽器是如何校驗證書的
- 避不開的分布式事務
- devops自動化運維、部署、測試的最后一公里 —— ApiFox 云時代的接口管理工具
- 找到自己今生要做的事
- 自動化生活
- 開源與漿果
- Apifox: API 接口自動化測試指南