記一次自寫php擴展的安裝,編寫php擴展

本文目錄一覽:

如何在windows下安裝phalcon框架php版本的擴展

第一步 百度搜索phalcon,進如phalcon的官方網站

第二步選擇 windows的對應php版本的phalcon擴展文件,需要注意辨別是不是64位 和32位

將下載下來的壓縮包解壓到windows下php/ext/目錄下,將擴展解壓釋放

在php.ini的配置中添加extension=php_phalcon.dll的擴展文件 然後點擊保存

打開php探針,沒有php探針的同學可以自己手動寫個phpinfo()的函數可以達到一樣的效果 !

如何用C語言編寫PHP擴展的詳解

1:預定義

在home目錄,也可以其他任意目錄,寫一個文件,例如caleng_module.def

內容是你希望定義的函數名以及參數:

int a(int x,int y)

string b(string str,int n)

2:到php源碼目錄的ext目錄

#cd /usr/local/php-5.4.0/ext/

執行命令,生成對應擴展目錄

#./ext_skel –extname=caleng_module –proto=/home/hm/caleng_module.def

3:修改config.m4

去掉dnl的注釋

PHP_ARG_ENABLE(caleng_module, whether to enable caleng_module support,

Make sure that the comment is aligned:

[  –enable-caleng_module           Enable caleng_module support])

4:修改caleng_module.c

代碼如下:

/* {{{ proto int a(int x, int y)

   */

PHP_FUNCTION(a)

{

int argc = ZEND_NUM_ARGS();

int x;

int y;

   int z;

if (zend_parse_parameters(argc TSRMLS_CC, “ll”, x, y) == FAILURE)

 return;

z=x+y;

 RETURN_LONG(z);

}

/* }}} */

/* {{{ proto string b(string str, int n)

   */

PHP_FUNCTION(b)

{

char *str = NULL;

   int argc = ZEND_NUM_ARGS();

   int str_len;

   long n;

   char *result;

   char *ptr;

   int result_length;

   if (zend_parse_parameters(argc TSRMLS_CC, “sl”, str, str_len, n) == FAILURE)

       return;

   result_length = str_len * n;

   result = (char *) emalloc(result_length + 1);

   ptr = result;

   while (n–) {

       memcpy(ptr, str, str_len);

       ptr += str_len;

   }

   *ptr = ‘\0’;

   RETURN_STRINGL(result, result_length, 0);

}

/* }}} */

5:生成擴展庫

#cd ./caleng_module

#/usr/local/php/bin/phpize

#./configure –with-php-config=/usr/local/php/bin/php-config

#make

#make install

6:到php的對應extensions目錄

如上圖所示

#cd /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/

改目錄下有生成的caleng_module.so文件

7:修改php.ini

php.ini如果找不到可以從phpinfo()打出的信息看到

#cd /usr/local/php/lib/

php.ini增加擴展信息

extension=caleng_module.so

8:重啟Apache

# /usr/local/apache2/bin/apachectl restart

9:檢查加載

/usr/local/php/bin/php -m

10:PHP調用

代碼如下:

echo a(1,2);

輸出 3  就說明成功了!

下面是原文

Linux下用C開發PHP擴展

一、首先下載PHP源碼包,假設源碼包目錄為:/software/php-5.2.13

一、首先下載PHP源碼包,假設源碼包目錄為:/software/php-5.2.13

# cd /software/php-5.2.13/ext

二、假設我們要開發一個名為caleng_module的擴展,該擴展包含兩個函數:a–處理兩個整型相加和b-處理字符串重複輸出;

1、首先編寫一個函數定義文件,該文件編寫函數原型後綴為def,假設為:caleng_module.def

int a(int x, int y)

string b(string str, int n)

2、通過擴展骨架生成器,將在ext目錄下自動建立擴展目錄caleng_module

# ./ext_skel –extname=caleng_module –proto=caleng_module.def

3、修改配置文件: # vim /software/php-5.2.13/ext/caleng_module/config.m4,將如下行的注釋標籤”dnl”去掉,修改後如下所示:

