導航:首頁 > 編程語言 > phpsocketepoll

phpsocketepoll

發布時間:2024-05-06 03:46:57

A. 要成為一名專業的程序員,從零開始需要怎麼一步步來比較好,要把最底層的先學精通嗎(個人認為)求學長

前言
你是否覺得自己從學校畢業的時候只做過小玩具一樣的程序?走入職場後哪怕沒有什麼經驗也可以把以下這些課外練習走一遍(朋友的抱怨:學校課程總是從理論出發,作業項目都看不出有什麼實際作用,不如從工作中的需求出發)
建議:
不要亂買書,不要亂追新技術新名詞,基礎的東西經過很長時間積累而且還會在未來至少10年通用。
回顧一下歷史,看看歷史上時間線上技術的發展,你才能明白明天會是什麼樣。
一定要動手,例子不管多麼簡單,建議至少自己手敲一遍看看是否理解了里頭的細枝末節。
一定要學會思考,思考為什麼要這樣,而不是那樣。還要舉一反三地思考。
註:你也許會很奇怪為什麼下面的東西很偏Unix/linux,這是因為我覺得Windows下的編程可能會在未來很沒有前途,原因如下:
現在的用戶界面幾乎被兩個東西主宰了,1)Web,2)移動設備iOS或Android。Windows的圖形界面不吃香了。
越來越多的企業在用成本低性能高的Linux和各種開源技術來構架其系統,Windows的成本太高了。
微軟的東西變得太快了,很不持久,他們完全是在玩弄程序員。詳情參見《Windows編程革命史》
所以,我個人認為以後的趨勢是前端是Web+移動,後端是Linux+開源。開發這邊基本上沒Windows什麼事。
啟蒙入門
1、 學習一門腳本語言,例如python/Ruby
可以讓你擺脫對底層語言的恐懼感,腳本語言可以讓你很快開發出能用得上的小程序。實踐項目:
處理文本文件,或者csv (關鍵詞 python csv, python open, python sys) 讀一個本地文件,逐行處理(例如 word count,或者處理log)
遍歷本地文件系統 (sys, os, path),例如寫一個程序統計一個目錄下所有文件大小並按各種條件排序並保存結果
跟資料庫打交道 (python sqlite),寫一個小腳本統計資料庫里條目數量
學會用各種print之類簡單粗暴的方式進行調試
學會用Google (phrase, domain, use reader to follow tech blogs)
為什麼要學腳本語言,因為他們實在是太方便了,很多時候我們需要寫點小工具或是腳本來幫我們解決問題,你就會發現正規的編程語言太難用了。
2、 用熟一種程序員的編輯器(不是IDE) 和一些基本工具
Vim / Emacs / Notepad++,學會如何配置代碼補全,外觀,外部命令等。
Source Insight (或 ctag)
使用這些東西不是為了Cool,而是這些編輯器在查看、修改代碼/配置文章/日誌會更快更有效率。
3、 熟悉Unix/Linux Shell和常見的命令行
如果你用windows,至少學會用虛擬機里的linux, vmware player是免費的,裝個Ubuntu吧
一定要少用少用圖形界面。
學會使用man來查看幫助
文件系統結構和基本操作 ls/chmod/chown/rm/find/ln/cat/mount/mkdir/tar/gzip …
學會使用一些文本操作命令 sed/awk/grep/tail/less/more …
學會使用一些管理命令 ps/top/lsof/netstat/kill/tcpmp/iptables/dd…
了解/etc目錄下的各種配置文章,學會查看/var/log下的系統日誌,以及/proc下的系統運行信息
了解正則表達式,使用正則表達式來查找文件。
對於程序員來說Unix/Linux比Windows簡單多了。(參看我四年前CSDN的博文《其實Unix很簡單》)學會使用Unix/Linux你會發現圖形界面在某些時候實在是太難用了,相當地相當地降低工作效率。
4、 學習Web基礎(HTML/CSS/JS) + 伺服器端技術 (LAMP)
未來必然是Web的世界,學習WEB基礎的最佳網站是W3School。
學習HTML基本語法
學習CSS如何選中HTML元素並應用一些基本樣式(關鍵詞:box model)
學會用 Firefox + Firebug 或 chrome 查看你覺得很炫的網頁結構,並動態修改。
學習使用javascript操縱HTML元件。理解DOM和動態網頁(Dynamic HTML: The Definitive Reference, 3rd Edition - O'Reilly Media) 網上有免費的章節,足夠用了。或參看 DOM 。
學會用 Firefox + Firebug 或 chrome 調試Javascript代碼(設置斷點,查看變數,性能,控制台等)
在一台機器上配置Apache 或 Nginx
學習php,讓後台PHP和前台HTML進行數據交互,對伺服器相應瀏覽器請求形成初步認識。實現一個表單提交和反顯的功能。
把PHP連接本地或者遠程資料庫 MySQL(MySQL 和 SQL現學現用夠了)
跟完一個名校的網路編程課程(例如:http://www.stanford.e/~ouster/cgi-bin/cs142-fall10/index.php ) 不要覺得需要多於一學期時間,大學生是全職一學期選3-5門課,你業余時間一定可以跟上
學習一個javascript庫(例如jQuery 或 ExtJS)+ Ajax (非同步讀入一個伺服器端圖片或者資料庫內容)+JSON數據格式。
HTTP: The Definitive Guide 讀完前4章你就明白你每天上網用瀏覽器的時候發生的事情了(proxy, gateway, browsers)
做個小網站(例如:一個小的留言板,支持用戶登錄,Cookie/Session,增、刪、改、查,上傳圖片附件,分頁顯示)
買個域名,租個空間,做個自己的網站。
進階加深
1、 C語言和操作系統調用
重新學C語言,理解指針和內存模型,用C語言實現一下各種經典的演算法和數據結構。推薦《計算機程序設計藝術》、《演算法導論》和《編程珠璣》。
學習(麻省理工免費課程)計算機科學和編程導論
學習(麻省理工免費課程)C語言內存管理
學習Unix/Linux系統調用(Unix高級環境編程),,了解系統層面的東西。
用這些系統知識操作一下文件系統,用戶(實現一個可以拷貝目錄樹的小程序)
用fork/wait/waitpid寫一個多進程的程序,用pthread寫一個多線程帶同步或互斥的程序。多進程多進程購票的程序。
用signal/kill/raise/alarm/pause/sigprocmask實現一個多進程間的信號量通信的程序。
學會使用gcc和gdb來編程和調試程序(參看我的《用gdb調試程序》)
學會使用makefile來編譯程序。(參看我的《跟我一起寫makefile》)
IPC和Socket的東西可以放到高級中來實踐。
學習Windows SDK編程(Windows 程序設計 ,MFC程序設計)
寫一個窗口,了解WinMain/WinProcere,以及Windows的消息機制。
寫一些程序來操作Windows SDK中的資源文件或是各種圖形控制項,以及作圖的編程。
學習如何使用MSDN查看相關的SDK函數,各種WM_消息以及一些常式。
這本書中有很多常式,在實踐中請不要照抄,試著自己寫一個自己的常式。
不用太多於精通這些東西,因為GUI正在被Web取代,主要是了解一下Windows 圖形界面的編程。@virushuo 說:「 我覺得GUI確實不那麼熱門了,但充分理解GUI工作原理是很重要的。包括移動設備開發,如果沒有基礎知識仍然很吃力。或者說移動設備開發必須理解GUI工作,或者在win那邊學,或者在mac/iOS上學」。
2、學習Java
Java 的學習主要是看經典的Core Java 《Java 核心技術編程》和《Java編程思想》(有兩卷,我僅鏈了第一卷,足夠了,因為Java的圖形界面了解就可以了)
學習JDK,學會查閱Java API Doc Java Platform SE 6
了解一下Java這種虛擬機語言和C和Python語言在編譯和執行上的差別。從C、Java、Python思考一下「跨平台」這種技術。
學會使用IDE Eclipse,使用Eclipse 編譯,調試和開發Java程序。
建一個Tomcat的網站,嘗試一下JSP/Servlet/JDBC/MySQL的Web開發。把前面所說的那個PHP的小項目試著用JSP和Servlet實現一下。
3、Web的安全與架構

學習HTML5,網上有很多很多教程,以前酷殼也介紹過很多,我在這里就不羅列了。
學習Web開發的安全問題(參考新浪微博被攻擊的這個事,以及Ruby的這篇文章)
學習HTTP Server的rewrite機制,Nginx的反向代理機制,fast-cgi(如:PHP-FPM)
學習Web的靜態頁面緩存技術。
學習Web的非同步工作流處理,數據Cache,數據分區,負載均衡,水平擴展的構架。
實踐任務:
使用HTML5的canvas 製作一些Web動畫。
嘗試在前面開發過的那個Web應用中進行SQL注入,JS注入,以及XSS攻擊。
把前面開發過的那個Web應用改成構造在Nginx + PHP-FPM + 靜態頁面緩存的網站
4、學習關系型資料庫
你可以安裝MSSQLServer或MySQL來學習資料庫。
學習教科書里資料庫設計的那幾個範式,1NF,2NF,3NF,……
學習資料庫的存過,觸發器,視圖,建索引,游標等。
學習SQL語句,明白表連接的各種概念(參看《SQL Join的圖示》)
學習如何優化資料庫查詢(參看《MySQL的優化》)
實踐任務:設計一個論壇的資料庫,至少滿足3NF,使用SQL語句查詢本周,本月的最新文章,評論最多的文章,最活躍用戶。
5、一些開發工具
學會使用SVN或Git來管理程序版本。
學會使用JUnit來對Java進行單元測試。
學習C語言和Java語言的coding standard 或 coding guideline。(我N年前寫過一篇關C語言非常簡單的文章——《編程修養》,這樣的東西你可以上網查一下,一大堆)。
推薦閱讀《代碼大全》《重構》《代碼整潔之道》
高級深入
1、C++ / Java 和面向對象
我個人以為學好C++,Java也就是舉手之勞。但是C++的學習曲線相當的陡。不過,我覺得C++是最需要學好的語言了。參看兩篇趣文「C++學習信心圖」 和「21天學好C++」
學習(麻省理工免費課程)C++面向對象編程
讀我的 「如何學好C++」中所推薦的那些書至少兩遍以上(如果你對C++的理解能夠深入到像我所寫的《C++虛函數表解析》或是《C++對象內存存局(上)(下)》,或是《C/C++返回內部靜態成員的陷阱》那就非常不錯了)
然後反思為什麼C++要干成這樣,Java則不是?你一定要學會對比C++和Java的不同。比如,Java中的初始化,垃圾回收,介面,異常,虛函數,等等。
實踐任務:
用C++實現一個BigInt,支持128位的整形的加減乘除的操作。
用C++封裝一個數據結構的容量,比如hash table。
用C++封裝並實現一個智能指針(一定要使用模板)。
《設計模式》必需一讀,兩遍以上,思考一下,這23個模式的應用場景。主要是兩點:1)鍾愛組合而不是繼承,2)鍾愛介面而不是實現。(也推薦《深入淺出設計模式》)
實踐任務:
使用工廠模式實現一個內存池。
使用策略模式製做一個類其可以把文本文件進行左對齊,右對齊和中對齊。
使用命令模式實現一個命令行計算器,並支持undo和redo。
使用修飾模式實現一個酒店的房間價格訂價策略——旺季,服務,VIP、旅行團、等影響價格的因素。
學習STL的用法和其設計概念 - 容器,演算法,迭代器,函數子。如果可能,請讀一下其源碼
實踐任務:嘗試使用面向對象、STL,設計模式、和WindowsSDK圖形編程的各種技能
做一個貪吃蛇或是俄羅斯方塊的游戲。支持不同的級別和難度。
做一個文件瀏覽器,可以瀏覽目錄下的文件,並可以對不同的文件有不同的操作,文本文件可以打開編輯,執行文件則執行之,mp3或avi文件可以播放,圖片文件可以展示圖片。
學習C++的一些類庫的設計,如: MFC(看看候捷老師的《深入淺出MFC》) ,Boost, ACE, CPPUnit,STL (STL可能會太難了,但是如果你能了解其中的設計模式和設計那就太好了,如果你能深入到我寫的《STL string類的寫時拷貝技術》那就非常不錯了,ACE需要很強在的系統知識,參見後面的「加強對系統的了解」)
Java是真正的面向對象的語言,Java的設計模式多得不能再多,也是用來學習面向對象的設計模式的最佳語言了(參看Java中的設計模式)。
推薦閱讀《Effective Java》 and 《Java解惑》
學習Java的框架,Java的框架也是多,如Spring, Hibernate,Struts 等等,主要是學習Java的設計,如IoC等。
Java的技術也是爛多,重點學習J2EE架構以及JMS, RMI, 等消息傳遞和遠程調用的技術。
學習使用Java做Web Service (官方教程在這里)
實踐任務: 嘗試在Spring或Hibernate框架下構建一個有網路的Web Service的遠程調用程序,並可以在兩個Service中通過JMS傳遞消息。
C++和Java都不是能在短時間內能學好的,C++玩是的深,Java玩的是廣,我建議兩者選一個。我個人的學習經歷是:
深究C++(我深究C/C++了十來年了)
學習Java的各種設計模式。
2、加強系統了解
重要閱讀下面的幾本書:
《Unix編程藝術》了解Unix系統領域中的設計和開發哲學、思想文化體系、原則與經驗。你一定會有一種醍醐灌頂的感覺。
《Unix網路編程卷1,套接字》這是一本看完你就明白網路編程的書。重要注意TCP、UDP,以及多路復用的系統調用select/poll/epoll的差別。
《TCP/IP詳解 卷1:協議》- 這是一本看完後你就可以當網路黑客的書。了解乙太網的的運作原理,了解TCP/IP的協議,運作原理以及如何TCP的調優。
實踐任務:
理解什麼是阻塞(同步IO),非阻塞(非同步IO),多路復用(select, poll, epoll)的IO技術。
寫一個網路聊天程序,有聊天伺服器和多個聊天客戶端(服務端用UDP對部分或所有的的聊天客戶端進Multicast或Broadcast)。
寫一個簡易的HTTP伺服器。
《Unix網路編程卷2,進程間通信》信號量,管道,共享內存,消息等各種IPC…… 這些技術好像有點老掉牙了,不過還是值得了解。
實踐任務:
主要實踐各種IPC進程序通信的方法。
嘗試寫一個管道程序,父子進程通過管道交換數據。
嘗試寫一個共享內存的程序,兩個進程通過共享內存交換一個C的結構體數組。
學習《Windows核心編程》一書。把CreateProcess,Windows線程、線程調度、線程同步(Event, 信號量,互斥量)、非同步I/O,內存管理,DLL,這幾大塊搞精通。
實踐任務:使用CreateProcess啟動一個記事本或IE,並監控該程序的運行。把前面寫過的那個簡易的HTTP服務用線程池實現一下。寫一個DLL的鉤子程序監控指定窗口的關閉事件,或是記錄某個窗口的按鍵。
有了多線程、多進程通信,TCP/IP,套接字,C++和設計模式的基本,你可以研究一下ACE了。使用ACE重寫上述的聊天程序和HTTP伺服器(帶線程池)
實踐任務:通過以上的所有知識,嘗試
寫一個服務端給客戶端傳大文件,要求把100M的帶寬用到80%以上。(注意,磁碟I/O和網路I/O可能會很有問題,想一想怎麼解決,另外,請注意網路傳輸最大單元MTU)
了解BT下載的工作原理,用多進程的方式模擬BT下載的原理。
3、系統架構
負載均衡。HASH式的,純動態式的。(可以到Google學術里搜一些關於負載均衡的文章讀讀)
多層分布式系統 – 客戶端服務結點層、計算結點層、數據cache層,數據層。J2EE是經典的多層結構。
CDN系統 – 就近訪問,內容邊緣化。
P2P式系統,研究一下BT和電驢的演算法。比如:DHT演算法。
伺服器備份,雙機備份系統(Live-Standby和Live-Live系統),兩台機器如何通過心跳監測對方?集群主結點備份。
虛擬化技術,使用這個技術,可以把操作系統當應用程序一下切換或重新配置和部署。
學習Thrift,二進制的高性能的通訊中間件,支持數據(對象)序列化和多種類型的RPC服務。
學習Hadoop。Hadoop框架中最核心的設計就是:MapRece和HDFS。MapRece的思想是由Google的一篇論文所提及而被廣為流傳的,簡單的一句話解釋MapRece就是「任務的分解與結果的匯總」。HDFS是Hadoop分布式文件系統(Hadoop Distributed File System)的縮寫,為分布式計算存儲提供了底層支持。
了解NoSQL資料庫(有人說可能是一個過渡炒作的技術),不過因為超大規模以及高並發的純動態型網站日漸成為主流,而SNS類網站在數據存取過程中有著實時性等剛性需求,這使得目前NoSQL資料庫慢慢成了人們所關注的焦點,並大有成為取代關系型資料庫而成為未來主流數據存儲模式的趨勢。當前NoSQL資料庫很多,大部分都是開源的,其中比較知名的有:MemcacheDB、Redis、Tokyo Cabinet(升級版為Kyoto Cabinet)、Flare、MongoDB、CouchDB、Cassandra、Voldemort等。

