Raspberry Pi 3 CentOS 7 ARM Apache + PHP PDO 連結 SQLite
在「樹莓派 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 可以是下列之一:
|
.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 的資料。
參考
本著作係採用創用 CC 姓名標示-相同方式分享 3.0 台灣 授權條款授權.
非常感谢你