在Java中我們可以透過JNI的方式來進行和C語言的溝通~ 而這不外乎要遵循一些共通的介面來達到~ 當然PHP也是如此~ 有興趣的話可以看看「PHP Source Code/ext」底下的一些extension,像是PDO、GD等等~ 都是這樣達成的~
所以像Youtube這樣用PHP寫成的網站還要結合後端轉檔程式該怎麼做呢?
由於筆者不是Youtube的工程師~ 恕無法提供正解~ XD
不過若要比較「完善」地結合像FFmpeg這樣的函式庫~ 那採用寫一個PHP Extension的方式倒是不錯的解決方案~
所以本文主要的訴求就在於開發一個屬於自己的Hello World的PHP Extension。
hello.c
#include "php.h" ZEND_FUNCTION(hello); zend_function_entry hellomodule_functions[] = { ZEND_FE(hello, NULL) {NULL, NULL, NULL} }; zend_module_entry hellomodule_module_entry = { STANDARD_MODULE_HEADER, "Hello Module", hellomodule_functions, NULL, NULL, NULL, NULL, NULL, NO_VERSION_YET, STANDARD_MODULE_PROPERTIES }; #if COMPILE_DL_FIRST_MODULE ZEND_GET_MODULE(hellomodule) #endif ZEND_FUNCTION(hello) { RETURN_STRING("HELLO WORLD",1); }
Compiling
先進行編譯處理~
gcc -fpic -DCOMPILE_DL_FIRST_MODULE=1 -I/usr/local/include -I. -I/usr/include/php5 -I/usr/include/php5/Zend -I/usr/include/php5//main -I/usr/include/php5/TSRM -c -o hello.o hello.c
Linking
然後產生一個Shared Object~
gcc -shared -L/usr/local/lib -rdynamic -o hello.so hello.o
掛上hello module
cp hello.so /usr/lib/php5/20060613+lfs/
修改「php.ini」,加上「extension=hello.so]~ 然後重新啟動您的Apache Server
vi /etc/php5/apache2/php.ini /etc/init.d/apache2 restart
最後用「phpinfo()」來驗證是否已掛上自己的Extension~ 成功的話會看到下圖:
測試HelloWorld
<?php echo hello(); ?>
看到畫面出現「HELLO WORLD」就成功啦! ^^
不過如果您不想那麼麻煩的掛載extension,也可以考慮用「dl()」來動態載入達成~
相關細節可以參考下述資源~
參考資源
.PHP: Creating Extensions - Manual
.PHP: Source Discussion - Manual
.Extension Writing - devzone.zend.com
類似文章
哇,自己做extension,太屌了!~~~Orz
2008-04-27 00:17:28
沒有啦~ 這篇只是提供一個讓有興趣的人更方便入門的途徑~ 以減少摸索的時間~ 我想還有很多值得探討的地方滴~ ^^
2008-04-27 09:09:17
多谢博主...最近刚好在找这方面资料-, -
2009-04-03 12:43:45
結果我一直連到這
2011-07-20 11:09:59
哈哈~ 歡迎常來啊!
世界上最遠的距離應該是如此吧... XD
2011-07-20 13:26:30
最近在做這一塊@@
2011-07-21 18:27:10
gcc -shared -L/usr/local/lib -rdynamic -o hello.so hello.o
請問我這這一段總是出現
Undefined symbols for architecture x86_64:
"__estrndup", referenced from:
_zif_hello in hello.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
是缺少哪個lib嗎?
謝謝~
2012-11-01 11:38:29
筆者沒遇過... 可能要拜一下Google or StackOverflow
http://stackoverflow.com/questions/2385735/php-error-libphp5-so-undefined-symbol-estrndup
2012-11-05 00:18:05
值得參考的文章。謝謝
2019-12-02 17:59:52