B. 幾種常見的PHP超時處理方法

【Web伺服器超時處理】

[ Apache ]
一般在性能很高的情況下,預設所有超時配置都是30秒,但是在上傳文件,或者網路速度很慢的情況下,那麼可能觸發超時操作。
目前apachefastcgiphp-fpm模式下有三個超時設置:
fastcgi超時設置:
修改的fastcgi連接配置,類似如下:

復制代碼 代碼如下:

<IfMolemod_fastcgi.c>
FastCgiExternalServer/home/forum/apache/apache_php/cgi-bin/php-cgi-socket/home/forum/php5/etc/php-fpm.sock
ScriptAlias/fcgi-bin/"/home/forum/apache/apache_php/cgi-bin/"
AddHandlerphp-fastcgi.php
Actionphp-fastcgi/fcgi-bin/php-cgi
AddTypeapplication/x-
</IfMole>

預設配置是30s,如果需要定製自己的配置,需要修改配置,比如修改為100秒:(修改後重啟apache):

復制代碼 代碼如下:

<IfMolemod_fastcgi.c>
FastCgiExternalServer/home/forum/apache/apache_php/cgi-bin/php-cgi-socket/home/forum/php5/etc/php-fpm.sock-idle-timeout100
ScriptAlias/fcgi-bin/"/home/forum/apache/apache_php/cgi-bin/"
AddHandlerphp-fastcgi.php
Actionphp-fastcgi/fcgi-bin/php-cgi
AddTypeapplication/x-
</IfMole>

