一個簡單php擴(kuò)展介紹與開發(fā)教程
更新時間:2010年08月19日 22:05:23 作者:
這個擴(kuò)展早就寫好了,只是一直沒有時間寫在blog上面,今天抽點時間,將它記錄下來,以后備用。
我們使用php擴(kuò)展,主要目的是提高程序的執(zhí)行效率,對于訪問量很大的代碼或者邏輯將其寫成擴(kuò)展。在做項目的過程中,需要對數(shù)據(jù)進(jìn)行排序,數(shù)據(jù)運算比較復(fù)雜;我們準(zhǔn)備對一百萬個數(shù)據(jù)進(jìn)行排序, 下面是我在程序之前做的一個測試:首先使用php程序生成一百萬的隨機(jī)數(shù),并將其保存在文件中。
生成隨即數(shù)的代碼如下面所示:
set_time_limit(0);
ini_set("memory_limit", -1);
$data = array();
for($i = 1; $i < 1000000; $i++)
$data[] = rand();
file_put_contents('data.php', '<?php $data = ' . var_export($data, true) . "; ?>");
代碼很簡單,一看就明白,這里不作說明。
下面是使用php寫的快速排序,php自身帶的排序函數(shù),以及自己擴(kuò)展的排序函數(shù),它們所需時間如下所示:

下面將php代碼展示一下,需要說明的是:hello函數(shù)時自己寫的擴(kuò)展
<?php
ini_set("memory_limit", -1);
set_time_limit(0);
include_once('data.php'); //剛才產(chǎn)生的隨機(jī)數(shù)保存在這個文件
$len = count($data);
$data_s = $data_q = $data;
$s_s = $s_t = array_sum(explode(" ", microtime()));
qsort($data, 0, $len-1);
$s_t = array_sum(explode(" ", microtime()));
sort($data_s);
$q_t = array_sum(explode(" ", microtime()));
$data_q = hello($data_q);
$r_t = array_sum(explode(" ", microtime()));
echo "php寫的快速排序時間: " . ($s_t-$s_s) . "<br>";
echo "系統(tǒng)排序函數(shù)使用時間為: " . ($q_t-$s_t) . "<br>";
echo "本地排序函數(shù)使用時間為: " . ($r_t-$q_t) . "<br>";
echo "兩個結(jié)果的對比:" . ($data_s === $data_q);
function qsort(&$arr, $l, $u)
{
if($l >= $u)
return;
$m = $l;
for($i = $l+1; $i<=$u; $i++)
{
if($arr[$i] < $arr[$l])
{
$m++;
if($m != $i)
{
$t = $arr[$i];
$arr[$i] = $arr[$m];
$arr[$m] = $t;
}
}
}
$t = $arr[$l]; $arr[$l] = $arr[$m]; $arr[$m] = $t;
qsort($arr, $l, $m-1);
qsort($arr, $m+1, $u);
}
?>
很簡單吧, 多的不說啦,下面說說這個擴(kuò)展的開發(fā)
生成 擴(kuò)展有一定的步驟,網(wǎng)上都有很講解,我這里也不再羅嗦,
首先使用php的庫文件生成一個基本的擴(kuò)展項目

生成的項目,
修改sort.c,將自己的快排寫進(jìn)去, 我這邊的代碼是將php程序的快速排序改成c語言。生成dll后,將其放在php擴(kuò)展中,首先檢查一下是否已將啟用擴(kuò)展。
然后 在代碼中直接使用hello函數(shù)(我這里沒有改函數(shù)名)
注意:擴(kuò)展一定要考慮全面,不能在使用中出錯,特別是C寫的代碼,否則會出現(xiàn)php系統(tǒng)崩潰
生成隨即數(shù)的代碼如下面所示:
復(fù)制代碼 代碼如下:
set_time_limit(0);
ini_set("memory_limit", -1);
$data = array();
for($i = 1; $i < 1000000; $i++)
$data[] = rand();
file_put_contents('data.php', '<?php $data = ' . var_export($data, true) . "; ?>");
代碼很簡單,一看就明白,這里不作說明。
下面是使用php寫的快速排序,php自身帶的排序函數(shù),以及自己擴(kuò)展的排序函數(shù),它們所需時間如下所示:

