您好,登錄后才能下訂單哦!
這篇文章主要講解了“PHP連接超時(shí)如何解決”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“PHP連接超時(shí)如何解決”吧!
這里拋出一個(gè)常見(jiàn)問(wèn)題:PHP環(huán)境下腳本運(yùn)行超時(shí),尤其是處理后臺(tái)服務(wù)數(shù)據(jù)處理時(shí)經(jīng)常會(huì)遇到。
Maximum execution time of 120 seconds exceeded
我們的排查思路一般從數(shù)據(jù)量開(kāi)始,主觀判斷由于程序需要處理的數(shù)據(jù)過(guò)多,造成運(yùn)行處理時(shí)間過(guò)長(zhǎng),超出了系統(tǒng)限定的腳本最大執(zhí)行時(shí)間。那么真的是處理的數(shù)據(jù)過(guò)多,還是程序?qū)懛ɑ蛘哌壿嫶嬖陲L(fēng)險(xiǎn)問(wèn)題?我們從以下幾個(gè)方面分析
1 瓶頸出現(xiàn)在數(shù)據(jù)庫(kù)層面,比如關(guān)系型或者nosql數(shù)據(jù)庫(kù)中的字段缺失,即字段拼寫錯(cuò)誤,造成數(shù)據(jù)庫(kù)查詢卡死或者數(shù)據(jù)庫(kù)數(shù)據(jù)量巨大,沒(méi)有在條件字段下建立索引。這種情況下,程序會(huì)一直等待數(shù)據(jù)庫(kù)操作的返回,腳本自然會(huì)中斷報(bào)錯(cuò)。
Read timed out after reading 0 bytes, waited for 30.000000 seconds
2 減少單次處理的數(shù)據(jù)量,避免foreach中循環(huán)操作數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)層面能夠順利讀取數(shù)據(jù),常規(guī)循環(huán)次數(shù)過(guò)多,應(yīng)用服務(wù)器與數(shù)據(jù)庫(kù)服務(wù)器IO頻率過(guò)高仍然會(huì)出現(xiàn)以上問(wèn)題。
3 程序過(guò)程中涉及到大數(shù)組的讀取,合并,組合,造成內(nèi)存過(guò)載,比如PHP的最大使用內(nèi)存是128M,而一個(gè)腳本耗時(shí)幾分鐘,使用內(nèi)存達(dá)到50M,著這樣的比例,長(zhǎng)期來(lái)看必定存在風(fēng)險(xiǎn)。
PHP內(nèi)置函數(shù)memory_get_usage()能返回當(dāng)前分配給PHP腳本的內(nèi)存量,單位是字節(jié)(byte).
memory_get_peak_usage()函數(shù)返回內(nèi)存使用峰值,getrusage()返回CUP使用情況。
第一種解決方式: 最簡(jiǎn)單,但是不持久,不合理
從配置的角度解決
腳本中設(shè)定程序執(zhí)行不超時(shí),set_time_limit(0);
內(nèi)存使用不限制,ini_set(‘memory_limit’,0);
增加腳本超時(shí)時(shí)間,合作加大內(nèi)存使用M數(shù)。
第二種解決方式對(duì)癥下藥
合理存取數(shù)據(jù),優(yōu)化數(shù)據(jù)庫(kù)結(jié)構(gòu),優(yōu)化數(shù)據(jù)存取比例和程序邏輯,通過(guò)unset釋放大數(shù)組。
索引優(yōu)化
實(shí)際例子,一張100萬(wàn)數(shù)據(jù)量的MongoDb集合增加普通的索引,即可讓一次從1o幾秒的查詢耗時(shí)降低到0.1秒以下。可以預(yù)見(jiàn)這樣的程序性能提升。
以上討論的解決方式都能正確解決問(wèn)題嗎,我們發(fā)現(xiàn)以上的解決方式都局限在同步編程模型下,更深層次深究,或許我們應(yīng)該從同步處理的思維下,轉(zhuǎn)換為異步思維。
在php-fpm模式下,php處理耗時(shí)比較長(zhǎng)任務(wù)時(shí),會(huì)發(fā)生堵塞,此時(shí)可以用異步方法,將該任務(wù)拋出,程序繼續(xù)向下執(zhí)行。
那么PHP應(yīng)用程序編程有哪些常見(jiàn)的異步處理方式
使用Redis或者其它消息中間件做中轉(zhuǎn),分離數(shù)據(jù)與程序,結(jié)合消息隊(duì)列異步處理長(zhǎng)時(shí)間的大數(shù)據(jù)耗時(shí)任務(wù)
或者引入Swool服務(wù)框架,在大并發(fā)的前提下才能感知到效果。
根據(jù)不同的業(yè)務(wù)需求做技術(shù)選擇。
感謝各位的閱讀,以上就是“PHP連接超時(shí)如何解決”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)PHP連接超時(shí)如何解決這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。