blog.Ring.idv.tw

寫一個Hello World的PHP Extension

寫一個Hello World的PHP Extension

Java中我們可以透過JNI的方式來進行和C語言的溝通~ 而這不外乎要遵循一些共通的介面來達到~ 當然PHP也是如此~ 有興趣的話可以看看「PHP Source Code/ext」底下的一些extension,像是PDOGD等等~ 都是這樣達成的~

所以像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

2008-04-25 21:28:18

9 comments on "寫一個Hello World的PHP Extension"

  1. 1. 呈現 說:

    哇,自己做extension,太屌了!~~~Orz

    2008-04-27 00:17:28

  2. 2. Shen 說:

    沒有啦~ 這篇只是提供一個讓有興趣的人更方便入門的途徑~ 以減少摸索的時間~ 我想還有很多值得探討的地方滴~ ^^

    2008-04-27 09:09:17

  3. 3. 小野大神 說:

    多谢博主...最近刚好在找这方面资料-, -

    2009-04-03 12:43:45

  4. 4. 小凱 說:

    結果我一直連到這

    2011-07-20 11:09:59

  5. 5. Shen 說:

    哈哈~ 歡迎常來啊!
    世界上最遠的距離應該是如此吧... XD

    2011-07-20 13:26:30

  6. 6. 小凱 說:

    最近在做這一塊@@

    2011-07-21 18:27:10

  7. 7. Cesc 說:

    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

  8. 8. Shen 說:

    筆者沒遇過... 可能要拜一下Google or StackOverflow
    http://stackoverflow.com/questions/2385735/php-error-libphp5-so-undefined-symbol-estrndup

    2012-11-05 00:18:05

  9. 9. Terry 說:

    值得參考的文章。謝謝

    2019-12-02 17:59:52

Leave a Comment

Copyright (C) Ching-Shen Chen. All rights reserved.

::: 搜尋 :::

::: 分類 :::

::: 最新文章 :::

::: 最新回應 :::

::: 訂閱 :::

Atom feed
Atom Comment