PHP擴展開發 第一課 爲何要寫擴展及hello world

PHP擴展開發其實很簡單.那爲何要擴展開發呢. 這裏我們以實際的案例進行對比.
第一步,進入 php源碼包   http://www.php20.com/forum.php?m ... =159&extra=page%3D1  能夠從這裏下載
第二步,進入源碼包的ext目錄 .如php

[Shell] 純文本查看 複製代碼
?
1
cd /lamp_source/php-5 .6.23 /ext ;


第三步,執行命令  git

[Shell] 純文本查看 複製代碼
?
1
. /ext_skel   --extname=hw
./ext_skel   --extname=hw Creating directory hw
Creating basic files: config.m4 config.w32 .gitignore hw.c php_hw.h CREDITS EXPERIMENTAL tests/001.phpt hw.php [done].
To use your new extension, you will have to execute the following steps:

1.  $ cd ..
2.  $ vi ext/hw/config.m4
3.  $ ./buildconf
4.  $ ./configure --[with|enable]-hw
5.  $ make
6.  $ ./sapi/cli/php -f ext/hw/hw.php
7.  $ vi ext/hw/hw.c
8.  $ make


第四步,按提示   進入擴展目錄   shell

[Shell] 純文本查看 複製代碼
?
1
cd /lamp_source/php-5 .6.23 /ext/hw ;

而後vi hw.c  修改代碼以下
搜索 PHP_FUNCTION  找到 PHP_FUNCTION(confirm_hw_compiled)這行代碼. 在這個函數前增長如下兩個函數api

[C] 純文本查看 複製代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
PHP_FUNCTION(add1)
{
         int i, rs;
         for (i = 0; i < 10000000; i++)
         {
                 rs = i + 1;
         }
         RETURN_LONG(rs);
}
PHP_FUNCTION(multiplication1)
{
         int i,rs;
         for (i = 0;i < 10000000; i++)
         {
                 rs = i * 2;
         }
         RETURN_LONG(rs);
}

保存,
再搜索 PHP_FE找到下面的代碼函數

[C] 純文本查看 複製代碼
?
1
2
3
const zend_function_entry hw_functions[] = {
         PHP_FE(confirm_hw_compiled,     NULL)           /* For testing, remove later. */
         PHP_FE_END      /* Must be the last line in hw_functions[] */



中間加上  
        PHP_FE(add1,NULL)
        PHP_FE(multiplication1,NULL)

結果 以下php-fpm

[C] 純文本查看 複製代碼
?
1
2
3
4
5
const zend_function_entry hw_functions[] = {
         PHP_FE(confirm_hw_compiled,     NULL)           /* For testing, remove later. */
         PHP_FE(add1,NULL)
         PHP_FE(multiplication1,NULL)
         PHP_FE_END      /* Must be the last line in hw_functions[] */




而後執行phpize 好比您的php路徑是
sh-3.2# /usr/local/php-5.6.23/  則是  /usr/local/php-5.6.23/bin/phpize
出現如下則正常測試

Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226


再而後,配置安裝 .代碼以下ui

[Shell] 純文本查看 複製代碼
?
1
. /configure --with-php-config= /usr/local/php-5 .6.23 /bin/php-config

要注意php路徑.跟上面的phpize是同一個目錄   回車若是不報錯則正常.
再輸入兩個命令 make && make install 若是看到下面的代碼說明正常spa

Installing shared extensions:     /usr/local/php-5.6.23/lib/php/extensions/no-debug-non-zts-20131226/


接下來 修改一下php.ini  增長extension=hw.so
sh-3.2# vi /usr/local/php-5.6.23/php.ini  搜索 extension 能夠找的到

重啓php-fpm  而後phpinfo()查看一下.如圖

第五步.測試擴展到底有個毛用?php代碼以下debug

[PHP] 純文本查看 複製代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
function add() //加法函數
{
     $rs = 0;
     for ( $i = 0 ; $i < 10000000; $i ++)
     {
         $rs = $i +1;
     }
     return $rs ;
}
function multiplication() //乘法函數
{
     $rs = 0;
     for ( $i = 0 ; $i < 10000000; $i ++)
     {
         $rs = $i * 2;
     }
     return $rs ;
}
$time = microtime(true); //取微秒
echo add(); //運行函數
$add1 = microtime(true) - $time ; //計算函數佔用時間.這是php的加法函數時間,add1是結果
echo 'add time:' . $add1 . '<hr/>' ; //現實出來
$time = microtime(true); //同上.計算php的乘法時間
echo multiplication();
$multiplication1 = microtime(true) - $time ; //結果
echo 'multiplication time:' . $multiplication1 . '<hr/>' ;
$time = microtime(true); //取擴展前的時間
echo add1(); //擴展函數
$add2 = microtime(true) - $time ; //結果
echo 'ext add time:' . $add2 . '<hr/>' ;
$time = microtime(true);
echo multiplication1(); //相同.這是擴展乘法
$multiplication2 = microtime(true) - $time ;
echo 'ext multiplication time:' . $multiplication2 . '<hr/>' ; //結果
 
echo 'add1 / add2 = '  . ( $add1 / $add2 ) . '<hr>' ; //擴展是php的多少倍
echo 'multiplication1 / multiplication2 = '  . ( $multiplication1 / $multiplication2 ) . '<hr>' ;





最後查看結果....
加法大約是126萬倍(平均在60-120萬倍) 乘法大約是126萬倍(平均在100萬倍以上)

相關文章
相關標籤/搜索