如果超時會返回500錯誤,斷開跟後端php服務的連接,同時記錄一條apache錯誤日誌:
[ThuJan2718:30:152011][error][client10.81.41.110]FastCGI:commwithserver"/home/forum/apache/apache_php/cgi-bin/php-cgi"aborted:idletimeout(30sec)
[ThuJan2718:30:152011][error][client10.81.41.110]FastCGI:incompleteheaders(0bytes)receivedfromserver"/home/forum/apache/apache_php/cgi-bin/php-cgi"
其他fastcgi配置參數說明:
復制代碼 代碼如下:

IdleTimeout發呆時限
ProcessLifeTime一個進程的最長生命周期,過期之後無條件kill
MaxProcessCount最大進程個數
DefaultMinClassProcessCount每個程序啟動的最小進程個數
DefaultMaxClassProcessCount每個程序啟動的最大進程個數
IPCConnectTimeout程序響應超時時間
IPCCommTimeout與程序通訊的最長時間,上面的錯誤有可能就是這個值設置過小造成的
MaxRequestsPerProcess每個進程最多完成處理個數,達成後自殺

[ Lighttpd ]
配置:lig
Lighttpd配置中,關於超時的參數有如下幾個(篇幅考慮,只寫讀超時,寫超時參數同理):
主要涉及選項:
server.max-keep-alive-idle=5
server.max-read-idle=60
server.read-timeout=0
server.max-connection-idle=360
復制代碼 代碼如下:

#每次keep-alive的最大請求數,默認值是16
server.max-keep-alive-requests=100
#keep-alive的最長等待時間,單位是秒,默認值是5
server.max-keep-alive-idle=1200
#lighttpd的work子進程數,默認值是0,單進程運行
server.max-worker=2
#限制用戶在發送請求的過程中,最大的中間停頓時間(單位是秒),
#如果用戶在發送請求的過程中(沒發完請求),中間停頓的時間太長,lighttpd會主動斷開連接
#默認值是60(秒)
server.max-read-idle=1200
#限制用戶在接收應答的過程中,最大的中間停頓時間(單位是秒),
#如果用戶在接收應答的過程中(沒接完),中間停頓的時間太長,lighttpd會主動斷開連接
#默認值是360(秒)
server.max-write-idle=12000
#讀客戶端請求的超時限制,單位是秒,配為0表示不作限制
#設置小於max-read-idle時,read-timeout生效
server.read-timeout=0
#寫應答頁面給客戶端的超時限制,單位是秒,配為0表示不作限制
#設置小於max-write-idle時,write-timeout生效
server.write-timeout=0
#請求的處理時間上限,如果用了mod_proxy_core,那就是和後端的交互時間限制,單位是秒
server.max-connection-idle=1200

說明:
對於一個keep-alive連接上的連續請求,發送第一個請求內容的最大間隔由參數max-read-idle決定,從第二個請求起,發送請求內容的最大間隔由參數max-keep-alive-idle決定。請求間的間隔超時也由max-keep-alive-idle決定。發送請求內容的總時間超時由參數read-timeout決定。Lighttpd與後端交互數據的超時由max-connection-idle決定。
延伸閱讀:

[ Nginx ]
配置:nf
復制代碼 代碼如下:

http{
#Fastcgi:(針對後端的fastcgi生效,fastcgi不屬於proxy模式)
fastcgi_connect_timeout5;#連接超時
fastcgi_send_timeout10; #寫超時
fastcgi_read_timeout10;#讀取超時
#Proxy:(針對proxy/upstreams的生效)
proxy_connect_timeout15s;#連接超時
proxy_read_timeout24s;#讀超時
proxy_send_timeout10s; #寫超時
}

說明:
Nginx 的超時設置倒是非常清晰容易理解,上面超時針對不同工作模式,但是因為超時帶來的問題是非常多的。
延伸閱讀:
ml
ml
ml

【PHP本身超時處理】
[ PHP-fpm ]
配置:nf
復制代碼 代碼如下:

<?xmlversion="1.0"?>
<configuration>
//...
.
.
EquivalenttoPHP_FCGI_.fcgi
Usedwithanypm_style.
#php-cgi的進程數量
<valuename="max_children">128</value>
Thetimeout(inseconds)
Shouldbeusedwhen'max_execution_time'
'0s'means'off'
#php-fpm 請求執行超時時間,0s為永不超時,否則設置一個 Ns 為超時的秒數
<valuename="request_terminate_timeout">0s</value>
Thetimeout(inseconds).logfile
'0s'means'off'
<valuename="request_slowlog_timeout">0s</value>
</configuration>

說明:
在php.ini中,有一個參數max_execution_time可以設置PHP腳本的最大執行時間,但是,在php-cgi(php-fpm)中,該參數不會起效。真正能夠控制PHP腳本最大執行時:
<valuename="request_terminate_timeout">0s</value>
就是說如果是使用mod_php5.so的模式運行max_execution_time是會生效的,但是如果是php-fpm模式中運行時不生效的。
延伸閱讀:

[ PHP ]
配置:php.ini
選項:
max_execution_time=30
或者在代碼里設置:
ini_set("max_execution_time",30);
set_time_limit(30);
說明:
對當前會話生效,比如設置0一直不超時,但是如果php的safe_mode打開了,這些設置都會不生效。
效果一樣,但是具體內容需要參考php-fpm部分內容,如果php-fpm中設置了request_terminate_timeout的話,那麼max_execution_time就不生效。
【後端&介面訪問超時】
【HTTP訪問】
一般我們訪問HTTP方式很多,主要是:curl,socket,file_get_contents()等方法。
如果碰到對方伺服器一直沒有響應的時候,我們就悲劇了,很容易把整個伺服器搞死,所以在訪問http的時候也需要考慮超時的問題。
[ CURL 訪問HTTP]
CURL 是我們常用的一種比較靠譜的訪問HTTP協議介面的lib庫,性能高,還有一些並發支持的功能等。
CURL:
curl_setopt($ch,opt)可以設置一些超時的設置,主要包括:
*(重要)CURLOPT_TIMEOUT設置cURL允許執行的最長秒數。
*(重要)CURLOPT_TIMEOUT_MS設置cURL允許執行的最長毫秒數。(在cURL7.16.2中被加入。從PHP5.2.3起可使用。)
CURLOPT_CONNECTTIMEOUT在發起連接前等待的時間,如果設置為0,則無限等待。
CURLOPT_CONNECTTIMEOUT_MS嘗試連接等待的時間,以毫秒為單位。如果設置為0,則無限等待。在cURL7.16.2中被加入。從PHP5.2.3開始可用。
CURLOPT_DNS_CACHE_TIMEOUT設置在內存中保存DNS信息的時間,默認為120秒。
curl普通秒級超時:
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_TIMEOUT,60);//只需要設置一個秒的數量就可以
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
curl_setopt($ch,CURLOPT_USERAGENT,$defined_vars['HTTP_USER_AGENT']);
curl普通秒級超時使用:
curl_setopt($ch,CURLOPT_TIMEOUT,60);
curl如果需要進行毫秒超時,需要增加:
curl_easy_setopt(curl,CURLOPT_NOSIGNAL,1L);
或者是:
curl_setopt($ch,CURLOPT_NOSIGNAL,true);是可以支持毫秒級別超時設置的
curl一個毫秒級超時的例子:
復制代碼 代碼如下:

<?php
if(!isset($_GET['foo'])){
//Client
$ch=curl_init('');
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_NOSIGNAL,1);//注意,毫秒超時一定要設置這個
curl_setopt($ch,CURLOPT_TIMEOUT_MS,200);//超時毫秒,cURL7.16.2中被加入。從PHP5.2.3起可使用
$data=curl_exec($ch);
$curl_errno=curl_errno($ch);
$curl_error=curl_error($ch);
curl_close($ch);
if($curl_errno>0){
echo"cURLError($curl_errno):$curl_errorn";
}else{
echo"Datareceived:$datan";
}
}else{
//Server
sleep(10);
echo"Done.";
}
?>

其他一些技巧:
1. 按照經驗總結是:cURL版本>=libcurl/7.21.0版本,毫秒級超時是一定生效的,切記。
2. curl_multi的毫秒級超時也有問題。。單次訪問是支持ms級超時的,curl_multi並行調多個會不準
[流處理方式訪問HTTP]
除了curl,我們還經常自己使用fsockopen、或者是file操作函數來進行HTTP協議的處理,所以,我們對這塊的超時處理也是必須的。
一般連接超時可以直接設置,但是流讀取超時需要單獨處理。
自己寫代碼處理:
復制代碼 代碼如下:

$tmCurrent=gettimeofday();
$intUSGone=($tmCurrent['sec']-$tmStart['sec'])*1000000
+($tmCurrent['usec']-$tmStart['usec']);
if($intUSGone>$this->_intReadTimeoutUS){
returnfalse;
}

或者使用內置流處理函數stream_set_timeout()和stream_get_meta_data()處理:
復制代碼 代碼如下:

<?php
//Timeoutinseconds
$timeout=5;
$fp=fsockopen("",80,$errno,$errstr,$timeout);
if($fp){
fwrite($fp,"GET/HTTP/1.0rn");
fwrite($fp,"Host:rn");
fwrite($fp,"Connection:Closernrn");
stream_set_blocking($fp,true);//重要,設置為非阻塞模式
stream_set_timeout($fp,$timeout);//設置超時
$info=stream_get_meta_data($fp);
while((!feof($fp))&&(!$info['timed_out'])){
$data.=fgets($fp,4096);
$info=stream_get_meta_data($fp);
ob_flush;
flush();
}
if($info['timed_out']){
echo"ConnectionTimedOut!";
}else{
echo$data;
}
}