下面將php代碼展示一下,需要說明的是:hello函數(shù)時自己寫的擴(kuò)展
復(fù)制代碼 代碼如下:
<?php
ini_set("memory_limit", -1);
set_time_limit(0);
include_once('data.php'); //剛才產(chǎn)生的隨機(jī)數(shù)保存在這個文件
$len = count($data);
$data_s = $data_q = $data;
$s_s = $s_t = array_sum(explode(" ", microtime()));
qsort($data, 0, $len-1);
$s_t = array_sum(explode(" ", microtime()));
sort($data_s);
$q_t = array_sum(explode(" ", microtime()));
$data_q = hello($data_q);
$r_t = array_sum(explode(" ", microtime()));
echo "php寫的快速排序時間: " . ($s_t-$s_s) . "<br>";
echo "系統(tǒng)排序函數(shù)使用時間為: " . ($q_t-$s_t) . "<br>";
echo "本地排序函數(shù)使用時間為: " . ($r_t-$q_t) . "<br>";
echo "兩個結(jié)果的對比:" . ($data_s === $data_q);
function qsort(&$arr, $l, $u)
{
if($l >= $u)
return;
$m = $l;
for($i = $l+1; $i<=$u; $i++)
{
if($arr[$i] < $arr[$l])
{
$m++;
if($m != $i)
{
$t = $arr[$i];
$arr[$i] = $arr[$m];
$arr[$m] = $t;
}
}
}
$t = $arr[$l]; $arr[$l] = $arr[$m]; $arr[$m] = $t;
qsort($arr, $l, $m-1);
qsort($arr, $m+1, $u);
}
?>
很簡單吧, 多的不說啦,下面說說這個擴(kuò)展的開發(fā)
生成 擴(kuò)展有一定的步驟,網(wǎng)上都有很講解,我這里也不再羅嗦,
首先使用php的庫文件生成一個基本的擴(kuò)展項目

生成的項目,
修改sort.c,將自己的快排寫進(jìn)去, 我這邊的代碼是將php程序的快速排序改成c語言。生成dll后,將其放在php擴(kuò)展中,首先檢查一下是否已將啟用擴(kuò)展。
然后 在代碼中直接使用hello函數(shù)(我這里沒有改函數(shù)名)
注意:擴(kuò)展一定要考慮全面,不能在使用中出錯,特別是C寫的代碼,否則會出現(xiàn)php系統(tǒng)崩潰
您可能感興趣的文章:
- PHP擴(kuò)展開發(fā)教程(總結(jié))
- PHP擴(kuò)展開發(fā)入門教程
- PHP內(nèi)核介紹及擴(kuò)展開發(fā)指南—基礎(chǔ)知識
- 初步介紹PHP擴(kuò)展開發(fā)經(jīng)驗分享
- PHP7擴(kuò)展開發(fā)教程之Hello World實現(xiàn)方法示例
- PHP7擴(kuò)展開發(fā)之基于函數(shù)方式使用lib庫的方法詳解
- PHP7擴(kuò)展開發(fā)之hello word實現(xiàn)方法詳解
- 快速開發(fā)一個PHP擴(kuò)展圖文教程
- 詳解Window7 下開發(fā)php擴(kuò)展
- 關(guān)于嘗試開發(fā)PHP的MYSQL擴(kuò)展的使用
- windows下開發(fā)并編譯PHP擴(kuò)展的方法
- php擴(kuò)展開發(fā)入門demo示例
相關(guān)文章
PHP從零開始打造自己的MVC框架之路由類實現(xiàn)方法分析
這篇文章主要介紹了PHP從零開始打造自己的MVC框架之路由類實現(xiàn)方法,結(jié)合實例形式分析了MVC框架路由類的原理及定義方法,需要的朋友可以參考下2019-06-06
thinkphp5使用bootstrapvalidator進(jìn)行異步驗證郵箱的示例
這篇文章主要介紹了thinkphp5使用bootstrapvalidator進(jìn)行異步驗證郵箱的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
PHP基于mssql擴(kuò)展遠(yuǎn)程連接MSSQL的簡單實現(xiàn)方法
這篇文章主要介紹了PHP基于mssql擴(kuò)展遠(yuǎn)程連接MSSQL的簡單實現(xiàn)方法,涉及php操作mssql的簡單連接、查詢、遍歷與輸出相關(guān)操作技巧,需要的朋友可以參考下2016-10-10
在php中實現(xiàn)限流ip次數(shù)以及允許部分ip訪問的代碼示例
這篇文章給大家介紹了如何在php中實現(xiàn)限流ip次數(shù)以及允許部分ip訪問,文中通過代碼示例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)具有一定的參考價值,需要的朋友可以參考下2023-12-12
PHP框架Laravel插件Pagination實現(xiàn)自定義分頁
這篇文章主要為大家詳細(xì)介紹了PHP框架Laravel5.1插件Pagination實現(xiàn)自定義分頁的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05

