成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

php的set_time_out和max_execution_time簡(jiǎn)單分析

_Suqin / 1244人閱讀

摘要:任何發(fā)生在諸如使用的系統(tǒng)調(diào)用,流操作,數(shù)據(jù)庫(kù)操作等的腳本執(zhí)行的最大時(shí)間不包括其中,當(dāng)該腳本已運(yùn)行。另外看到另外一句當(dāng)運(yùn)行于安全模式時(shí),此功能不能生效。除了關(guān)閉安全模式或改變中的時(shí)間限制,沒(méi)有別的辦法特地看了一眼,不是安全模式啊。。

本意

想讓一個(gè)php腳本(fpm或者cli下)通過(guò)set_time_out或者max_execution_time設(shè)置只執(zhí)行5秒。

我原想是這樣的代碼

但是cli下結(jié)果是
0
1
2
3
4
5
6
7
8
9
10

fpm也一樣。

思考之路

首先看手冊(cè)函數(shù)啊,摘超如下:

set_time_limit()函數(shù)和配置指令max_execution_time只影響腳本本身執(zhí)行的時(shí)間。任何發(fā)生在諸如使用system()的系統(tǒng)調(diào)用,流操作,數(shù)據(jù)庫(kù)操作等的腳本執(zhí)行的最大時(shí)間不包括其中,當(dāng)該腳本已運(yùn)行。在測(cè)量時(shí)間是實(shí)值的Windows中,情況就不是如此了。

仍然是一臉懵逼。
另外看到另外一句:

當(dāng)php運(yùn)行于安全模式時(shí),此功能不能生效。除了關(guān)閉安全模式或改變php.ini中的時(shí)間限制,沒(méi)有別的辦法

特地看了一眼,不是安全模式啊。。

然后百思不得,得到了大官人的耐心解答。

php zend引擎實(shí)現(xiàn)max_execute_time是使用的settimer,參數(shù)是ITIMER_PROF(也就是說(shuō)這只計(jì)算用戶態(tài)和內(nèi)核態(tài)使用的真正消耗的時(shí)間)
但是sleep是掛起進(jìn)程一段時(shí)間,并沒(méi)有執(zhí)行操作,也不存在消耗時(shí)間,所以這個(gè)sleep既不消耗內(nèi)核態(tài)時(shí)間也不消耗用戶態(tài)時(shí)間。
寫(xiě)了段C程序驗(yàn)證了一下,確實(shí)在sleep狀態(tài)下,根本沒(méi)有時(shí)間統(tǒng)計(jì),也不會(huì)觸發(fā)signal handler..

那我追一下這個(gè)settimer函數(shù)

Description
The system provides each process with three interval timers, each decrementing in a distinct time domain. When any timer expires, a signal is sent to the process, and the timer (potentially) restarts.

ITIMER_REAL
decrements in real time, and delivers SIGALRM upon expiration.

ITIMER_VIRTUAL

decrements only when the process is executing, and delivers SIGVTALRM upon expiration.

ITIMER_PROF

decrements both when the process executes and when the system is executing on behalf of the process. Coupled with ITIMER_VIRTUAL, this timer is usually used to profile the time spent by the application in user and kernel space. SIGPROF is delivered upon expiration.

看ITIMER_PROF選項(xiàng)中process executes 不就是php進(jìn)程執(zhí)行嗎?是進(jìn)程執(zhí)行沒(méi)問(wèn)題,但是sleep函數(shù)會(huì)將進(jìn)程掛起,所以sleep內(nèi)的不算了。所以,在用戶態(tài)執(zhí)行的時(shí)間,是除開(kāi)你sleep后的所有時(shí)間

果真有具體差別,那么源碼中中具體怎樣體現(xiàn)的?再追一下

main.c下追到以下

/* {{{ proto bool set_time_limit(int seconds)
   Sets the maximum time a script can run */
PHP_FUNCTION(set_time_limit)
{
    zend_long new_timeout;
    char *new_timeout_str;
    int new_timeout_strlen;
    zend_string *key;

    if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &new_timeout) == FAILURE) {
        return;
    }

    new_timeout_strlen = (int)zend_spprintf(&new_timeout_str, 0, ZEND_LONG_FMT, new_timeout);

    key = zend_string_init("max_execution_time", sizeof("max_execution_time")-1, 0);
    if (zend_alter_ini_entry_chars_ex(key, new_timeout_str, new_timeout_strlen, PHP_INI_USER, PHP_INI_STAGE_RUNTIME, 0) == SUCCESS) {
        RETVAL_TRUE;
    } else {
        RETVAL_FALSE;
    }
    zend_string_release(key);
    efree(new_timeout_str);
}