PHP_ARG_ENABLE(myfunctions, whether to enable myfunctions support,

Make sure that the comment is aligned:

[  –enable-myfunctions           Enable myfunctions support])

4、完善函數a和b的功能: # vim /software/php-5.2.13/ext/caleng_module/caleng_module.c

PHP_FUNCTION(a)

{

   int x, y, z;

   int argc = ZEND_NUM_ARGS();

   if (zend_parse_parameters(argc TSRMLS_CC, “ll”, x, y) == FAILURE)

       return;

   z = x + y;

   RETURN_LONG(z);

}

PHP_FUNCTION(b)

{

   char *str = NULL;

   int argc = ZEND_NUM_ARGS();

   int str_len;

   long n;

   char *result;

   char *ptr;

   int result_length;

   if (zend_parse_parameters(argc TSRMLS_CC, “sl”, str, str_len, n) == FAILURE)

       return;

   result_length = str_len * n;

   result = (char *) emalloc(result_length + 1);

   ptr = result;

   while (n–) {

       memcpy(ptr, str, str_len);

       ptr += str_len;

   }

   *ptr = ‘\0’;

   RETURN_STRINGL(result, result_length, 0);

}

三、編譯安裝,假設php的安裝目錄為:/usr/localhost/webserver/php

# cd /software/php-5.2.13/ext/caleng_module

# /usr/localhost/webserver/php/bin/phpize

# ./configure –with-php-config=/usr/localhost/webserver/php/bin/php-config

# make

# make install

現在將在/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613目錄下生成caleng_module.so文件

在php.ini配置文件中加入: extension=caleng_module.so.

如何安裝PHP模塊

php模塊安裝的方式

1、靜態安裝

將先將在安裝php之前先將需要安裝的程序裝上,如ftp、mhash、mcrypt……安裝完成後,解壓php安裝包,執行./configure –with-ftp –with-mhash –wth-mcrypt等等。後面具體跟的參數可以參看./configure –help查看。編譯好後,執行make make install 就行了。

2、動態安裝

而在往往我們進行編譯php時經常會忘記添加某擴展,後來想添加擴展,但是因為安裝php後又裝了一些東西如PEAR等,不想再重新裝php,於是可以採用phpize來動態加載需要安裝的模塊。

具體實現方法如下(這裡以忘記安裝pdo_mysql模塊為例):

cd /root/source/php-5.3.10/ext/pdo_mysql

/usr/local/php/bin/phpize

在安裝完mysql後,並不是進入/root/source/mysql-5.5.21目錄運行phpize,而是進入php的源文件中要增加的擴展模塊的文件目錄—也就是/root/source/php-5.3.10/ext/pdo_mysql目錄執行phpize。如果不是這樣操作的話就會提示下面的錯誤:

Cannot find config.m4.

Make sure that you run ‘/usr/local/php/bin/phpize’ in the top level source directory of the module

關於上面的這個錯誤,我不得不鄙視下網上有些自以為是的傢伙,自認為對所有的安裝操作很懂,報上面的錯誤的時候,去修改源代碼,搞的亂七八糟,誤人子弟。根本不按php官方的文檔操作。

目錄/root/source/php-5.3.10/ext/pdo_mysql ,在運行phpize命令前並沒有configure文件,只有config.m4文件。運行phpize就生成了一個可執行的configure文件。此時就可以按照下的方法編譯了:

./configure –with-php-config=/usr/bin/php-config (還可以加一些其他的參數,可通過./configure –help查看)

make

make install

編譯完成後會提示擴展模塊生成在/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626目錄。

修改php.ini文件

vi /usr/local/php/etc/php.ini

在其文件結尾加入下面的內容:

extension_dir=”/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626″

extension=pdo_mysql.so

安裝完成後,重啟php-fpm和web服務器。(因為我用的是php-fpm和tengine,如果用的是apache則也重啟相應的程序,重新加載就行了)

windows下開發並編譯PHP擴展的方法

現在就簡單說一在WINDOWS下開發PHP擴展的步驟:

首先需要準備的軟件有:

cygwin

安裝路徑e:\app\cygwin

visual

studio

C++

6.0,

