PHP源碼分析-PHP的生命週期_PHP教程

來源:互聯網
上載者:User
PHP的最多的兩種運行模式是WEB模式、CLI模式。

無論哪種模式,PHP工作原理都是一樣的,作為一種SAPI運行。

1、當我們在終端敲入php這個命令的時候,它使用的是CLI。

它就像一個web伺服器一樣來支援php完成這個請求,請求完成後再重新把控制權交給終端。

2、當使用Apache作為宿主時,當一個請求到來時,PHP會來支援完成這個請求。

main/php.h中定義了以下幾個宏

#define PHP_MINIT_FUNCTION ZEND_MODULE_STARTUP_D

#define PHP_MSHUTDOWN_FUNCTION ZEND_MODULE_SHUTDOWN_D

#define PHP_RINIT_FUNCTION ZEND_MODULE_ACTIVATE_D

#define PHP_RSHUTDOWN_FUNCTION ZEND_MODULE_DEACTIVATE_D

#define PHP_MINFO_FUNCTION ZEND_MODULE_INFO_D

#define PHP_GINIT_FUNCTION ZEND_GINIT_FUNCTION

#define PHP_GSHUTDOWN_FUNCTION ZEND_GSHUTDOWN_FUNCTION

對應的作用是

PHP_MINIT_FUNCTION 初始化module時運行

PHP_MSHUTDOWN_FUNCTION 當module被卸載時運行

PHP_RINIT_FUNCTION 當一個REQUEST請求初始化時運行

PHP_RSHUTDOWN_FUNCTION 當一個REQUEST請求結束時運行

PHP_MINFO_FUNCTION 這個是設定phpinfo中這個模組的資訊

PHP_GINIT_FUNCTION 初始化全域變數時

PHP_GSHUTDOWN_FUNCTION 釋放全域變數時

看一個自訂擴充案例片段:

www.2cto.com

int minit_time;

PHP_MINIT_FUNCTION(test)

{

minit_time = time(NULL);

return SUCCESS;

}

PHP_MSHUTDOWN_FUNCTION(test)

{

FILE *fp=fopen("mshutdown.txt","a+");

fprintf(fp,"%ld\n",time(NULL));//讓我們看看是不是每次請求結束都會在這個檔案裡追加資料

fclose(fp);

return SUCCESS;

}

int rinit_time;

PHP_RINIT_FUNCTION(test)

{

rinit_time = time(NULL);

return SUCCESS;

}

PHP_RSHUTDOWN_FUNCTION(test)

{

FILE *fp=fopen("rshutdown.txt","a+");

fprintf(fp,"%ld\n",time(NULL));//讓我們看看是不是每次請求結束都會在這個檔案裡追加資料

fclose(fp);

return SUCCESS;

}

PHP_MINFO_FUNCTION(test)

{

php_info_print_table_start();//調用php_write輸出HTML標籤

php_info_print_table_header(2, "module info", "enabled");

php_info_print_table_end();//調用php_write輸出HTML標籤

/* Remove comments if you have entries in php.ini

DISPLAY_INI_ENTRIES();

*/

}

//定義PHP中可以調用的函數test(),讓它在頁面裡輸出minit_time和rinit_time的值

PHP_FUNCTION(test)

{

php_printf("%d
",time_of_minit);

php_printf("%d
",time_of_rinit);

return;

}

以Apache為例,

如果在多線程的模式下工作:

在這種模式下,只有一個伺服器處理序在運行著,但會同時運行很多線程,這樣可以減少一些資源開銷,向Module init和Module shutdown就只需要運行一遍就行了,一些全域變數也只需要初始化一次,因為線程獨具的特質,使得各個請求之間方便的共用一些資料成為可能。

多線程工作方式如

如果在多進程的模式下工作:

minit_time、rinit_time的值每次請求都在變。
每次頁面請求結束都會往time_rshutdown.txt、time_mshutdown.txt中寫入資料。

下面是多進程工作模式圖:


摘自 God's blog

http://www.bkjia.com/PHPjc/478513.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/478513.htmlTechArticlePHP的最多的兩種運行模式是WEB模式、CLI模式。 無論哪種模式,PHP工作原理都是一樣的,作為一種SAPI運行。 1、當我們在終端敲入php這個命令...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.