MIS 腳印

記錄 IT 學習的軌跡

樹莓派 3(Raspberry Pi 3) CentOS 7 ARM Apache + PHP PDO 連結 SQLite

在「樹莓派 3」使用 CentOS 7 ARM 實作 Apache、SQLite 與 PHP 來架設 WEB 伺服器的環境,文章詳細解說安裝與設定的步驟,並使用 PHP PDO 連結 SQLite 來存取資料庫。


Apache 網站伺服器

安裝

安裝 Apache(就是 httpd):

[root@centos-rpi3 ~]# yum install httpd

啟動 Apache 服務,並設定開機時啟動:

[root@centos-rpi3 ~]# systemctl start httpd
[root@centos-rpi3 ~]# systemctl enable httpd

目錄權限設定

預設網站根目錄的擁有者與群組為 root;目錄權限為 755:

[root@centos-rpi3 ~]# ls -ald /var/www/html/
drwxr-xr-x. 2 root root 4096  3月 30 19:49 /var/www/html/

設定擁有者與群組為 apache;目錄權限為 2755(2 表示新建子目錄的權限同父目錄):

[root@centos-rpi3 ~]# chown apache:apache /var/www/html/
[root@centos-rpi3 ~]# chmod 2755 /var/www/html/

確認設定是否正確:

[root@centos-rpi3 ~]# ls -ald /var/www/html/
drwxr-sr-x. 2 apache apache 4096  3月 30 19:49 /var/www/html/

設定檔

Apache 的設定檔:

[root@centos-rpi3 ~]# vi /etc/httpd/conf/httpd.conf
# 網路介面監聽的埠口預設都為 80
Listen 80
# 系統管理員的 EMail,當網站出現問題時自動回報
ServerAdmin root@localhost
# 主機名稱,如無另外指定,預設以 hostname 輸出
#ServerName www.example.com:80
# 網站預設根目錄
DocumentRoot "/var/www/html"

重啟動 Apache 服務:

[root@centos-rpi3 ~]# systemctl restart httpd

重導向所有請求到單一檔案

許多現代的 Web Server 都使用的 RESTful,就是把所有請求重導到 index.php,來統一解析使用者要什麼。 首先我們要啟用 Apache 的 .htaccess 設定檔:

[root@centos-rpi3 ~]# vi /etc/httpd/conf/httpd.conf
<Directory "/var/www/html">
    ... 以上省略 ...
    # 由於安全性等的考慮預設是 None,改為 All
    AllowOverride All
    ... 以下省略 ...
</Directory>

重啟動 Apache 服務:

[root@centos-rpi3 ~]# systemctl restart httpd

使用 .htaccess 重寫規則來重新導向到 index.php:

[root@centos-rpi3 ~]# cd /var/www/html/
[root@centos-rpi3 html]# vi .htaccess
# 把所有的請求重導到 index.php,然後解析 URL 以找出使用者想要什麼
<IfModule mod_rewrite.c>
    # 將轉址功能打開
    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>

PHP 網頁程式

安裝

安裝 PHP、PDO(含SQLite):

[root@centos-rpi3 ~]# yum install php php-pdo

設定檔

自 PHP 5 開始,時區(date.timezone)一開始是未設置所以會以標準時區也就是 GMT+0,所以在使用 date 相關的函式的時候都會少了八個小時,因此必須修改 php.ini 的設定:

[root@centos-rpi3 ~]# vi /etc/php.ini
# 預設為註解
date.timezone = Asia/Taipei

重啟動 Apache 服務:

[root@centos-rpi3 ~]# systemctl restart httpd

Xdebug

這套 Debug 工具可以用來追蹤和分析 PHP 程式的運作狀況,而且會將錯誤訊息與輸出格式如 var_dump() 格式化輸出至 Browser。

安裝

安裝相關套件:

[root@centos-rpi3 ~]# yum install php-devel php-pear gcc gcc-c++ make

PHP version < 5.5.0 必須安裝舊版本,因此必須指定版本號(目前所用 PHP version 5.4.16):

[root@centos-rpi3 ~]# pecl install xdebug-2.2.7

Apache 網站根目錄權限可能會被更動,如有的話須改回來:

[root@centos-rpi3 ~]# ls -ald /var/www/html/
drwxr-xr-x. 3 root root 4096  6月 10  2014 /var/www/html/

[root@centos-rpi3 ~]# chown apache:apache /var/www/html
[root@centos-rpi3 ~]# chmod 2755 /var/www/html

設定檔

指定 zend_extension 路徑:

[root@centos-rpi3 ~]# vi /etc/php.d/xdebug.ini
zend_extension=/usr/lib/php//modules/xdebug.so

重啟動 Apache 服務:

[root@centos-rpi3 ~]# systemctl restart httpd

測試

撰寫一個程式來查看 Xdebug 的格式化輸出:

[root@centos-rpi3 ~]# vi /var/www/html/xdebug.php
<?php
// PHP 程式有問題時,將錯誤、警告訊息顯示於網頁
ini_set('display_errors', 1);

$arr = [1, 2, 3];

// 格式化輸出
var_dump($arr);
// 故意少寫一個 v,查看格式化輸出的錯誤訊息
ar_dump($arr);

