亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

php腳本運行時的超時機制詳解

2020-03-22 19:09:41
字體:
來源:轉載
供稿:網友
在做php開發的時候,經常會設置max_input_time、max_execution_time,用來控制腳本的超時時間。但卻從來沒有思考過背后的原理。趁著這兩天有空,研究一下這個問題。超時配置
php的ini配置如何起作用,這是一個老生常談的話題了。首先,我們在php.ini里進行配置。當php啟動的時候(php_module_startup階段),會嘗試讀取ini文件并解析。解析過程簡單來說,是分析ini文件,提取出其中合法的鍵值對,并保存到configuration_hash表。OK,然后php會進一步調用zend_startup_extensions來啟動各個模塊(包含php Core模塊,以及所有需要加載的擴展)。各個模塊的啟動函數中,會完成REGISTER_INI_ENTRIES動作。REGISTER_INI_ENTRIES負責將模塊對應的一些配置從configuration_hash表取出,然后調用處理函數,最終將處理完的值存入模塊的globals變量。max_input_time、max_execution_time這兩個配置屬于php Core模塊。對于php Core來說,REGISTER_INI_ENTRIES依然發生在php_module_startup中。同樣屬于php Core模塊的配置還有expose_php、display_errors、memory_limit等等...示意圖如下:---- php_module_startup----------- php_request_startup---- |-- REGISTER_INI_ENTRIES |-- zend_startup_extensions | |-- zm_startup_date | | |-- REGISTER_INI_ENTRIES | |-- zm_startup_json | | |-- REGISTER_INI_ENTRIES |-- do otherthings上面說到對于不同的配置,REGISTER_INI_ENTRIES會調用不同的函數來處理。我們直接來看max_execution_time對應的函數:html' target='_blank'>static PHP_INI_MH(OnUpdateTimeout) // php啟動階段走這里 if (stage == PHP_INI_STAGE_STARTUP) { // 將超時設置保存到EG(timeout_seconds)中 EG(timeout_seconds) = atoi(new_value); return SUCCESS; // php執行過程中的ini set則走這里 zend_unset_timeout(TSRMLS_C); EG(timeout_seconds) = atoi(new_value); zend_set_timeout(EG(timeout_seconds), 0); return SUCCESS;暫時只看上半截,因為我們目前只需關注php的啟動階段,該函數行為很簡單,將max_execution_time存入了EG(timeout_seconds)。至于max_input_time,并沒有特殊的處理函數,默認是會將max_input_time存入存入PG(max_input_time)。因此,當REGISTER_INI_ENTRIES完成,發生的是:max_execution_time ---- 存入EG(timeout_seconds)max_input_time ---- 存入PG(max_input_time)請求超時控制
現在我們搞清楚php的啟動階段發生了什么,繼續來看php在實際處理請求的時候,如何管理超時。在php_request_startup函數中有如下代碼:if (PG(max_input_time) == -1) { zend_set_timeout(EG(timeout_seconds), 1);} else { zend_set_timeout(PG(max_input_time), 1);php_request_startup的時機很講究。以cgi為例,只有當php已經從CGI拿到了原始請求以及一些CGI的環境變量之后,php_request_startup才會被調用。上面這段代碼實際執行的時候,由于請求已經拿到,所以SG(request_info)處于準備就緒狀態,但是php中的$_GET,$_POST,$_FILE等超全局變量尚未生成。從代碼上理解:1、如果用戶將max_input_time配做-1,或沒有配置,那么腳本的生命周期就只受EG(timeout_seconds)約束。2、否則,請求啟動階段的超時控制,受PG(max_input_time)約束。3、zend_set_timeout函數負責設置定時器。一旦指定時間過去,定時器會通知php進程。zend_set_timeout下文會具體分析。php_request_startup完成,則進入php的實際執行階段,即php_execute_script。在php_execute_script中可以看到:// 設定執行超時if (PG(max_input_time) != -1) {#ifdef PHP_WIN32 zend_unset_timeout(TSRMLS_C); // 關閉之前的定時器#endif zend_set_timeout(INI_INT("max_execution_time"), 0);// 進入執行retval = (zend_execute_scripts(ZEND_REQUIRE TSRMLS_CC, NULL, 3, prepend_file_p, primary_file, append_file_p) == SUCCESS);OK,假如代碼執行到這里,尚未發生max_input_time超時,則會重新指定max_execution_time的超時。同樣也是采取調用zend_set_timeout,并傳入max_execution_time。特別注意一下,windows下面的需要顯式調用zend_unset_timeout關閉原來的定時器,而linux下不需要。這是由于兩個平臺的定時器實現原理不同導致的,下文也會詳細展開敘述。最后用一張圖表示超時控制的流程,左側的case表明用戶既配置了max_input_time,又配置了max_execution_time。而右側的區別在于用戶僅僅配置了max_execution_time:zend_set_timeout
前文提到,zend_set_timeout函數用來設置定時器。具體來看下實現:void zend_set_timeout(long seconds, int reset_signals) /* {{{ */ TSRMLS_FETCH(); // 賦值 EG(timeout_seconds) = seconds;#ifdef ZEND_WIN32 if(!seconds) { return; // 啟動定時器線程 if (timeout_thread_initialized == 0 && InterlockedIncrement(&timeout_thread_initialized) == 1) { /* We start up this process-wide thread here and not in zend_startup(), because if Zend * is initialized inside a DllMain(), you're not supposed to start threads from it. zend_init_timeout_thread(); // 向線程發送WM_REGISTER_ZEND_TIMEOUT消息 PostThreadMessage(timeout_thread_id, WM_REGISTER_ZEND_TIMEOUT, (WPARAM) GetCurrentThreadId(), (LPARAM) seconds);#else // linux平臺下 struct itimerval t_r; /* timeout requested */ int signo; if (seconds) { t_r.it_value.tv_sec = seconds; t_r.it_value.tv_usec = t_r.it_interval.tv_sec = t_r.it_interval.tv_usec = 0; // 設置定時器,seconds秒后會發送SIGPROF信號 setitimer(ITIMER_PROF, &t_r, NULL); signo = SIGPROF; if (reset_signals) { sigset_t sigset; // 設置SIGPROF信號對應的處理函數為zend_timeout signal(signo, zend_timeout); // 防屏蔽 sigemptyset(&sigset); sigaddset(&sigset, signo); sigprocmask(SIG_UNBLOCK, &sigset, NULL);#endif

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美亚洲另类激情另类| 永久免费看mv网站入口亚洲| 国产精品天天狠天天看| 色婷婷综合久久久久中文字幕1| 在线电影欧美日韩一区二区私密| 久久免费国产精品1| 成人免费xxxxx在线观看| 欧美性猛交xxxx乱大交极品| 日产日韩在线亚洲欧美| 国产精品精品视频一区二区三区| 亚洲国产天堂久久国产91| 久久久人成影片一区二区三区观看| 日韩av理论片| 日韩av在线一区二区| 1769国产精品| 亚洲国产一区二区三区在线观看| 中文字幕在线观看亚洲| 久久国产精品久久久久| 色综合天天综合网国产成人网| 亚洲国产精彩中文乱码av| 97国产精品免费视频| 久久网福利资源网站| 精品久久久久久中文字幕| 精品一区二区三区三区| 欧美午夜久久久| www.久久撸.com| 奇米一区二区三区四区久久| 91性高湖久久久久久久久_久久99| 国产精品久久久久久久久久东京| 亚洲午夜久久久久久久| 国产精品久久久久免费a∨大胸| 日本久久中文字幕| 久久免费视频观看| 国产成人aa精品一区在线播放| 欧美日韩另类在线| 亚洲视频在线观看网站| 一本一本久久a久久精品综合小说| 久热国产精品视频| 国产精品直播网红| 日韩精品在线免费观看| 亚洲一级免费视频| 欧洲成人午夜免费大片| 97超级碰在线看视频免费在线看| 欧美日韩国产综合视频在线观看中文| 国产综合久久久久久| 欧美大成色www永久网站婷| 97国产精品视频| 波霸ol色综合久久| 91在线观看免费观看| 青青草99啪国产免费| 国产成人精品免费久久久久| 国产亚洲精品久久久| 国内精品久久久久影院 日本资源| 懂色aⅴ精品一区二区三区蜜月| 日韩免费av片在线观看| 国内偷自视频区视频综合| 日韩高清中文字幕| 亚洲第一视频网| 黑丝美女久久久| 91久久久久久久久久久| 中文字幕亚洲图片| 亚洲精品美女久久久久| 久久久精品美女| 日本免费一区二区三区视频观看| 国产精品无码专区在线观看| 国产精品久久久久久久美男| 亚洲女人被黑人巨大进入al| 欧美成人中文字幕在线| 久久成人免费视频| 国产欧美日韩精品丝袜高跟鞋| 亚洲成人网在线观看| 美女少妇精品视频| 成人中文字幕+乱码+中文字幕| 亚洲理论电影网| 亚洲欧美激情四射在线日| 欧美野外wwwxxx| 福利二区91精品bt7086| 国产精品wwwwww| 欧美日韩高清区| 国产成人拍精品视频午夜网站| 欧美成人精品一区| 精品日本高清在线播放| 欧美精品一区三区| 亚洲欧美精品一区| 亚洲国产成人精品女人久久久| 色狠狠av一区二区三区香蕉蜜桃| 一区二区三区四区视频| 81精品国产乱码久久久久久| 在线观看国产欧美| 日韩国产在线播放| 97在线观看免费| 成人亚洲激情网| 精品国产一区二区三区在线观看| 国产97在线|亚洲| 日韩精品福利在线| 亚洲第一精品久久忘忧草社区| 日韩中文在线中文网三级| 久久久免费观看视频| 欧美一区深夜视频| 亚洲国产精品电影| 亚洲一区中文字幕| 成人午夜两性视频| 欧美成人精品一区二区| 中文字幕亚洲一区二区三区| 成人精品久久久| 国产精品美女www爽爽爽视频| 亚洲精品电影在线观看| 久久久久这里只有精品| 国产日韩欧美一二三区| 91国在线精品国内播放| 亚洲精品国产品国语在线| 国产精品h在线观看| 日韩精品免费在线视频观看| 日韩欧美在线免费观看| 97色在线视频| 奇门遁甲1982国语版免费观看高清| 亚洲二区在线播放视频| 亚洲最大福利网站| 国产精品久久久久久久久久ktv| 美女性感视频久久久| 国语自产精品视频在免费| 国产一区二区av| 亚洲一区亚洲二区亚洲三区| 97人人模人人爽人人喊中文字| 97**国产露脸精品国产| 91精品综合久久久久久五月天| 亚洲国产成人精品女人久久久| 久久久久久久久综合| 亚洲男人第一网站| 亚洲夜晚福利在线观看| 国产精品成人国产乱一区| 欧洲亚洲妇女av| 色噜噜狠狠色综合网图区| 色悠久久久久综合先锋影音下载| 亚洲天堂av在线免费| 这里精品视频免费| 一区二区三区高清国产| 高清欧美性猛交xxxx黑人猛交| 国产欧美日韩91| 国产91网红主播在线观看| 国产精品丝袜久久久久久高清| 午夜精品一区二区三区av| 韩日欧美一区二区| 久久亚洲精品中文字幕冲田杏梨| 国产美女久久精品香蕉69| 国产精品96久久久久久又黄又硬| 亚洲大胆美女视频| 91a在线视频| 亚洲精品成人免费| 成人免费淫片aa视频免费| 欧美日韩福利视频| 国产在线观看精品一区二区三区| 亚洲xxxx18| 日韩精品高清在线观看| 日韩欧美国产一区二区| 久久福利网址导航| 国产精品久久久久久久久久久久久久| 美乳少妇欧美精品| 亚洲福利视频网| 欧洲美女7788成人免费视频| 日产精品99久久久久久| 久久色精品视频| 国产一区二区三区在线视频| 国产精品电影一区|