我們看key那一行的sizeof("max_execution_time")
然后追一下max_execution_time
還是再main.c下,有

        }
        if (PG(max_input_time) != -1) {
#ifdef PHP_WIN32
            zend_unset_timeout();
#endif
            zend_set_timeout(INI_INT("max_execution_time"), 0);
        }

然后再zend目錄下搜索zend_set_timeout,然后再zend_execute_api.c中找到ITIMER_PROF

就是他了!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28505.html

相關(guān)文章

  • Nginx 中 502 504 錯(cuò)誤詳解

    摘要:在使用時(shí),經(jīng)常會(huì)碰到和錯(cuò)誤,下面以來(lái)分析下這兩種常見(jiàn)錯(cuò)誤的原因和解決方案。錯(cuò)誤在和中分別有這樣兩個(gè)配置項(xiàng)和。這兩項(xiàng)都是用來(lái)配置一個(gè)腳本的最大執(zhí)行時(shí)間的。此外要注意的是的模塊中的和兩項(xiàng)。 在使用Nginx時(shí),經(jīng)常會(huì)碰到 502 Bad Gateway 和 504 Gateway Time-out 錯(cuò)誤,下面以 Nginx+PHP-FPM 來(lái)分析下這兩種常見(jiàn)錯(cuò)誤的原因和解決方案。 1. ...

    Lionad-Morotar 評(píng)論0 收藏0
  • PHP超時(shí)處理全面總結(jié)

    摘要:的毫秒級(jí)超時(shí)也有問(wèn)題。。中超時(shí)實(shí)現(xiàn)一初級(jí)最簡(jiǎn)單的超時(shí)實(shí)現(xiàn)秒級(jí)超時(shí)思路很簡(jiǎn)單鏈接一個(gè)后端,然后設(shè)置為非阻塞模式,如果沒(méi)有連接上就一直循環(huán),判斷當(dāng)前時(shí)間和超時(shí)時(shí)間之間的差異。實(shí)際處理這個(gè)調(diào)用的部件在完成后,通過(guò)狀態(tài)通知和回調(diào)來(lái)通知調(diào)用者。 概述 在PHP開(kāi)發(fā)中工作里非常多使用到超時(shí)處理到超時(shí)的場(chǎng)合,我說(shuō)幾個(gè)場(chǎng)景: 異步獲取數(shù)據(jù)如果某個(gè)后端數(shù)據(jù)源獲取不成功則跳過(guò),不影響整個(gè)頁(yè)面展現(xiàn) 為了保...

    I_Am 評(píng)論0 收藏0
  • 上傳文件專題

    摘要:默認(rèn)為即是開(kāi)文件上傳至服務(wù)器上存儲(chǔ)臨時(shí)文件的地方,如果沒(méi)指定就會(huì)用系統(tǒng)默認(rèn)的臨時(shí)文件夾望文生意,即允許上傳文件大小的最大值。 1.一般上傳文件都是利用form表單已經(jīng)提交,并且一般都是通過(guò)http協(xié)議,小編在這里決得不防試試ftp協(xié)議上傳文件2.form表單上傳,那么form表單里enctype=multipart/form-data這個(gè)元素就不可少了3.上傳 //判斷是否上傳成...

    Cympros 評(píng)論0 收藏0
  • PHPPHP調(diào)優(yōu)入門

    摘要:另外,可以在腳本的最后調(diào)用輸出當(dāng)前腳本小號(hào)的最大內(nèi)存量。根據(jù)分配的內(nèi)存總量來(lái)估算進(jìn)程數(shù)。該擴(kuò)展用于緩存操作碼。默認(rèn)情況下,駐留的字符串會(huì)隔離在各個(gè)進(jìn)程中。檢查腳本的內(nèi)容是否有變化。在腳本末尾可以叫上獲得真實(shí)的路徑緩存使用大小。 php.ini文件 有這么一個(gè)工具,可以檢查ini文件是否使用了安全方面的最佳實(shí)踐 composer require psecio/iniscan htps...

    netScorpion 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<