国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

php的set_time_out和max_execution_time簡單分析

_Suqin / 1232人閱讀

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

本意

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

我原想是這樣的代碼

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

fpm也一樣。

思考之路

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

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

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

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

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

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

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

那我追一下這個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選項中process executes 不就是php進程執(zhí)行嗎?是進程執(zhí)行沒問題,但是sleep函數(shù)會將進程掛起,所以sleep內(nèi)的不算了。所以,在用戶態(tài)執(zhí)行的時間,是除開你sleep后的所有時間

果真有具體差別,那么源碼中中具體怎樣體現(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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/28505.html

相關(guān)文章

  • Nginx 中 502 504 錯誤詳解

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

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

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

    I_Am 評論0 收藏0
  • 上傳文件專題

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

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

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

    netScorpion 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<