file_get_contents超時:
復制代碼 代碼如下:

<?php
$timeout=array(
'http'=>array(
'timeout'=>5//設置一個超時時間,單位為秒
)
);
$ctx=stream_context_create($timeout);
$text=file_get_contents("",0,$ctx);
?>

fopen超時:
復制代碼 代碼如下:

<?php
$timeout=array(
'http'=>array(
'timeout'=>5//設置一個超時時間,單位為秒
)
);
$ctx=stream_context_create($timeout);
if($fp=fopen("","r",false,$ctx)){
while($c=fread($fp,8192)){
echo$c;
}
fclose($fp);
}
?>

【MySQL】
php中的mysql客戶端都沒有設置超時的選項,mysqli和mysql都沒有,但是libmysql是提供超時選項的,只是我們在php中隱藏了而已。
那麼如何在PHP中使用這個操作捏,就需要我們自己定義一些MySQL操作常量,主要涉及的常量有:
MYSQL_OPT_READ_TIMEOUT=11;
MYSQL_OPT_WRITE_TIMEOUT=12;
這兩個,定義以後,可以使用options設置相應的值。
不過有個注意點,mysql內部實現:
1.超時設置單位為秒,最少配置1秒
2.但mysql底層的read會重試兩次,所以實際會是3秒
重試兩次+自身一次=3倍超時時間,那麼就是說最少超時時間是3秒,不會低於這個值,對於大部分應用來說可以接受,但是對於小部分應用需要優化。
查看一個設置訪問mysql超時的php實例:
復制代碼 代碼如下:

<?php
//自己定義讀寫超時常量
if(!defined('MYSQL_OPT_READ_TIMEOUT')){
define('MYSQL_OPT_READ_TIMEOUT',11);
}
if(!defined('MYSQL_OPT_WRITE_TIMEOUT')){
define('MYSQL_OPT_WRITE_TIMEOUT',12);
}
//設置超時
$mysqli=mysqli_init();
$mysqli->options(MYSQL_OPT_READ_TIMEOUT,3);
$mysqli->options(MYSQL_OPT_WRITE_TIMEOUT,1);
//連接資料庫
$mysqli->real_connect("localhost","root","root","test");
if(mysqli_connect_errno()){
printf("Connectfailed:%s/n",mysqli_connect_error());
exit();
}
//執行查詢sleep1秒不超時
printf("Hostinformation:%s/n",$mysqli->host_info);
if(!($res=$mysqli->query('selectsleep(1)'))){
echo"query1error:".$mysqli->error."/n";
}else{
echo"Query1:querysuccess/n";
}
//執行查詢sleep9秒會超時
if(!($res=$mysqli->query('selectsleep(9)'))){
echo"query2error:".$mysqli->error."/n";
}else{
echo"Query2:querysuccess/n";
}
$mysqli->close();
echo"closemysqlconnection/n";
?>

延伸閱讀:

【Memcached】
[PHP擴展]
php_memcache客戶端:
連接超時:boolMemcache::connect(string$host[,int$port[,int$timeout]])
在get和set的時候,都沒有明確的超時設置參數。
libmemcached客戶端:在php介面沒有明顯的超時參數。
說明:所以說,在PHP中訪問Memcached是存在很多問題的,需要自己hack部分操作,或者是參考網上補丁。
[C&C++訪問Memcached]
客戶端:libmemcached客戶端
說明:memcache超時配置可以配置小點,比如5,10個毫秒已經夠用了,超過這個時間還不如從資料庫查詢。
下面是一個連接和讀取set數據的超時的C++示例:
復制代碼 代碼如下:

//創建連接超時(連接到Memcached)
memcached_st*MemCacheProxy::_create_handle()
{
memcached_st*mmc=NULL;
memcached_return_tprc;
if(_mpool!=NULL){//getfrompool
mmc=memcached_pool_pop(_mpool,false,&prc);
if(mmc==NULL){
__LOG_WARNING__("MemCacheProxy","gethandlefrompoolerror[%d]",(int)prc);
}
returnmmc;
}
memcached_st*handle=memcached_create(NULL);
if(handle==NULL){
__LOG_WARNING__("MemCacheProxy","create_handleerror");
returnNULL;
}
//設置連接/讀取超時
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_HASH,MEMCACHED_HASH_DEFAULT);
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_NO_BLOCK,_noblock);//參數MEMCACHED_BEHAVIOR_NO_BLOCK為1使超時配置生效,不設置超時會不生效,關鍵時候會悲劇的,容易引起雪崩
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT,_connect_timeout);//連接超時
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_RCV_TIMEOUT,_read_timeout);//讀超時
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_SND_TIMEOUT,_send_timeout);//寫超時
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_POLL_TIMEOUT,_poll_timeout);
//設置一致hash
//memcached_behavior_set_distribution(handle,MEMCACHED_DISTRIBUTION_CONSISTENT);
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_DISTRIBUTION,MEMCACHED_DISTRIBUTION_CONSISTENT);
memcached_returnrc;
for(uinti=0;i<_server_count;i++){
rc=memcached_server_add(handle,_ips[i],_ports[i]);
if(MEMCACHED_SUCCESS!=rc){
__LOG_WARNING__("MemCacheProxy","addserver[%s:%d]failed.",_ips[i],_ports[i]);
}
}
_mpool=memcached_pool_create(handle,_min_connect,_max_connect);
if(_mpool==NULL){
__LOG_WARNING__("MemCacheProxy","create_poolerror");
returnNULL;
}
mmc=memcached_pool_pop(_mpool,false,&prc);
if(mmc==NULL){
__LOG_WARNING__("MyMemCacheProxy","gethandlefrompoolerror[%d]",(int)prc);
}
//__LOG_DEBUG__("MemCacheProxy","gethandle[%p]",handle);
returnmmc;
}
//設置一個key超時(set一個數據到memcached)
boolMemCacheProxy::_add(memcached_st*handle,unsignedint*key,constchar*value,intlen,unsignedinttimeout)
{
memcached_returnrc;
chartmp[1024];
snprintf(tmp,sizeof(tmp),"%u#%u",key[0],key[1]);
//有個timeout值
rc=memcached_set(handle,tmp,strlen(tmp),(char*)value,len,timeout,0);
if(MEMCACHED_SUCCESS!=rc){
returnfalse;
}
returntrue;
}

//Memcache讀取數據超時(沒有設置)
libmemcahed源碼中介面定義:
LIBMEMCACHED_APIchar*memcached_get(memcached_st*ptr,constchar*key,size_tkey_length,size_t*value_length,uint32_t*flags,memcached_return_t*error);
LIBMEMCACHED_APImemcached_return_tmemcached_mget(memcached_st*ptr,constchar*const*keys,constsize_t*key_length,size_tnumber_of_keys);
從介面中可以看出在讀取數據的時候,是沒有超時設置的。
延伸閱讀:

【如何實現超時】
程序中需要有超時這種功能,比如你單獨訪問一個後端Socket模塊,Socket模塊不屬於我們上面描述的任何一種的時候,它的協議也是私有的,那麼這個時候可能需要自己去實現一些超時處理策略,這個時候就需要一些處理代碼了。
[PHP中超時實現]
一、初級:最簡單的超時實現 (秒級超時)
思路很簡單:鏈接一個後端,然後設置為非阻塞模式,如果沒有連接上就一直循環,判斷當前時間和超時時間之間的差異。
phpsocket中實現原始的超時:(每次循環都當前時間去減,性能會很差,cpu佔用會較高)
復制代碼 代碼如下:

<?
$host="127.0.0.1";
$port="80";
$timeout=15;//timeoutinseconds
$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)
ordie("Unabletocreatesocketn");
socket_set_nonblock($socket) //務必設置為阻塞模式
ordie("Unabletosetnonblockonsocketn");
$time=time();
//循環的時候每次都減去相應值
while(!@socket_connect($socket,$host,$port))//如果沒有連接上就一直死循環
{
$err=socket_last_error($socket);
if($err==115||$err==114)
{
if((time()-$time)>=$timeout)//每次都需要去判斷一下是否超時了
{
socket_close($socket);
die("Connectiontimedout.n");
}
sleep(1);
continue;
}
die(socket_strerror($err)."n");
}
socket_set_block($this->socket)//還原阻塞模式
ordie("Unabletosetblockonsocketn");
?>

二、升級:使用PHP自帶非同步IO去實現(毫秒級超時)
說明:
非同步IO:非同步IO的概念和同步IO相對。當一個非同步過程調用發出後,調用者不能立刻得到結果。實際處理這個調用的部件在完成後,通過狀態、通知和回調來通知調用者。非同步IO將比特分成小組進行傳送,小組可以是8位的1個字元或更長。發送方可以在任何時刻發送這些比特組,而接收方從不知道它們會在什麼時候到達。
多路復用:復用模型是對多個IO操作進行檢測,返回可操作集合,這樣就可以對其進行操作了。這樣就避免了阻塞IO不能隨時處理各個IO和非阻塞佔用系統資源的確定。
使用socket_select()實現超時
socket_select(...,floor($timeout),ceil($timeout*1000000));
select的特點:能夠設置到微秒級別的超時!
使用socket_select()的超時代碼(需要了解一些非同步IO編程的知識去理解)
復制代碼 代碼如下:

