實現PHP的編譯執行分離(separating compilation and execution)

來源:互聯網
上載者:User
關鍵字 實現PHP的編譯執行分離(separating compilation and execution)

剛剛在php群內和大家聊天,應承了大家要寫一個關於如何?PHP源碼加密的文章,藉著這會QA在冒煙的機會,就這個問題,我寫點思路。

我以前的文章介紹過,ZE(Zend engine)執行一個PHP指令碼會經曆編譯->執行,只不過它每次執行都會去重新編譯PHP檔案。並沒有實現編譯和執行分離。

在ZE的編譯和執行階段,有倆個重要的函數:

ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type TSRMLS_DC);

ZEND_API void (*zend_execute)(zend_op_array *op_array TSRMLS_DC);

zend_compile_file負責將要執行的指令檔編譯成由ZE的基本指令序列構成的op codes,然後將op codes交由zend_execute執行,從而得到我們指令碼的結果。

所以,我們完全可以通過修改預設的zend_complie_file和zend_execute來實現,PHP的執行和編譯分離,進一步,我們還可以再這個基礎上實現,對我們指令碼的加密和解密。

我們通過一個PHP擴充模組來實現這個功能,首先,我們需要在模組初始化的時候:

PHP_MINIT_FUNCTION(sample)
{
  old_compile_file = zend_compile_file; //儲存現場
  old_execute = zend_execute;

  zend_compile_file = my_compile_file; //截獲
  zend_execute = my_execute;
  return SUCCESS;
}

在我們的my_compile_file中,判斷我們的檔案是否是編譯過的檔案,假設尾碼名是*.ze。

static zend_op_array *my_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC)
{
  if(strstr(file_handle->filename, ".ze") != NULL){//是編譯過的檔案。
     直接返迴文件內容.
  }
  zend_op_array *op_array;

  op_array = old_compile_file (file_handle, type TSRMLS_CC); //調用預設的compile,截獲輸出

  if(op_array){
    儲存op_array;
  }
  return op_array;
}

這樣,我們就實現了,對已經編譯檔案的支援,和對檔案編譯的支援。

然後,需要編寫我們的執行函數:

static void my_execute(zend_op_array *op_array TSRMLS_DC)
{
  old_execute(op_array TSRMLS_DC); //簡單交由預設執行函數執行。
}

也許你要問為什麼要封裝以後的執行函數,呵呵,我只是為了說明,一種方式,就是可以截獲這個東東而已。有什麼用?就看讀者你有什麼要求能通過這個方式實現了: )。

寫到這裡,你也許就明白了,如果想要對檔案加密,那麼就定義個加密檔案類型,比如*.zec,然後在my_compile_file中,判斷檔案類型,如果是加密檔案,那麼就執行解密,嘿嘿,簡單吧?

至於怎麼加密,那就要問你自己了,你想用什麼方式,但是,記住,要可逆的哦~~^_^。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.