參考資料:http://marcelog.github.com/articles/swig_php_libpcap_module_c++.html
基本原理就是把現有的libpcap library透過C++寫成的interface包裝起來,並透過SWIG這個Wrapper包成PHP的Extension,讓PHP調用,原作者的程式碼相當簡單,稍微看一下應該可以懂。
環境設定
我自己的編譯環境為Ubuntu 11.10 x86_64 (64bit),PHP版本為5.3.6,因為編譯時需要除了原有的C++編譯環境與make之外,還需要安裝swig、libpcap-dev以及php5-dev等開發套件,當然php5-cli、php5-common以及libpcap-0.8等相關執行環境也都需要,我是透過apt-get直接安裝相關套件。
編譯
環境安裝好後,可直接從作者的github上面拉原始碼下來或者下載source tar ball進行編譯,但在編譯前要先設定GNUmakefile這個檔案,將編譯時相關的路徑設定正確後編譯時才能正確找到所需要的檔案。
首先PHPINC這個參數是告訴編譯器要去哪裡找到編譯PHP extension所需要的相關header檔,也就是php5-dev會裝header檔案路徑,在我的unubuntu下面為'/usr/include/php5',第二個要調整的參數為SWIG,這個參數是告訴編譯器swig的執行檔在哪裡,可以使用whereis swig來尋找swig安裝的地點,若用apt-get的話,預設會安裝為'/usr/bin/swig',指定好之後,其它參數可看你的環境進行調整,一般來說不用調也沒關係。
當所有東西都準備好後,在與GNUmakefile同一層目錄下執行make(官方README是用gmake),即可進行編譯,完成編譯後即可發現會多一個build資料夾,資料夾中會有許多個檔案,其中SimplePcap.so(Windows為SimplePcap.dll)即為已經編譯好的php extension中,可將此檔案放到你php預設的extension資料夾中,另外一隻SimplePcap.php則是呼叫此extension時需使用的class檔。
安裝
關於SimplePcap.so需要安裝到哪邊,你可以參考php.ini裡面的extension_dir這個參數設在資料夾下,直接將SimplePcap.so複製到該資料夾下面,並在php.ini裡面加上一筆extension=SimplePcap.so,因為Ubuntu跟Debian的設定比較特別,並不是在php.ini裡面設定,而是在/etc/php5/conf.d/資料夾下面加上一個SimplePcap.ini檔案,檔案內容如下:
; configuration for php SimplePcap module
extension=SimplePcap.so
執行
當安裝完成後,可以到作者原始碼中的example資料夾下面,執行php list.php,測試執行確認是否正常。
除錯
在編譯此extension的時候,其實筆者吃了不少苦頭,主因是因為GNUmakefile的ld參數中有一項-lstdc++,但是編譯時跳出找不到此stdc++的錯誤,這時你可以使用locate libstdc++.so找看看電腦中是否已安裝此library,以筆者電腦為例,下面為我電腦中所有的libstdc++.so檔案
/usr/lib/gcc/x86_64-linux-gnu/4.6/libstdc++.so
/usr/lib/i386-linux-gnu/libstdc++.so.6
/usr/lib/i386-linux-gnu/libstdc++.so.6.0.16
/usr/lib/ure/lib/libstdc++.so.6
/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
因為編譯器在尋找libstdc++時,所認定的是沒有後綴版本號的*.so檔案,所以可將所需版本的library用soft link的方式link到/usr/lib下面
ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /usr/lib/libstdc++.so
留言列表