Raspberry Pi 3 CentOS 7 ARM Apache + PHP PDO 連結 SQLite

Raspberry Pi

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

Apache 網站伺服器

安裝

安裝 Apache(就是 httpd):

yum install httpd

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

systemctl start httpd
systemctl enable httpd

目錄權限設定

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

ls -ald /var/www/html/
drwxr-xr-x. 2 root root 4096  3月 30 19:49 /var/www/html/

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

chown apache:apache /var/www/html/
chmod 2755 /var/www/html/

確認設定是否正確:

ls -ald /var/www/html/
drwxr-sr-x. 2 apache apache 4096  3月 30 19:49 /var/www/html/

設定檔

Apache 的設定檔:

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

重啟動 Apache 服務:

systemctl restart httpd

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

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

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

重啟動 Apache 服務:

systemctl restart httpd

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

cd /var/www/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):

yum install php php-pdo

設定檔

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

vi /etc/php.ini
# 預設為註解
date.timezone = Asia/Taipei

重啟動 Apache 服務:

systemctl restart httpd

Xdebug

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

安裝

安裝相關套件:

yum install php-devel php-pear gcc gcc-c++ make

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

pecl install xdebug-2.2.7

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

ls -ald /var/www/html/
drwxr-xr-x. 3 root root 4096  6月 10  2014 /var/www/html/
 
chown apache:apache /var/www/html
chmod 2755 /var/www/html

設定檔

指定 zend_extension 路徑:

vi /etc/php.d/xdebug.ini
zend_extension=/usr/lib/php//modules/xdebug.so

重啟動 Apache 服務:

systemctl restart httpd

測試

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

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 了,查詢是否己安裝:

sqlite3 -version
3.7.17 2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668

指令

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

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 資料庫:

cd /var/www/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 資料:

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 的資料。

參考

在〈Raspberry Pi 3 CentOS 7 ARM Apache + PHP PDO 連結 SQLite〉中有 1 則留言

發表留言