編程 調用類 編程#
<?php
$server=newServer;
$client=newClient;
for(;;){
foreach($select->can_read(0)as$socket){
if($socket==$client->socket){
//NewClientSocket
$select->add(socket_accept($client->socket));
}
else{
//there'ssomethingtoreadon$socket
}
}
}
?>
編程 非同步多路復用IO & 超時連接處理類 編程
<?php
classselect{
var$sockets;
functionselect($sockets){
$this->sockets=array();
foreach($socketsas$socket){
$this->add($socket);
}
}
functionadd($add_socket){
array_push($this->sockets,$add_socket);
}
functionremove($remove_socket){
$sockets=array();
foreach($this->socketsas$socket){
if($remove_socket!=$socket)
$sockets[]=$socket;
}
$this->sockets=$sockets;
}
functioncan_read($timeout){
$read=$this->sockets;
socket_select($read,$write=NULL,$except=NULL,$timeout);
return$read;
}
functioncan_write($timeout){
$write=$this->sockets;
socket_select($read=NULL,$write,$except=NULL,$timeout);
return$write;
}
}
?>

[C&C++中超時實現]
一般在LinuxC/C++中,可以使用:alarm()設置定時器的方式實現秒級超時,或者:select()、poll()、epoll()之類的非同步復用IO實現毫秒級超時。也可以使用二次封裝的非同步io庫(libevent,libev)也能實現。
一、使用alarm中用信號實現超時 (秒級超時)
說明:Linux內核connect超時通常為75秒,我們可以設置更小的時間如10秒來提前從connect中返回。這里用使用信號處理機制,調用alarm,超時後產生SIGALRM信號(也可使用select實現)
用alarym秒級實現connect設置超時代碼示例:
復制代碼 代碼如下:

