PHP處理DBase數據庫


我是Lem0,自學倡導者,執迷于“不務正業”,被批評“旁門左道”。我注冊并使用簡書,希望能夠記錄一些我記不住的事情,或者與大家一起共享知識,共同學習。

從導師那里接到這個項目的時候,我還認為DBase數據庫已經從這個世界上消失了,沒有一家公司和企業依然在使用DBF文件存儲數據。然而我想錯了,我國教育部門依然在使用這種格式的文件,無論是我手中合法獲取的數據,還是其他部門人員透露的消息,DBF數據文件確實從學生高考入學到畢業時填寫去向表都一直存在著,并且在短時間內,教育系統中不會有其他來代替DBase數據庫。

基于這種情況,這個數據可視化項目可以概括為提取我手中DBF文件里的100萬條數據并加以處理,繪制統計圖表。

PHP的DBase擴展

我是用的后端語言是PHP,開發環境是Windows8+wamp。為了讓PHP能夠處理DBF文件,我需要下載安裝一個名為php_dbase.dll的擴展庫。

我搜遍全網,發現PHP5.3時期已經完全棄用dbase擴展和相關函數的使用。我的wamp搭載的是PHP5.5,自然不能使用php_dbase.dll了。

后來我在PHP官網上搜索,得到PHP7.0支持dbase數據庫擴展的消息。我快速下載了最新版本的wamp,支持PHP5和PHP7的相互轉換。之后我使用PHP7.0.10成功地載入了php_dbase.dll。

處理DBF文件

我在PHP手冊中查得操作DBF文件的多個函數,功能簡單但足夠我使用。

//打開數據庫,其中第二參數為打開方式:
0-只讀;1-只寫;2-可讀寫
dbase_open($filename, $mode)

//關閉數據庫
dbase_close($identifier)

//讀取一條記錄,返回一個關系型數組
dbase_get_record_with_names($identifier, $index)

//獲取數據庫中數據總條數
dbase_numrecords($identifier)

首先我使用一個循環,讀取每一條數據并進行處理:

for ($i = 0; $i < $dbase_numrecord($db); $i++) {
  $row = dbase_get_record_with_names($db, $i);
  //...其他處理
}

寫成整個程序之后我發現,由于PHP本身的效率問題,加之數據量龐大(100萬條數據),我的瀏覽器在運行PHP程序時總會卡死,造成約5~10分鐘的無響應狀態。我判斷一次讀取和處理的數據不能大于5000條,所以我嵌套了另一個外部循環,保證每次循環處理5000個數據,5000條數據都處理完,再讀入下5000條。之后根據運行結果來看,我已經能夠做到秒級輸出處理結果了。

繪圖插件

我一開始打算使用PHP的類庫:jpgraph來繪制統計圖表。但后來我被百度前端推出的圖標插件echarts的效果吸引了,因而決定使用echarts配合jQuery出圖。

依舊是效率

我發現每次登錄系統都采取PHP運算,讀入DBF后出圖是一個愚蠢的決定,因為這將導致打開數據庫,可能處理大量不需要用戶看到的信息,從而拖慢機器速度。

我冥思苦想,最終發現了echarts插件支持通過json繪圖。我一下拍案而起,可以通過PHP處理數據庫一次,將獲得的、需要使用的數據儲存到json中。每次得到用戶的請求,都從json中加載數據。

這就避免了大量不需要的數據儲存在服務器上,浪費空間,從而也避免了可能的安全問題。同時,使用json相比于從DBF直接讀入數據快了很多倍,一個json文件只有100kb而已(之前的dbf文件有足足300M)。

之后我依舊使用上面每次讀取5000條數據的循環,將讀取的數據以json格式輸出并儲存。

//for循環體
$row = dbase_get_record_with_names($db, $i);

switch ($row['JYQXDM']) {
  //處理語句省略,處理結果是數組形式,賦給變量$res
}

json_encode($res);
echo $res;

在程序確認無誤后,發現輸出無效。頁面沒有顯示任何內容。

中文編碼

json_encode函數要求json數據必須是utf-8編碼。但即使用UTF8編碼的字符,使用json_encode也沒有輸出。后來我又查了一個小時,才找到了解決辦法。

我在使用json_encode之前把字符用函數urlencode()處理一下,然后再json_encode,輸出結果的時候在用函數urldecode()轉回來。測試代碼具體如下:

$testJSON=array('name'=>'中文字符串','value'=>'test');  

foreach ( $testJSON as $key => $value ) {  
$testJSON[$key] = urlencode ( $value );  
    }  
echo urldecode ( json_encode ( $testJSON ) );

至此,PHP終于輸出了中文json格式。


關注我的諸位,感謝你們的支持。

由于工作原因,最近沒有時間更新游戲開發教程和其他文章。我正著手于一個數據可視化系統的項目,可能在最近5天內沒有時間再看簡書并且回復大家的私信和評論。您可以繼續留言給我,我會盡早回來繼續更新。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容