iT邦幫忙

0

PHP網站愈到Gateway Timeout,該如何延長Timeout時間?

  • 分享至 

  • xImage

我的網站等太回應超過2min就會出現Gateway Timeout,請問能從哪些設定去調整?
目前已調整的設定如下:

  1. lib/php.ini加入
max_execution_time = 600
max_input_time = 600
  1. conf/httpd.conf加入
Timeout 600
打雜工 iT邦研究生 1 級 ‧ 2021-01-29 09:36:55 檢舉
網站回應超過2min也太久了吧,你確定使用者願意等?
改Timeout時間! 我建議找出問題比較正本清源
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
3
japhenchen
iT邦超人 1 級 ‧ 2021-01-29 08:03:16

老是把timeout加大也不是辦法,你就算拖到10分鐘,要是使用者等不住直接關掉,或是日後資料量更多時跑的更慢,timeout可不是無極限拉大的啊,應該先把問題找出來
看是不是SQL查詢的方式耗費太多處理時間?那就設法精簡查詢方式,或是以ajax異步執行的方式把大量的資料分開處理,而不要全部集中在啟動頁面時加載
還是做無意義的爬別人網站的資料太久?讓客戶端久等,如果是,那把爬到的資料做成快取資料存在自己的主機上,變動不大的資料比如說台灣千大企業、上市櫃公司通訊資料,這些就不用即時去爬,做成快取一天爬一次甚至一個星期或一個月爬一次都無所謂,如果是爬股市行情,也請善用異步處理,一股一股分開查,查不到也不要直接卡死網頁,這樣就會減低timeout的機會

至於頁面連接量過大,大過你的主機或網路最大限度,看看那些連接是否都是有效連接(非惡意攻擊DDoS),如果是惡意阻絕攻擊多,那就想辦法在防火牆上設法處理,如果是正常連接但連接量過大,那就花錢提升頻寬、更新網路設備到1G或10GB級、還有伺服器的處理器、記憶體,作業系統版本、MY/MSSQL的最大可連接數也是你要考量的對象

看更多先前的回應...收起先前的回應...
eric1223 iT邦新手 5 級 ‧ 2021-01-29 09:41:21 檢舉

您好
感謝您的提醒,但我遇到的情況如下:
網站執行某個動作後會發出請求,對方收到請求後,處理完成會回傳處理結果,我的網站收到結果後顯示到網頁上。
但是對方執行的動作中包含將資料插入資料庫,而資料庫分布在全球,每次更新資料庫都會需要一點時間,這部分我無法做調整,所以我只能先延長timeout,確保User使用是正常。

另外,這個網站有測試環境,只有我在使用,與正式環境一樣,發出請求後等待2min都會出現time-out,所以應該不是惡意攻擊或連線數飽和,其他硬體配置、MySQL連線數也沒有超出限制。

再麻煩各位提供可能的解決方案,謝謝

是否可以把這個Request做成async處理?

eric1223 iT邦新手 5 級 ‧ 2021-01-29 10:00:24 檢舉

可以做成非同步處理,但對方的回傳結果需要顯示在網頁上,所以網頁還是得等到收到結果才行,那現在等不到回傳就先遇到了2min的timeout限制。
或者您是指其他的處理方式?

金流交易就真的沒辦法,timeout就觸發fail再延時幾秒再查,畫面上讓使用者看到"第N次重試等候回應"並提示可能的等候時間,不然真的怕用戶等不住直接給你按F5刷頁面或狠心關閉...eric1223

eric1223
可以請對方修改API,讓你下達更動資料庫命令和查詢執行結果兩件事分開做嗎?就像我做網頁發送簡訊的功能一樣,我對簡訊平台的API發送簡訊,只取得一個TOKEN,我會在網頁前端用個類似手機轉圈圈的圖案讓使用者等,我會每隔幾秒去平台用拿到的TOKEN輪詢傳送結果,是手機收到了呢?還是手機號碼無效?還是拒收?還是系統封鎖?
而不是在用戶發送訊息出去到API之後,讓使用者空等...
https://ithelp.ithome.com.tw/upload/images/20210129/20117954yyjR6RTjLf.jpg
https://ithelp.ithome.com.tw/upload/images/20210129/20117954fymeUht8Wo.jpghttps://ithelp.ithome.com.tw/upload/images/20210129/20117954emEPkZZsuz.jpg

劉備如果不是三顧茅蘆,而是站在門口等三天(或三個月)

可能還沒等到諸葛出山,三兄弟就先病倒了

你下達SQL INSERT或UPDATE的API命令後,射後不管,不要等回傳值,或是給對方一個接口,做CALLBACK,或之後過幾秒之後開始再去對方主機輪循..你剛剛下的指令是否成功或失敗,以非同步(異步)的方式處理

eric1223 iT邦新手 5 級 ‧ 2021-01-29 17:59:49 檢舉

我了解您的意思,這種處理方式我這邊需要重寫邏輯,讓Call API的動作放到背景或有支排程去執行,而客戶端則不用等這麼久。

