php的擴充和嵌入--php的生命週期與變數詳述_PHP教程

來源:互聯網
上載者:User
首先開始介紹php的生命週期,瞭解一個php程式從開始運行到最後結束究竟經過怎麼樣的過程,對學習php和平時php開發應該是很重要的。

起始和關閉階段:
  • 對於php的起始和關閉階段可以分成兩層,
    • 第一層是php解譯器作為一個整體進行結構和值的初始化過程。
    • 第二層則是在每一個頁面的請求過程中。
    • 對於每個擴充而言,都會有一個初始化MINT函數,這個過程會聲明變數、類,註冊資源、流和過濾處理器,這些操作在所有的請求中都是存在的,所以可以稱為是Persistent的。一般進行如下的兩步操作:
      • REGISTER_INI_ENTRIES()
      • 初始化模組的全域變數
      • 而在頁面發出請求了之後,PHP則會建立一個包括符號表和配置值在內的作業環境,然後這次php解譯器會再次迴圈每一個擴充,調用每個擴充的RINIT初始化函數。一般RINT函數的操作如下:
        • 把globalvalue設成預設值,這些全域變數往往是每個請求都需要的,但是針對每一個請求而言都是相互獨立的。
        • 那些需要用到的變數需要放到符號表中以備調用。
        • 在這個函數中還可以記錄一下請求的相關資訊
        • 完成了請求的處理之後,如果到達了指令碼尾部或通過die() exit()推出了,那麼php通過調用RSHUTDOWN()開始清理
          • 這時候每個符號表中的變數都會被unset掉
          • 而當所有的請求都被滿足了之後,就開始針對於模組的MSHUTDOWN過程
            • 調用UNREGISTER_INI_ENTRYES(),與MINIT函數的初始化過程相互對應。php程式執行的生命週期:
              要瞭解生命週期,就必須對不同的執行方式有所涉及。php可以有幾種不同的執行方式,每種方式都有其特定的生命週期。
              • CLI:這個是從命令列執行php程式,它的生命週期最為簡單。比如在執行test.php的時候,就經曆了如下的過程
              • 圖1 CLI進行php執行的過程
              • 注意到MINIT RINIT RSHUTDOWN MSHUTDOWN都只被調用過一次,這個比較類似於瀑布式的結構。
              • 多線程的模組方式:這是最常用的一種方式,php作為APXS的模組對apache進行配合。在apache啟動的時候會fork很多的子進程。針對於多個不同的請求,配合的是多個不同的初始化與結束過程。但是對每一個線程來說,只有一個MINIT和MSHUTDOWN的調用。而每個請求都對應著自己單獨的RINIT和RSHUTDOWN。
              • 多線程的模組方式:採用多線程的方法可以避免不同的線程重複的調用MINIT/MSHUTDOWN.它具有的好處是多個請求可以共用資訊,但是請求之間的隔離要求比較高,不然容易出現變數的訪問出錯。

                Zend 安全執行緒
                php對安全執行緒的處理有專門的機制,稱為Thread Safe Resource Management(TSRM)。在進行安全執行緒和非安全執行緒聲明的時候,明顯有一些不同之處:
                • 安全執行緒的變數聲明:
                • typedef struct {
                  int sampleint;
                  char *samplestring;
                  } php_sample_globals;
                  int sample_globals_id;
                  PHP_MINIT_FUNCTION(sample)
                  {
                  ts_allocate_id(&sample_globals_id,
                  sizeof(php_sample_globals),
                  (ts_allocate_ctor) php_sample_globals_ctor,
                  (ts_allocate_dtor) php_sample_globals_dtor);
                  return SUCCESS;
                  }
                  • 從這段代碼中可以看到,在MINIT階段,需要通過ts_allocate_id函數來通知TSRM這個程式需要多少空間,TSRM會增加當前的空間消耗,並返回一個id指向線程資料池的相應部分。
                  • 而當請求要訪問資料的時候,就首先從TSRM層找到當前線程的資源集區的指標,然後加上ts_allocate_id()返回的資源id作為offset。
                  • 非安全執行緒的變數聲明:
                  • typedef struct {
                    int sampleint;
                    char *samplestring;
                    } php_sample_globals;
                    php_sample_globals sample_globals;
                    PHP_MINIT_FUNCTION(sample)
                    {
                    php_sample_globals_ctor(&sample_globals TSRMLS_CC);
                    return SUCCESS;
                    }
                    • 在非安全執行緒的情況下,只需要簡單的聲明變數,更加快速有效,資料的地址在編譯階段就可以確定,而不是像線上程安全的情況下需要運行時計算。同時它還有一個好處就是一段程式出了bug不會讓整個webserver壞掉。因此在不需要用到安全執行緒的時候,還是應該盡量使用非安全執行緒聲明方式。
                    • 為了構建安全執行緒的php,必須在編譯的時候加上--enable-maintainer-zts選項。而在程式中檢測的時候可以用#ifdef ZTS,通過這種檢測可以實現對全域變數聲明的不同處理,入下例所示:
                    • #ifdef ZTS
                      #define HELLO_G(v) TSRMG(hello_globals_id, zend_hello_globals *, v)
                      #else
                      #define HELLO_G(v) (hello_globals.v)
                      #endif

                      • 通過判斷是否啟動了安全執行緒,對變數進行了不同的聲明和訪問方式指定。
                      • 在啟用了安全執行緒之後,為了在不同的線程之間對資料進行區分,PHP會自動啟用一個tsrm_ls指標。在這個指標的協助下,各個線程的函數才能找到對應的符號表進行相應的變數讀取操作。也正是這種機制使得多個線程一起工作的時候,資料空間不會亂掉。

                        通過對php的起始和結束階段、生命週期和Zend安全執行緒的機制的瞭解,有利於後續對php擴充編譯的研究。

                        http://www.bkjia.com/PHPjc/621631.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/621631.htmlTechArticle首先開始介紹php的生命週期,瞭解一個php程式從開始運行到最後結束究竟經過怎麼樣的過程,對學習php和平時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.