PHP底層開發 可以理解為就是C的開發,那么簡單地說如果我們要查看某個PHP函數的底層實現怎么看呢?
需要PHP源碼包:http://www.php.net/downloads.php
主要目錄是Zend 和ext(寫擴展的目錄)
舉個栗子,如果需要查看curl_exec(),如何查看。
我們知道curl_exec 是CURl擴展中的函數,那么源碼目錄大概是src/ext/crul/
然后我們發現 interface.c 下實現了 這個PHP方法:
部分源碼如下:
PHP_FUNCTION(curl_exec)
{
??? CURLcode??? error;
??? zval??? ??? *zid;
??? php_curl??? *ch;
??? if (zend_parse_parameters(ZEND_NUM_ARGS(), "r", &zid) == FAILURE) {
??? ??? return;
??? }
??? if ((ch = (php_curl*)zend_fetch_resource(Z_RES_P(zid), le_curl_name, le_curl)) == NULL) {
??? ??? RETURN_FALSE;
??? }
??? _php_curl_verify_handlers(ch, 1);
??? _php_curl_cleanup_handle(ch);
??? error = curl_easy_perform(ch->cp);
??? SAVE_CURL_ERROR(ch, error);
???
??? if (error != CURLE_OK && error != CURLE_PARTIAL_FILE) {
??? ??? smart_str_free(&ch->handlers->write->buf);
??? ??? RETURN_FALSE;
??? }
??? if (!Z_ISUNDEF(ch->handlers->std_err)) {
??? ??? php_stream? *stream;
??? ??? stream = (php_stream*)zend_fetch_resource2_ex(&ch->handlers->std_err, NULL, php_file_le_stream(), php_file_le_pstream());
??? ??? if (stream) {
??? ??? ??? php_stream_flush(stream);
??? ??? }
??? }
??? if (ch->handlers->write->method == PHP_CURL_RETURN && ch->handlers->write->buf.s) {
??? ??? smart_str_0(&ch->handlers->write->buf);
??? ??? RETURN_STR_COPY(ch->handlers->write->buf.s);
??? }
???
??? if (ch->handlers->write->method == PHP_CURL_FILE && ch->handlers->write->fp) {
??? ??? fflush(ch->handlers->write->fp);
??? }
??? if (ch->handlers->write_header->method == PHP_CURL_FILE && ch->handlers->write_header->fp) {
??? ??? fflush(ch->handlers->write_header->fp);
??? }
??? if (ch->handlers->write->method == PHP_CURL_RETURN) {
??? ??? RETURN_EMPTY_STRING();
??? } else {
??? ??? RETURN_TRUE;
??? }
}
這就是底層源碼 了,但是我疑問的是 如果開發完擴展如何加入PHP包中生效,畢竟查看PHP Module包的時候只發現了一堆.dll文件,而且是非可讀的碼?呵呵,那是因為那是C被編譯之后的文件。
那么來看一組干貨:
windows下開發PHP擴展dll
http://www.360doc.com/content/14/0509/16/12091178_376141791.shtml

http://blog.csdn.net/evkj2013/article/details/52346792
這下就全部清晰了。