修改環境變量,把已經安裝好的PHP路徑設置為環境變量。在這裡,假設我的PHP安裝目錄是:e:\app\php5.2.5,那麼我把WINDOWS環境變量後面加上這個安裝目錄。方便一會兒使用php.exe。

PHP源代碼,這裡假設為e:\c_source_code\php-5.2.5

1、修改文件

“PHP源文件目錄/ext/ext_skel_win32.php”,在這裡就是:E:\c_source_code\php-5.2.5\ext,其中主要是修改其中的cygwin路徑。$cygwin_path

=

‘e:\app\cygwin\bin’;

把$cygwin_path修改為你實際安裝cygwin的路徑。

2、在源代碼ext目錄也就是e:\c_source_code\php-5.2.5\ext下,執行

php

ext_skel_win32.php

–extname=EXT_NAME,此時會在ext目錄下生成EXT_NAME目錄,這個目錄就是我們將要進行PHP擴展開發的框架。比如你運行php.exe

ext_skel_win32.php

–extname=foo,會在ext目錄下生成foo目錄。

3、將php-root\dev\php5ts.lib拷貝至

“ext/EXT_NAME”中。比如你要開發的PHP擴展名為foo,那麼就需要把php-root\dev\php5ts.lib拷貝到PHP源文件目錄\ext\foo中。

4、修改foo.c內容,編寫我們需要的C代碼。

5、進入EXT_NAME目錄,打開EXT_NAME.dsp。

設置VC6工程,

設置菜單“組建”-“移除工程配置”,選中“Win

32

Release_TS”,

設置菜單“工程”,選中“Win

32

Release_TS”

打開Tab“連接”,設置“輸出文件名”中的目錄,

[可選]打開Tab“C/C++”,增加“預處理器定義”“,COMPILE_DL_EXT_NAME”(注意全大寫,默認加入的),取消預定義“LIBZEND_EXPORTS”(否則不可引入zend函數)。

6、設置好以後,進行編譯,會生成一個dll文件,文件名是EXT_NAME.dll,比如在我們的例子中就為foo.dll

把foo.dll拷到e:\app\ext目錄下,並在php.ini里加上一行extension=foo.dll,重啟一下apache,查看phpinfo();,會發現我們的PHP擴展foo()已經加載進來,已經可以使用這個foo擴展了。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/244072.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:59
下一篇 2024-12-12 13:00

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若服務器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27
  • PHP登錄頁面代碼實現

    本文將從多個方面詳細闡述如何使用PHP編寫一個簡單的登錄頁面。 1. PHP登錄頁面基本架構 在PHP登錄頁面中,需要包含HTML表單,用戶在表單中輸入賬號密碼等信息,提交表單後服…

    編程 2025-04-27
  • PHP與Python的比較

    本文將會對PHP與Python進行比較和對比分析,包括語法特性、優缺點等方面。幫助讀者更好地理解和使用這兩種語言。 一、語法特性 PHP語法特性: <?php // 簡單的P…

    編程 2025-04-27
  • PHP版本管理工具phpenv詳解

    在PHP項目開發過程中,我們可能需要用到不同版本的PHP環境來試驗不同的功能或避免不同版本的兼容性問題。或者我們需要在同一台服務器上同時運行多個不同版本的PHP語言。但是每次手動安…

    編程 2025-04-24
  • PHP數組去重詳解

    一、array_unique函數 array_unique是php中常用的數組去重函數,它基於值來判斷元素是否重複,具體使用方法如下: $array = array(‘a’, ‘b…

    編程 2025-04-24
  • PHP導出Excel文件

    一、PHP導出Excel文件列寬調整 當我們使用PHP導出Excel文件時,有時需要調整單元格的列寬。可以使用PHPExcel類庫中的setWidth方法來設置單元格的列寬。下面是…

    編程 2025-04-24
  • php擴展庫初探

    一、什麼是php擴展庫? PHP擴展庫(PHP extension)是一些用C語言編寫的動態鏈接庫,用於擴展PHP的功能。PHP擴展庫使得PHP可以與各種數據庫系統相連、SMTP、…

    編程 2025-04-23

發表回復

登錄後才能評論