我會往這方向去處理,感謝解答。

1
舜~
iT邦高手 1 級 ‧ 2021-01-29 08:52:05

PHP網站???

若是網站的話,
建議回頭檢視程式碼是否效能太差或有異常
幾個建議

  1. 部分功能拆成ajax呼叫,透過javascript達到類似平行處理的效果
  2. 回圈內不要重複執行sql
  3. 參考網路上增加PHP效能的方法XD

若是背景執行的話,可以加下面這兩行,使其可以背景執行

// Ignore user aborts and allow the script to run forever
ignore_user_abort(true);
 
// disable php time limit
set_time_limit(0);
eric1223 iT邦新手 5 級 ‧ 2021-01-29 10:13:32 檢舉

您好
兩行程式碼都測試過,還是會在2min的時候出現timeout

2

昨天本來要回應的。但喝醉了...

正常來說,你直接第一個想法,是要增加timeout的時間。
這是一個很要不得的想法。

如果主機架設評分100分。
你這個想法會直接扣50分。
甚至相關人員,會因為你這個想法。而完全不敢給你主機的操控權。

因為你這樣的想法。正是操死主機的原兇之一。

好吧,唸到這就好。
那或許你會說,我就是需要等待回應怎麼辦?
處理這種長時間等待的。你並不需要一直佔住人家門口。
你可以先回家,打電話問一下。或是等對方通知。

沒有一種金流,會需要你連著他等他1分以上的。(30秒就很危險了)
有這樣的金流的話,我一定不敢用。太可怕了。

至於如果是對岸那微啥或支啥還是寶啥的東東。
那是無解的東西。且可以的話,建議一下你的上級。不要再x下去了。
會xxx人的。

以上....頭好痛。宿醉中

看更多先前的回應...收起先前的回應...

空大總是一針見血..(我已血流成河)

j大該不會也用的卡啥寶啥的...
目前都是用轉啥的。
雲啥的雖然有客戶要求。現在一律不處理了。

因為用啥死啥「貝加立口」多。

我說啥的??懂就好,不懂可以問,但我也不會回答。
懂嘛?

我沒在處理金流的事,畢竟公司面對的客戶都是政府機關、台塑、聯電這些大廠...誰跟我們玩線上金流啊,都嘛LC或TT

至於支什麼宝的,我是有在用啊,沒遇過什麼交易過久而錯誤訊息的事,基本上是按完密碼送出,一秒完成所有交易,微X的話是很少用,需要的話都是把QRCODE傳給對岸的朋友幫我付掉,我再轉支X宝的錢給她就完成,反倒是手機操作比電腦還順暢

eric1223 iT邦新手 5 級 ‧ 2021-01-29 12:12:03 檢舉

感謝兩位大大的解說,其實我的系統比較簡單,也沒像兩位負責的這麼有重要性,就是個線上學習的管理系統,只是公司有在海外的員工,所以全球都有當地的資料庫,有的在雲上有的在地上,所以當我的系統把線上課程的資料指派出去(有支API會分送到當地的資料庫),就需要回傳是否成功的訊息,以免有漏掉。

目前來說,執行指派課程可能2-3個月才會做一次,使用頻率很低,但如果人數多或網路不穩定就一定會需要時間,我只是想避免user遇到網頁掛掉的問題,同時也想確認這個2min的timeout到底是從哪裡回報出來的?

至於對方的那支API我也正在協調中,但近期內應該很難解決 "縮短插入資料庫到回傳結果"的反應時間。

不要有「不可能」縮短這樣的想法。
這樣你就不會再進步。

一般來說,如果像你說的只是單純的插入資料。
要先來看的是,要從何下手。

插入資料的量下手。還是對方的api運做原理下手。

如果說是需要一次性好幾千萬筆的資料插入。
是否可以分批傳入??檔案性傳入?還是??

能否步進處理(需要對方配合)
背景式處理?

我用個說明
像我也曾經碰過需要超過等待幾分的情況。
我就將其動作改成cron背景式命令處理。
而前端只是單純發出指令及資料後。不等待回應。
再利用背景式運行的特性,無timeout問題。
來處理並檢查資料。

很多事情,還是會受限於硬體及環境的情況影響。
而這條路是行不通的。
要找出能行的通的方式。

如1t的東西,要求10秒內完成上下載。
這是不可能辦到的事。(雖然我說了不可能)
但是,先找出是否有其必要性一次真的需要1t上下傳。
能否分批處理,能否後進式處理.....
來達到像是10秒就完成。
還是直接加大頻寬??硬體設備??

eric1223 iT邦新手 5 級 ‧ 2021-01-29 18:00:30 檢舉

我了解您的意思,這種處理方式我這邊需要重寫邏輯,讓Call API的動作放到背景或有支排程去執行,而客戶端則不用等這麼久。

我會往這方向去處理,感謝解答。

我要發表回答

立即登入回答