在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
類似文章
.用Java來和C做溝通的介面 - JNI