//信號處理函數
staticvoidconnect_alarm(intsigno)
{
debug_printf("SignalHandler");
return;
}
//alarm超時連接實現
staticvoidconn_alarm()
{
Sigfunc*sigfunc;//現有信號處理函數
sigfunc=signal(SIGALRM,connect_alarm);//建立信號處理函數connect_alarm,(如果有)保存現有的信號處理函數
inttimeout=5;
//設置鬧鍾
if(alarm(timeout)!=0){
//...鬧鍾已經設置處理
}
//進行連接操作
if(connect(m_Socket,(structsockaddr*)&addr,sizeof(addr))<0){
if(errno==EINTR){//如果錯誤號設置為EINTR,說明超時中斷了
debug_printf("Timeout");

C. php swoole 只能運行在php-cli 環境嗎

一直想寫點Swoole的東西,畢竟它重新定義了php,卻一直不知道怎麼下手寫Swoole涉及的知識點非常多,互為表裡,每次想寫都發現根本理不出一個頭緒Swoole是一個php的擴展,它的核心目的就是解決php在實現server服務中可能遇到的一系列問題,這些問題用源生的php往往並不能很高效(執行效率)的解決,一般也不會使用php來解決,所以會有說swolle重新定義的php的說法。
其實swoole也提供了一個框架,swoole framework是基於swoole extension設計的一個框架,要用好這個框架,還是要先了解swoole extension。
擴展的英文名稱是Extension,php擴展是用C語言作為開發語言,基於Zend引擎提供的API,編譯成的一個動態庫。
如果曾經做過類似動態庫調用開發的童鞋可能會更好理解一些,例如Android中的NDK開發在php的配置文件中配置好extension的屬性後,就可以引用這個動態庫了。
也就是說,swoole本身是用C語言編寫的,它可以讓php獲得一些額外的function。
然後是運行方式,swoole的許多功能都只能運行在cli模式下,而cli模式往往是很多剛接觸swoole的phper遇到的第一個問題。
有時候其實只是需要轉變一下思路
我們現在整理一下最常見的php代碼執行方式:
安裝apache、php
配置apache對那個目錄進行php解析
用瀏覽器訪問那個目錄的php文件
更多的細節這里就不提了,畢竟我相信每個phper對這個都是很熟悉的。
但這里就開始出現了第一個問題,我們知道,php是一個腳本語言,腳本語言的核心特點在於不用編譯,隨時執行,而執行腳本的工具就是解析器,而php的解析器就是zend引擎。
嚴格來說,zend並不是唯一的選擇,不過,zend是最官方的。另外,Zend Studio和Zend Engine不是同一個東西,本文中的Zend全部指Zend Engine。
換個角度講,只要有解析器,寫好的php腳本就是可以執行的,而zend引擎與apache之間並沒有絕對的關系實際上,apahce是調用了zend對php腳本進行執行,然後將執行結果輸出給了瀏覽器所以所謂cli模式(CommandLine,命令行模式),其實就是在命令行下直接調用zend引擎對php腳本進行解析並執行,並獲得程序輸出結果的php腳本執行方式。
其實php也可以作為shell腳本來使用哦,就像bash shell一樣既然問題講清楚了,在一個系統中具體怎麼操作呢?
本文以CentOS 7.5作為系統環境,swoole是針對linux系統開發的,windows下並不適用。學習swoole的一個前題是懂得基本的linux系統使用。
當安裝好php的時候,找到php的安裝目錄,如果是默認安裝的話,可以試試whereis命令# 某種簡單的方法
whereis php
> /usr/local/bin/php;
locate whereis find這些命令都可以試試,目的是找到php然後我們來寫一個最經典的php腳本:
<?php
//vi hello_cli.php
echo 'Hello PHP Cli';
編寫純php腳本時,php標簽不要封口
然後我們在shell里執行它:
/usr/local/bin/php hello_cli.php
> Hello PHP Cli
這段代碼中的第一個php,是一個可執行文件,它接受一個php腳本文件作為輸入參數,並解析執行這個php腳本文件(通過zend)。
沒有錯,第一個cli模式下的php程序就被你執行成功了!
默認情況下,php都會被安裝在了$PATH的目錄下,那就可以直接省略路徑前綴了,下文中調用php的時候,全都省略了路徑前綴。
因為swoole是pecl的項目,所以使用pecl安裝是最簡單的方法,強烈推薦第一次接觸的童鞋先使用pecl安裝,在熟悉了swoole之後,再考慮使用編譯安裝的方式以獲取更多進階功能。
pecl這個工具基本都會被安裝在與php相同的目錄下(往往也都是$PATH目錄)pecl install swoole
執行以下命令查看是否安裝成功:
php -m | grep swoole
> swoole
如果正確的輸出了swoole,那麼恭喜你,這次安裝很成功另一個常見的比較麻煩的問題是,有些童鞋的電腦里安裝了多個php,而安裝的時候沒有正確的安裝到預期的php的擴展目錄中,就會導致無法正常工作,解決方案就是弄清楚各個php安裝目錄及配置關系,選擇正確的目錄進行安裝。
其實本文還沒正式開始介紹swoole,都是在學習swoole之前的准備工作,swoole的上手門檻比一般的php應用要高的多,如果沒有網路開發和操作系統方面的一些知識,學習它並不是一件容易的事情,學習曲線很陡峭。
這句話我在群里說了無數次
很多新手會詬病swoole的手冊寫的太模糊,其實是前置知識不足,而手冊也給出了需要的前置知識列表,以下引用至官網的手冊-學習swoole需要哪些知識?
多進程/多線程
了解Linux操作系統進程和線程的概念
了解Linux進程/線程切換調度的基本知識
了解進程間通信的基本知識,如管道、UnixSocket、消息隊列、共享內存socket
了解SOCKET的基本操作如accept/connect、send/recv、close、listen、bind了解SOCKET的接收緩存區、發送緩存區、阻塞/非阻塞、超時等概念IO復用
了解select/poll/epoll
了解基於select/epoll實現的事件循環,Reactor模型了解可讀事件、可寫事件
TCP/IP網路協議
了解TCP/IP協議
了解TCP、UDP傳輸協議
調試工具
使用gdb調試Linux程序
使用strace跟蹤進程的系統調用
使用tcpmp跟蹤網路通信過程
其他Linux系統工具,如ps、lsof、top、vmstat、netstat、sar、ss等學習並理解一個新事務並不是一個容易的事情,特別對於swoole這種具備一定顛覆性的工具,要有耐心和實踐。
淡定的把手冊看完,遇到不理解的名詞學會使用搜索引擎學習,swoole的手冊其實是個大寶庫,網路開發常見的問題其實里邊都涉及到了。

D. 502 Bad Gateway

502badgateway要先找到nginx配置的路徑。
然後找到nginx所在的error日誌文件來查看具體原因。
如果是客戶端瀏覽器配置的問題,以360瀏覽器為例,出現502BadGateway可能是設置了代代理導致的。
取消瀏覽器代理之後,刷新一下就可以訪問了。
502BadGateway是一種報錯提示,這一錯誤並不意味著上游伺服器已關閉(無響應網關/代理),而是上游伺服器和網關/代理不同意的協議交換數據。
鑒於互聯網協議是相當清楚的,它往往意味著一個或兩個機器已不正確或不完全編程。

E. mysql資料庫怎麼解決高並發問題

限流演算法目前程序開發過程常用的限流演算法有兩個:漏桶演算法和令牌桶演算法。

漏桶演算法

漏桶演算法的原理比較簡單,請求進入到漏桶中,漏桶以一定的速率漏水。當請求過多時,水直接溢出。可以看出,漏桶演算法可以強制限制數據的傳輸速度。如圖所示,把請求比作是水滴,水先滴到桶里,通過漏洞並以限定的速度出水,當水來得過猛而出水不夠快時就會導致水直接溢出,即拒絕服務。

圖片來自網路

漏桶演算法和令牌桶演算法的選擇

兩者的主要區別漏桶演算法能夠強行限制處理數據的速率,不論系統是否空閑。而令牌桶演算法能夠在限制數據的平均處理速率的同時還允許某種程度的突發流量。如何理解上面的含義呢?漏桶演算法,比如系統吞吐量是 120/s,業務請求 130/s,使用漏斗限流 100/s,起到限流的作用,多餘的請求將產生等待或者丟棄。對於令牌桶演算法,每秒產生 100 個令牌,系統容量 200 個令牌。正常情況下,業務請求 100/s 時,請求能被正常被處理。當有突發流量過來比如 200 個請求時,因為系統容量有 200 個令牌可以同一時刻處理掉這 200 個請求。如果是漏桶演算法,則只能處理 100 個請求,其他的請求等待或者被丟棄。

F. Nginx錛氬熀鏈鍘熺悊綃

Nginx鐨処O閫氬父浣跨敤epoll錛宔poll鍑芥暟浣跨敤浜咺/O澶嶇敤妯″瀷銆備笌I/O闃誨炴ā鍨嬫瘮杈冿紝I/O澶嶇敤妯″瀷鐨勪紭鍔垮湪浜庡彲浠ュ悓鏃剁瓑寰呭氫釜錛堣屼笉鍙鏄涓涓錛夊楁帴瀛楁弿榪扮﹀氨緇銆侼ginx鐨別poll宸ヤ綔嫻佺▼濡備笅錛

2 . 褰撲竴涓猚lient榪炴帴鍒版潵鏃訛紝鎵鏈塧ccept鐨剋ork榪涚▼閮戒細鍙楀埌閫氱煡錛屼絾鍙鏈変竴涓榪涚▼鍙浠accept鎴愬姛錛屽叾瀹冪殑鍒欎細accept澶辮觸錛孨ginx鎻愪緵浜嗕竴鎶婂叡浜閿乤ccept_mutex鏉ヤ繚璇佸悓涓鏃跺埢鍙鏈変竴涓獁ork榪涚▼鍦╝ccept榪炴帴錛屼粠鑰岃В鍐蟲儕緹ら棶棰

鎯婄兢鐜拌薄錛氭儕緹ゆ晥搴斿氨鏄褰撲竴涓猣d鐨勪簨浠惰瑙﹀彂鏃訛紝鎵鏈夌瓑寰呰繖涓猣d鐨勭嚎紼嬫垨榪涚▼閮借鍞ら啋銆備竴鑸閮芥槸socket鐨刟ccept()浼氬艱嚧鎯婄兢錛屽緢澶氫釜榪涚▼閮絙lock鍦╯erver socket鐨刟ccept()錛屼竴浣嗘湁瀹㈡埛絝榪涙潵錛屾墍鏈夎繘紼嬬殑accept()閮戒細榪斿洖錛屼絾鏄鍙鏈変竴涓榪涚▼浼氳誨埌鏁版嵁錛屽氨鏄鎯婄兢銆
Nginx 閲囩敤accept-mutex鏉ヨВ鍐蟲儕緹ら棶棰橈細褰撲竴涓璇鋒眰鍒拌揪鐨勬椂鍊欙紝鍙鏈夌珵浜夊埌閿佺殑worker榪涚▼鎵嶄細鎯婇啋澶勭悊璇鋒眰錛屽叾浠栬繘紼嬩細緇х畫絳夊緟錛岀粨鍚 timer_solution 閰嶇疆鐨勬渶澶х殑瓚呮椂鏃墮棿緇х畫灝濊瘯鑾峰彇accept-mutex

I/O 澶嶇敤鎺ュ彛鏈塻elect 鍜 epoll 涓ょ嶆ā鍨嬶紝棣栧厛浠嬬粛涓涓嬭繖涓ょ嶆ā鍨嬬殑鎵ц屾柟寮忥細

鐢變簬緗戠粶鍝嶅簲鏃墮棿鐨勫歡榪熶嬌寰楀ぇ閲廡CP榪炴帴澶勪簬闈炴椿璺冪姸鎬侊紝浣嗚皟鐢╯elect()榪樻槸浼氬 鎵鏈夌殑socket榪涜屼竴嬈$嚎鎬ф壂鎻 錛屼細

璋冪敤涓嬈epoll_wait()鑾峰緱灝辯華鏂囦歡鎻忚堪絎︽椂錛岃繑鍥炵殑騫朵笉鏄瀹為檯鐨勬弿榪扮︼紝鑰屾槸涓涓浠h〃灝辯華鎻忚堪絎︽暟閲忕殑鍊礆紝鎷垮埌榪欎簺鍊煎幓epoll鎸囧畾鐨勪竴涓鏁扮粍涓渚濇″彇寰楃浉搴旀暟閲忕殑鏂囦歡鎻忚堪絎﹀嵆鍙錛岃繖閲屼嬌鐢ㄥ唴瀛樻槧灝勶紙mmap錛夋妧鏈錛 閬垮厤浜嗗嶅埗澶ч噺鏂囦歡鎻忚堪絎﹀甫鏉ョ殑寮閿銆

鍦╯elect/poll鏃朵唬錛屾湇鍔″櫒榪涚▼姣忔¢兘鎶婅繖100涓囦釜榪炴帴鍛婅瘔鎿嶄綔緋葷粺(浠庣敤鎴鋒佸嶅埗鍙ユ焺鏁版嵁緇撴瀯鍒板唴鏍告)錛岃╂搷浣滅郴緇熷唴鏍稿幓鏌ヨ㈣繖浜涘楁帴瀛椾笂鏄鍚︽湁浜嬩歡鍙戠敓錛岃疆璇㈠畬鍚庯紝鍐嶅皢鍙ユ焺鏁版嵁澶嶅埗鍒扮敤鎴鋒侊紝璁╂湇鍔″櫒搴旂敤紼嬪簭杞璇㈠勭悊宸插彂鐢熺殑緗戠粶浜嬩歡錛岃繖涓榪囩▼璧勬簮娑堣楄緝澶э紝鍥犳わ紝select/poll涓鑸鍙鑳藉勭悊鍑犲崈鐨勫苟鍙戣繛鎺ャ
epoll鐨勮捐″拰瀹炵幇涓巗elect瀹屽叏涓嶅悓銆俥poll閫氳繃鍦↙inux鍐呮牳涓鐢寵蜂竴涓綆鏄撶殑鏂囦歡緋葷粺錛屾妸鍘熷厛鐨剆elect/poll璋冪敤鍒嗘垚浜3涓閮ㄥ垎錛

璋冪敤epoll_create()寤虹珛涓涓猠poll瀵硅薄(鍦╡poll鏂囦歡緋葷粺涓涓鴻繖涓鍙ユ焺瀵硅薄鍒嗛厤璧勬簮)
璋冪敤epoll_ctl鍚慹poll瀵硅薄涓娣誨姞榪100涓囦釜榪炴帴鐨勫楁帴瀛
璋冪敤epoll_wait鏀墮泦鍙戠敓鐨勪簨浠剁殑榪炴帴

鍙闇瑕佸湪榪涚▼鍚鍔ㄦ椂寤虹珛涓涓猠poll瀵硅薄錛岀劧鍚庡湪闇瑕佺殑鏃跺欏悜榪欎釜epoll瀵硅薄涓娣誨姞鎴栬呭垹闄よ繛鎺ャ傚悓鏃訛紝epoll_wait鐨勬晥鐜囦篃闈炲父楂橈紝鍥犱負璋冪敤epoll_wait鏃訛紝騫舵病鏈変竴鑲¤剳鐨勫悜鎿嶄綔緋葷粺澶嶅埗榪100涓囦釜榪炴帴鐨勫彞鏌勬暟鎹錛屽唴鏍鎬篃涓嶉渶瑕佸幓閬嶅巻鍏ㄩ儴鐨勮繛鎺ャ

apache 閲囩敤鐨剆elect妯″瀷錛宯ginx閲囩敤epoll妯″瀷錛宯ginx 澶勭悊璇鋒眰鏄寮傛ラ潪闃誨炵殑錛岃宎pache鍒欐槸闃誨炲瀷鐨勶紝鍦ㄩ珮騫跺彂涓媙ginx 鑳戒繚鎸佷綆璧勬簮浣庢秷鑰楅珮鎬ц兘銆傚湪Apache+PHP錛坧refork錛夋ā寮忎笅錛屽傛灉PHP澶勭悊鎱㈡垨鑰呭墠絝鍘嬪姏寰堝ぇ鐨勬儏鍐典笅錛屽緢瀹規槗鍑虹幇Apache榪涚▼鏁伴欏崌錛屼粠鑰屾嫆緇濇湇鍔$殑鐜拌薄銆

Nginx 甯哥敤鍔熻兘

鍙傝冩枃絝狅細 http://tengine.taobao.org/book/chapter_02.html

G. php新手學習路線是怎樣的

第一階段:基礎階段(基礎PHP程序員)

重點:把LNMP搞熟練(核心是安裝配置基本操作) 目標:能夠完成基本的LNMP系統安裝,簡單配置維護;能夠做基本的簡單系統的PHP開發;能夠在PHP中型系統中支持某個PHP功能模塊的開發。

時間:完成本階段的時間因人而異,有的成長快半年一年就過了,成長慢的兩三年也有。

  1. Linux

    基本命令、操作、啟動、基本服務配置(包括rpm安裝文件,各種服務配置等);會寫簡單的shell腳本和awk/sed 腳本命令等。

  2. Nginx

    做到能夠安裝配置nginx+php,知道基本的nginx核心配置選項,知道 server/fastcgi_pass/access_log 等基礎配置,目標是能夠讓nginx+php_fpm順利工作。

  3. MySQL

    會自己搭建mysql,知道基本的mysql配置選項;知道innodb和myisam的區別,知道針對InnoDB和MyISAM兩個引擎的不同配置選項;知道基本的兩個引擎的差異和選擇上面的區別;能夠純手工編譯搭建一個MySQL資料庫並且配置好編碼等正常穩定運行;核心主旨是能夠搭建一個可運行的MySQL資料庫。

  4. PHP

    基本語法數組、字元串、資料庫、XML、Socket、GD/ImageMgk圖片處理等等;熟悉各種跟MySQL操作鏈接的api(mysql/mysqli/PDO),知道各種編碼問題的解決;知道常規熟練使用的PHP框架(ThinkPHP、Zendframework、Yii、Yaf等);了解基本MVC的運行機制和為什麼這么做,稍微知道不同的PHP框架之間的區別;能夠快速學習一個MVC框架。能夠知道開發工程中的文件目錄組織,有基本的良好的代碼結構和風格,能夠完成小系統的開發和中型系統中某個模塊的開發工作。

  5. 前端

    如果條件時間允許,可以適當學習下 HTML/CSS/JS 等相關知識,知道什麼web標准,div+css的web/wap頁面模式,知道HTML5和HTML4的區別;了解一些基本的前端只是和JS框架(jQuery之類的);了解一些基本的JavaScript編程知識;(本項不是必須項,如果有時間,稍微了解一下是可以的,不過不建議作為重點,除非個人有強烈興趣)。

  6. 系統設計

    能夠完成小型系統的基本設計,包括簡單的資料庫設計,能夠完成基本的:瀏覽器 -> Nginx+PHP -> 資料庫 架構的設計開發工作;能夠支撐每天幾十萬到數百萬流量網站的開發維護工作;

    第二階段:提高階段 (中級PHP程序員)

    重點:提高針對LNMP的技能,能夠更全面的對LNMP有熟練的應用。 目標:能夠隨時隨地搭建好LNMP環境,快速完成常規配置;能夠追查解決大部分遇到的開發和線上環境的問題;能夠獨立承擔中型系統的構架和開發工作;能夠在大型系統中承擔某個中型模塊的開發工作。

    1. Linux

    在第一階段的基礎上面,能夠流暢的使用Shell腳本來完成很多自動化的工作;awk/sed/perl 也操作的不錯,能夠完成很多文本處理和數據統計等工作;基本能夠安裝大部分非特殊的Linux程序(包括各種庫、包、第三方依賴等等,比如MongoDB/Redis/Sphinx/Luncene/SVN之類的);了解基本的Linux服務,知道如何查看Linux的性能指標數據,知道基本的Linux下面的問題跟蹤等。

    2. Nginx

    在第一階段的基礎上面,了解復雜一些的Nginx配置;包括 多核配置、events、proxy_pass,sendfile/tcp_*配置,知道超時等相關配置和性能影響;知道nginx除了web server,還能夠承擔代理伺服器、反向靜態伺服器等配置;知道基本的nginx配置調優;知道如何配置許可權、編譯一個nginx擴展到nginx;知道基本的nginx運行原理(master/worker機制,epoll),知道為什麼nginx性能比apache性能好等知識。

    3. MySQL/MongoDB

    在第一階段的基礎上面,在MySQL開發方面,掌握很多小技巧,包括常規SQL優化(group by/order by/rand優化等);除了能夠搭建MySQL,還能夠冷熱備份MySQL數據,還知道影響innodb/myisam性能的配置選項(比如key_buffer/query_cache/sort_buffer/innodb_buffer_pool_size/innodb_flush_log_at_trx_commit等),也知道這些選項配置成為多少值合適;另外也了解一些特殊的配置選項,比如 知道如何搭建mysql主從同步的環境,知道各個binlog_format的區別;知道MySQL的性能追查,包括slow_log/explain等,還能夠知道基本的索引建立處理等知識;原理方面了解基本的MySQL的架構(Server+存儲引擎),知道基本的InnoDB/MyISAM索引存儲結構和不同(聚簇索引,B樹);知道基本的InnoDB事務處理機制;了解大部分MySQL異常情況的處理方案(或者知道哪兒找到處理方案)。條件允許的情況,建議了解一下NoSQL的代表MongoDB資料庫,順便對比跟MySQL的差別,同事能夠在合適的應用場景安全謹慎的使用MongoDB,知道基本的PHP與MongoDB的結合開發。

    4. Redis/Memcached

    在大部分中型系統裡面一定會涉及到緩存處理,所以一定要了解基本的緩存;知道Memcached和Redis的異同和應用場景,能夠獨立安裝 Redis/Memcached,了解Memcahed的一些基本特性和限制,比如最大的value值,知道PHP跟他們的使用結合;Redis了解基本工作原理和使用,了解常規的數據類型,知道什麼場景應用什麼類型,了解Redis的事務等等。原理部分,能夠大概了解Memcached的內存結構(slab機制),redis就了解常用數據類型底層實現存儲結構(SDS/鏈表/SkipList/HashTable)等等,順便了解一下Redis的事務、RDB、AOF等機制更好。

    5. PHP

    除了第一階段的能力,安裝配置方面能夠隨意安裝PHP和各種第三方擴展的編譯安裝配置;了解php-fpm的大部分配置選項和含義(如max_requests/max_children/request_terminate_timeout之類的影響性能的配置),知道mod_php/fastcgi的區別;在PHP方面已經能夠熟練各種基礎技術,還包括各種深入些的PHP,包括對PHP面向對象的深入理解/SPL/語法層面的特殊特性比如反射之類的;在框架方面已經閱讀過最少一個以上常規PHP MVC框架的代碼了,知道基本PHP框架內部實現機制和設計思想;在PHP開發中已經能夠熟練使用常規的設計模式來應用開發(抽象工廠/單例/觀察者/命令鏈/策略/適配器 等模式);建議開發自己的PHP MVC框架來充分讓開發自由化,讓自己深入理解MVC模式,也讓自己能夠在業務項目開發里快速升級;熟悉PHP的各種代碼優化方法,熟悉大部分PHP安全方面問題的解決處理;熟悉基本的PHP執行的機制原理(Zend引擎/擴展基本工作機制)。

    6. C/C++

    開始涉獵一定的C/C++語言,能夠寫基本的C/C++代碼,對基本的C/C++語法熟悉(指針、數組操作、字元串、常規標准API)和數據結構(鏈表、樹、哈希、隊列)有一定的熟悉下;對Linux下面的C語言開發有基本的了解概念,會簡單的makefile文件編寫,能夠使用簡單的GCC/GDB的程序編譯簡單調試工作;對基本的網路編程有大概了解。(本項是為了向更高層次打下基礎)。

    7. 前端

    在第一階段的基礎上面,熟悉基本的HTTP協議(協議代碼200/300/400/500,基本的HTTP交互頭);條件允許,可以在深入寫出稍微優雅的HTML+CSS+JavaScript,或者能夠大致簡單使用某些前端框架(jQuery/YUI/ExtJS/RequireJS/BootStrap之類);如果條件允許,可以深入學習JavaScript編程,比如閉包機制、DOM處理;再深入些可以讀讀jQuery源碼做深入學習。(本項不做重點學習,除非對前端有興趣)。

    8. 系統設計

    能夠設計大部分中型系統的網站架構、資料庫、基本PHP框架選型;性能測試排查處理等;能夠完成類似:瀏覽器 -> CDN(Squid) -> Nginx+PHP -> 緩存 -> 資料庫 結構網站的基本設計開發維護;能夠支撐每天數百萬到千萬流量基本網站的開發維護工作;

    第三階段:高級階段 (高級PHP程序員)

    重點:除了基本的LNMP程序,還能夠在某個方向或領域有深入學習。(縱深維度發展) 目標:除了能夠完成基本的PHP業務開發,還能夠解決大部分深入復雜的技術問題,並且可以獨立設計完成中大型的系統設計和開發工作;自己能夠獨立hold深入某個技術方向,在這塊比較專業。(比如在MySQL、Nginx、PHP、Redis等等任一方向深入研究)

    1. Linux

    除了第二階段的能力,在Linux下面除了常規的操作和性能監控跟蹤,還能夠使用很多高級復雜的命令完成工作(watch/tcpmp/starce/ldd/ar等);在shell腳本方面,已經能夠編寫比較復雜的shell腳本(超過500行)來協助完成很多包括備份、自動化處理、監控等工作的shell;對awk/sed/perl 等應用已經如火純青,能夠隨意操作控制處理文本統計分析各種復雜格式的數據;對Linux內部機制有一些了解,對內核模塊載入,啟動錯誤處理等等有個基本的處理;同時對一些其他相關的東西也了解,比如NFS、磁碟管理等等;

    2. Nginx

    在第二階段的基礎上面,已經能夠把Nginx操作的很熟練,能夠對Nginx進行更深入的運維工作,比如監控、性能優化,復雜問題處理等等;看個人興趣,更多方面可以考慮側重在關於Nginx工作原理部分的深入學習,主要表現在閱讀源碼開始,比如具體的master/worker工作機制,Nginx內部的事件處理,內存管理等等;同時可以學習Nginx擴展的開發,可以定製一些自己私有的擴展;同時可以對Nginx+Lua有一定程度的了解,看看是否可以結合應用出更好模式;這個階段的要求是對Nginx原理的深入理解,可以考慮成為Nginx方向的深入專業者。

    3. MySQL/MongoDB

    在第二階段的基礎上面,在MySQL應用方面,除了之前的基本SQL優化,還能夠在完成一些復雜操作,比如大批量數據的導入導出,線上大批量數據的更改表結構或者增刪索引欄位等等高危操作;除了安裝配置,已經能夠處理更多復雜的MySQL的問題,比如各種問題的追查,主從同步延遲問題的解決、跨機房同步數據方案、MySQL高可用架構等都有涉及了解;對MySQL應用層面,對MySQL的核心關鍵技術比較熟悉,比如事務機制(隔離級別、鎖等)、對觸發器、分區等技術有一定了解和應用;對MySQL性能方面,有包括磁碟優化(SAS遷移到SSD)、伺服器優化(內存、伺服器本身配置)、除了二階段的其他核心性能優化選項(innodb_log_buffer_size/back_log/table_open_cache/thread_cache_size/innodb_lock_wait_timeout等)、連接池軟體選擇應用,對show *(show status/show profile)類的操作語句有深入了解,能夠完成大部分的性能問題追查;MySQL備份技術的深入熟悉,包括災備還原、對Binlog的深入理解,冷熱備份,多IDC備份等;在MySQL原理方面,有更多了解,比如對MySQL的工作機制開始閱讀部分源碼,比如對主從同步(復制)技術的源碼學習,或者對某個存儲引擎(MyISAM/Innodb/TokuDB)等等的源碼學習理解,如果條件允許,可以參考CSV引擎開發自己簡單的存儲引擎來保存一些數據,增強對MySQL的理解;在這個過程,如果自己有興趣,也可以考慮往DBA方向發展。MongoDB層面,可以考慮比如說在寫少讀多的情況開始在線上應用MongoDB,或者是做一些線上的數據分析處理的操作,具體場景可以按照工作來,不過核心是要更好的深入理解RMDBS和NoSQL的不同場景下面的應用,如果條件或者興趣允許,可以開始深入學習一下MongoDB的工作機制。

    4. Redis/Memcached

    在第二階段的基礎上面,能夠更深入的應用和學習。因為Memcached不是特別復雜,建議可以把源碼進行閱讀,特別是內存管理部分,方便深入理解;Redis部分,可以多做一些復雜的數據結構的應用(zset來做排行榜排序操作/事務處理用來保證原子性在秒殺類場景應用之類的使用操作);多涉及aof等同步機制的學習應用,設計一個高可用的Redis應用架構和集群;建議可以深入的學習一下Redis的源碼,把在第二階段積累的知識都可以應用上,特別可以閱讀一下包括核心事件管理、內存管理、內部核心數據結構等充分學習了解一下。如果興趣允許,可以成為一個Redis方面非常專業的使用者。

    5. PHP

    作為基礎核心技能,我們在第二階段的基礎上面,需要有更深入的學習和應用。從基本代碼應用上面來說,能夠解決在PHP開發中遇到95%的問題,了解大部分PHP的技巧;對大部分的PHP框架能夠迅速在一天內上手使用,並且了解各個主流PHP框架的優缺點,能夠迅速方便項目開發中做技術選型;在配置方面,除了常規第二階段會的知識,會了解一些比較偏門的配置選項(php auto_prepend_file/auto_append_file),包括擴展中的一些復雜高級配置和原理(比如memcached擴展配置中的memcache.hash_strategy、apc擴展配置中的apc.mmap_file_mask/apc.slam_defense/apc.file_update_protection之類的);對php的工作機制比較了解,包括php-fpm工作機制(比如php-fpm在不同配置機器下面開啟進程數量計算以及原理),對zend引擎有基本熟悉(vm/gc/stream處理),閱讀過基本的PHP內核源碼(或者閱讀過相關文章),對PHP內部機制的大部分核心數據結構(基礎類型/Array/Object)實現有了解,對於核心基礎結構(zval/hashtable/gc)有深入學習了解;能夠進行基本的PHP擴展開發,了解一些擴展開發的中高級知識(minit/rinit等),熟悉php跟apache/nginx不同的通信交互方式細節(mod_php/fastcgi);除了開發PHP擴展,可以考慮學習開發Zend擴展,從更底層去了解PHP。

    6. C/C++

    在第二階段基礎上面,能夠在C/C++語言方面有更深入的學習了解,能夠完成中小型C/C++系統的開發工作;除了基本第二階段的基礎C/C++語法和數據結構,也能夠學習一些特殊數據結構(b-tree/rb-tree/skiplist/lsm-tree/trie-tree等)方便在特殊工作中需求;在系統編程方面,熟悉多進程、多線程編程;多進程情況下面了解大部分多進程之間的通信方式,能夠靈活選擇通信方式(共享內存/信號量/管道等);多線程編程能夠良好的解決鎖沖突問題,並且能夠進行多線程程序的開發調試工作;同時對網路編程比較熟悉,了解多進程模型/多線程模型/非同步網路IO模型的差別和選型,熟悉不同非同步網路IO模型的原理和差異(select/poll/epoll/iocp等),並且熟悉常見的非同步框架(ACE/ICE/libev/libevent/libuv/Boost.ASIO等)和使用,如果閑暇也可以看看一些國產自己開發的庫(比如muo);同時能夠設計好的高並發程序架構(leader-follow/master-worker等);了解大部分C/C++後端Server開發中的問題(內存管理、日誌列印、高並發、前後端通信協議、服務監控),知道各個後端服務RPC通信問題(struct/http/thirft/protobuf等);能夠更熟絡的使用GCC和GDB來開發編譯調試程序,在線上程序core掉後能夠迅速追查跟蹤解決問題;通用模塊開發方面,可以積累或者開發一些通用的工具或庫(比如非同步網路框架、日誌庫、內存池、線程池等),不過開發後是否應用要謹慎,省的埋坑去追bug。

    7. 前端

    深入了解HTTP協議(包括各個細致協議特殊協議代碼和背後原因,比如302靜態文件緩存了,502是nginx後面php掛了之類的);除了之前的前端方面的各種框架應用整合能力,前端方面的學習如果有興趣可以更深入,表現形式是,可以自己開發一些類似jQuery的前端框架,或者開發一個富文本編輯器之類的比較瑣碎考驗JavaScript功力。

    8. 其他領域語言學習

    在基礎的PHP/C/C++語言方面有基本積累,建議在當前階段可以嘗試學習不同的編程語言,看個人興趣愛好,腳本類語言可以學學 Python/Ruby 之類的,函數式編程語言可以試試 Lisp/Haskell/Scala/Erlang 之類的,靜態語言可以試試 Java/Golang,數據統計分析可以了解了解R語言,如果想換個視角做後端業務,可以試試 Node.js還有前面提到的跟Nginx結合的Nginx_Lua等。學習不同的語言主要是提升自己的視野和解決問題手段的差異,比如會了解除了進程/線程,還有輕量級協程;比如在跨機器通信場景下面,Erlang的解決方案簡單的驚人;比如在不想選擇C/C++的情況下,還有類似高效的Erlang/Golang可用等等;主要是提升視野。

    9. 其他專業方向學習

    在本階段裡面,會除了基本的LNMP技能之外,會考慮一些其他領域知識的學習,這些都是可以的,看個人興趣和長期的目標方向。目前情況能夠選擇的領域比較多,比如、雲計算(分布式存儲、分布式計算、虛擬機等),機器學習(數據挖掘、模式識別等,應用到統計、個性化推薦),自然語言處理(中文分詞等),搜索引擎技術、圖形圖像、語音識別等等。除了這些高大上的,也有很多偏工程方面可以學習的地方,比如高性能系統、移動開發(Android/IOS)、計算機安全、嵌入式系統、硬體等方向。

    10. 系統設計

    系統設計在第二階段的基礎之上,能夠應用掌握的經驗技能,設計出比較復雜的中大型系統,能夠解決大部分線上的各種復雜系統的問題,完成類似 瀏覽器 -> CDN -> 負載均衡 ->接入層 -> Nginx+PHP -> 業務緩存 -> 資料庫 -> 各路復雜後端RPC交互(存儲後端、邏輯後端、反作弊後端、外部服務) -> 更多後端 醬紫的復雜業務;能夠支撐每天數千萬到數億流量網站的正常開發維護工作。

閱讀全文

與phpsocketepoll相關的資料

熱點內容
fw壓縮圖片 瀏覽:254
淘寶申請源碼靠譜嗎 瀏覽:870
androidupdater 瀏覽:635
c2d游戲源碼大全可復製版 瀏覽:771
電腦怎樣重置網關命令 瀏覽:411
winftplinux 瀏覽:335
推特app界面如何設置成中文 瀏覽:452
太空工程師轉子編程屬性 瀏覽:32
windowscmd關機命令 瀏覽:342
雲桌面只要伺服器裝一套軟體 瀏覽:247
電腦右鍵按到什麼導致文件夾全屏 瀏覽:454
我的世界如何製造伺服器主城 瀏覽:365
linuxssh連不上 瀏覽:297
永宏plc用什麼編程電纜 瀏覽:371
win激活命令行 瀏覽:886
新手學電腦編程語言 瀏覽:893
雲空間在哪個文件夾 瀏覽:926
編程游戲小貓抓小魚 瀏覽:790
安卓dosbox怎麼打開 瀏覽:774
伺服器無影響是怎麼回事 瀏覽:958