開啟 Bowser 連結至 xdebug.php 檔,格式化輸出的訊息更方便 Debug。

SQLite 關聯式資料庫

SQLite 不同於其它 Client/Server 資料庫(如 MySQL),它被整合在客戶程式中,是最常被使用在嵌入式系統中的資料庫。

安裝

目前幾乎所有的 Linux 預設都已安裝 SQLite3 了,查詢是否己安裝:

[root@centos-rpi3 ~]# sqlite3 -version
3.7.17 2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668

指令

SQLite 指令為 . 開始,且不以 ; 結束,輸入 sqlite3 進入 SQLite 命令列:

[root@centos-rpi3 ~]# sqlite3
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>

顯示 SQLite 的所有指令,可使用 .help:

sqlite> .help

指令表

指令說明
.backup ?DB? FILE備份 DB 資料庫(預設檔案名稱為 main)到 FILE
.bail ON|OFF發生錯誤後停止。預設為 OFF
.databases列出 DB 資料庫的名稱與 files
.dump ?TABLE? …使用 SQL 文字格式轉存 DB 資料庫。如果指定 TABLE,則只轉存匹配 LIKE 模式的 TABLE
.echo ON|OFF開啟 / 關閉 echo 指令
.exit離開 SQLite 命令列
.explain ?ON|OFF?打開 / 關閉適用 EXPLAIN 的輸出模式。未帶參數則為 ON
.header(s) ON|OFF打開 / 關閉標題顯示
.help顯示 SQLite 的所有指令
.import FILE TABLE將資料從 file 導入到 TABLE
.indices ?TABLE?顯示所有索引名稱。如果指定 TABLE,則只顯示匹配 LIKE 模式的 TABLE 索引
.load FILE ?ENTRY?加載擴充庫
.log FILE|off打開 / 關閉 log 記錄。FILE 可以是 stderr(標準錯誤)/ stdout(標準輸出)
.mode MODE ?TABLE?

設置輸出模式,MODE 可以是下列之一:

  • csv:逗號 “,” 分隔的值
  • column:左對齊的 columns
  • html:HTML 的
    code
  • insert:TABLE 的 SQL insert 述句
  • line:每行一個值
  • list:由 .separator 字串分隔的值
  • tabs:由 Tab 分隔的值
  • tcl:TCL 列表元素
.nullvalue STRING使用 STRING 代替 NULL 值
.output FILENAME發送輸出到 FILENAME
.output stdout將輸出發送到螢幕
.print STRING…列印文字 STRING
.prompt MAIN CONTINUE替換標準提示
.quit離開 SQLite 命令列
.read FILENAME執行 FILENAME 中的 SQL
.restore ?DB? FILE從 FILE 恢復 DB 資料庫(預設檔案名稱為 main)的內容
.schema ?TABLE?顯示 CREATE 述句。如果指定 TABLE,則只顯示匹配 LIKE 模式的 TABLE
.separator STRING更改輸出模式和 .import 使用的分隔符
.show顯示各種設置的當前值
.stats ON|OFF打開 / 關閉統計資料
.tables ?TABLE?列出匹配 LIKE 模式的 TABLE name
.timeout MS嘗試打開鎖定的TABLE MS 毫秒
.trace FILE|off在運行時輸出每個 SQL 述句
.vfsname ?AUX?列印 VFS 堆棧的 name
.width NUM1 NUM2 …為 column 模式設置 column 寬度
.timer ON|OFF打開 / 關閉 CPU 定時器測量

SQL 述句

新建 DB 資料庫:

[root@centos-rpi3 ~]# cd /var/www/html/
[root@centos-rpi3 html]# sqlite3 testDB.db
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>

顯示資料庫名稱與 files:

sqlite> .database
seq  name             file
---  ---------------  ----------------------------------------------------------
0    main             /var/www/html/testDB.db

新建 TABLE:

sqlite> CREATE TABLE users (
   ...>     ID INTEGER PRIMARY KEY AUTOINCREMENT,
   ...>     name TEXT NOT NULL
   ...> );

插入資料:

sqlite> INSERT INTO users (name)
   ...> VALUES ('王小傑'),
   ...>        ('李小明');

查詢資料。前二行為使用 SQLite 指令格式化輸出:

sqlite> .header ON
sqlite> .mode column
sqlite> SELECT *
   ...> FROM users;
ID          name
----------  ----------
3           王小傑
4           李小明

離開命令列:

sqlite> .exit

PHP PDO 連結

撰寫 PHP 程式來連結 SQLite DB 並 SELECT 資料:

[root@centos-rpi3 html]# vi pdo.php
<?php
try {
    // 使用絕對路徑連結
    $dbConn = new PDO('sqlite:/var/www/html/testDB.db');
} catch (PDOException $e) {
    echo '資料庫連結錯誤!';
}

$sql = 'SELECT *
        FROM users';
$stmt = $dbConn->prepare($sql);
$stmt->execute();
$row = $stmt->fetchAll(PDO::FETCH_ASSOC);

var_dump($row);

開啟 Bowser 連結至 pdo.php 檔,顯示 SELECT 的資料。

參考


“樹莓派 3(Raspberry Pi 3) CentOS 7 ARM Apache + PHP PDO 連結 SQLite” 有一則迴響

發表迴響