實作 Facebook 登入時,如果使用官方提供的 Facebook PHP SDK,會遇到登入時使用 oAuth 的 function 過時的問題,至目前為止官方尚未發表更新處理。
參考:
目前的解決方法是有好心人發布 fork 的版本。可參考上述討論串,用 composer 安裝。目前已測試可使用的 package 參考這裡。該版本要求 PHP 7.3 以上,可於 PHP 8.0 上執行。
實作 Facebook 登入時,如果使用官方提供的 Facebook PHP SDK,會遇到登入時使用 oAuth 的 function 過時的問題,至目前為止官方尚未發表更新處理。
參考:
目前的解決方法是有好心人發布 fork 的版本。可參考上述討論串,用 composer 安裝。目前已測試可使用的 package 參考這裡。該版本要求 PHP 7.3 以上,可於 PHP 8.0 上執行。
有時我們會需要安裝一個雲端的伺服器是有 GUI 介面可以操作的,舉例像是用模擬器爬爬蟲,或是需要遠端協作需求的人,會需要在雲端伺服器上安裝一個桌面伺服器。
先提一下會有缺點:
這邊使用 Linode Ubuntu 22.04 安裝,安裝目標:
捨棄 Linode 文件中描述的 VNC 連線,是因為怎麼裝都連不起來…曾經懷疑是不是 Gnome 安裝錯了,後來發現根本是 VNC 設定有問題,果斷使用 XRDP 來處理。
步驟:
sudo apt install ubuntu-desktop gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal
sudo apt install tasksel
sudo tasksel install ubuntu-desktop
sudo apt-get install xrdp -y
sudo ufw allow 3389/tcp
nano /etc/v4
*filter # Allow all loopback (lo0) traffic and reject traffic # to localhost that does not originate from lo0. -A INPUT -i lo -j ACCEPT -A INPUT ! -i lo -s 127.0.0.0/8 -j REJECT # Allow ping. -A INPUT -p icmp -m state --state NEW --icmp-type 8 -j ACCEPT # Allow SSH connections. -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT # Allow HTTP and HTTPS connections from anywhere # (the normal ports for web servers). #-A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT #-A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT -A INPUT -p tcp --dport 3389 -m state --state NEW -j ACCEPT # Allow inbound traffic from established connections. # This includes ICMP error returns. -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Log what was incoming but denied (optional but useful). -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables_INPUT_denied: " --log-level 7 # Reject all other inbound. -A INPUT -j REJECT # Log any traffic that was sent to you # for forwarding (optional but useful). -A FORWARD -m limit --limit 5/min -j LOG --log-prefix "iptables_FORWARD_denied: " --log-level 7 # Reject all traffic forwarding. -A FORWARD -j REJECT COMMIT
nano /etc/v6
*filter # Allow all loopback (lo0) traffic and reject traffic # to localhost that does not originate from lo0. -A INPUT -i lo -j ACCEPT -A INPUT ! -i lo -s ::1/128 -j REJECT # Allow ICMP -A INPUT -p icmpv6 -j ACCEPT # Allow HTTP and HTTPS connections from anywhere # (the normal ports for web servers). #-A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT #-A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT # Allow inbound traffic from established connections. -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Log what was incoming but denied (optional but useful). -A INPUT -m limit --limit 5/min -j LOG --log-prefix "ip6tables_INPUT_denied: " --log-level 7 # Reject all other inbound. -A INPUT -j REJECT # Log any traffic that was sent to you # for forwarding (optional but useful). -A FORWARD -m limit --limit 5/min -j LOG --log-prefix "ip6tables_FORWARD_denied: " --log-level 7 # Reject all traffic forwarding. -A FORWARD -j REJECT COMMIT
iptables-restore < /etc/v4;/sbin/iptables-save;ip6tables-restore < /etc/v6;/sbin/ip6tables-save;
sudo nano /etc/polkit-1/localauthority.conf.d/02-allow-colord.conf
polkit.addRule(function(action, subject) { if ((action.id == "org.freedesktop.color-manager.create-device" || action.id == "org.freedesktop.color-manager.create-profile" || action.id == "org.freedesktop.color-manager.delete-device" || action.id == "org.freedesktop.color-manager.delete-profile" || action.id == "org.freedesktop.color-manager.modify-device" || action.id == "org.freedesktop.color-manager.modify-profile") && subject.isInGroup("{group}")) { return polkit.Result.YES; } });
sudo /etc/init.d/xrdp restart
連線時 windows OS 用戶使用內建的遠端桌面連線工具即可, MacOS 用戶推薦使用 Microsoft Remote Desktop 這套軟體。

其他額外你可能需要的東西
參考文件:
PWA 又稱「漸進式的網頁應用程式」,有很多文章已經有說明,參考這裡,或是參考這個都有說明。
這次介紹一個 PWA 的好用工具:
操作方法簡化非常多,開始之前要注意幾件事情:
首先進入網站以後輸入網址。
系統便會開始撿測需要的資源,會給一份報告告訴你缺什麼,或是已經有了什麼。如下圖,會發現 PWA 需要的 Manifest.json 和 server-woker.js 都沒有,這時點擊一下右下角的 next 按鈕。

點擊之後,會產生可以下載的 PWA 必要文件檔案。依照提示點擊 Generate 按鈕,下載必要檔案。
下載完成解壓縮後,資料夾中會有如下檔案,點開 next-steps.html 會提示接下來要做的事情。
next-steps.html 會導向 https://github.com/pwa-builder/pwabuilder-web/blob/V2/src/assets/next-steps.md 這個網址。簡單來說要做五件事情。
<link rel="manifest" href="manifest.json" />
<script type="module"> import 'https://cdn.jsdelivr.net/npm/@pwabuilder/pwaupdate'; const el = document.createElement('pwa-update'); document.body.appendChild(el); </script>
以上,恭喜完成一個 PWA 基本配置,更進階的使用可以參考 manifest.json 中的配置:
值得一提的有幾個設定:

—-
安卓手機上使用 PWA 方法,請參考這裡。
iOS 上就是開 safari 然後把網站加入主畫面就行啦,參考這裡。

同場加映:
最近再找一款能夠方便架站自由度也高的管理面板,主要是為了架設 LEMP 的環境,於是找到這款 Hestiacp 。這是 Vestacp 的兄弟款,不過 Vestacp 已經沒有維護了。
先講結論:
這是一款學習門檻較高的 panel,建議提供給已經熟悉使用 debain / ubuntu 的管理員,可以做一個屬於自己的習慣的模版和 SOP,對於較為複雜的 LEMP 網站會滿方便的。但因為是開源的服務,導致還是不是很方便(和 aapanel 比較),對於習慣無 panel 操作的用戶還是會感覺到礙手礙腳的。
—
這款 Hestiacp 的好壞,個人分析如下:
優點:
缺點:
Hestiacp 論壇: https://forum.hestiacp.com/
介紹:https://hestiacp.com/
文件:https://docs.hestiacp.com/
Github:https://github.com/hestiacp/hestiacp
支持系統:
— 以下架設和簡易心得 —
提醒下:有部分配置和安裝需要更詳細的測試,並非一個完整的安裝 SOP。
先登入root 權限,更新一遍
apt-get update
下載 install.sh
wget https://raw.githubusercontent.com/hestiacp/hestiacp/release/install/hst-install.sh
下載 install.sh
wget https://raw.githubusercontent.com/hestiacp/hestiacp/release/install/hst-install.sh
參考選定安裝(https://gabizz.github.io/hestiacp-scriptline-generator/)不安裝 mysql \ http server 做最小安裝,port 設定 8083:
sudo bash hst-install.sh --apache no --phpfpm no --multiphp no --vsftpd no --proftpd no --named yes --mysql no --postgresql no --exim yes --dovecot yes --sieve no --clamav yes --spamassassin no --iptables yes --fail2ban yes --quota no --api no --interactive yes --hostname no --email no --password no --with-debs no --port '8083' --lang 'zh-tw' --force
更新 Panel 網域(假設網域 cp-testing.69939.uk),記得 dns 要先設定上
v-change-sys-hostname cp-testing.69939.uk
Panel 網域補 SSL
v-add-letsencrypt-host
更改密碼
v-change-user-password admin 密碼
透過上述選定安裝,預設安裝的服務有這些:

後台新增一個用戶,設定方案為 default

點入該新增的帳號以後,選擇右上角登入該帳號之後,就可以創建其他網站。
再創建網站之前如果需要編輯 nginx 內容,需要編輯樣版,參考:https://docs.hestiacp.com/admin_docs/web.html#how-do-web-templates-work
Nginx 的路徑為:
/usr/local/hestia/data/templates/web/nginx/php-fpm/
檔案要記得複製一份新的並且命名好。避免更新 panel 的時候被覆蓋回去。
另外備註一些參考:
Apache 內建帶有一個 ab 指令,可以作為壓力測試使用。
用法:ab [options] [http[s]://]hostname[:port]/path 可用餐數: -n requests 要執行的請求數 -c concurrency 一次發出的多個請求的數量 -t timelimit 秒到最大值。花在基準測試上,這意味著 -n 50000 -s timeout 秒到最大值。等待每個響應,默認為 30 秒 -b windowsize TCP 發送/接收緩衝區的大小,以字節為單位 -B address 進行傳出連接時綁定的地址 -p postfile 包含要 POST 的數據的文件。還記得設置 -T -u putfile 包含要 PUT 的數據的文件。還記得設置 -T -T content-type 用於 POST/PUT 數據的內容類型標頭,例如: 'application//x-www-form-urlencoded',默認為"text/plain" -v verbosity 要打印多少故障排除信息 -w 在 HTML 表格中打印結果 -i 使用 HEAD 而不是 GET -x 屬性 要作為表屬性插入的字符串 -y 屬性字符串作為 tr 屬性插入 -z 屬性字符串作為 td 或 th 屬性插入 -C 屬性 添加 cookie,例如。 'Apache= 1234'(可重複) -H 屬性添加任意標題行,例如。 'Accept-Encoding:gzip' 在所有正常標題行之後插入。 (可重複) -A 屬性 添加 Basic WWW Authentication,屬性 是冒號分隔的用戶名和密碼。 -P 屬性 添加Basic Proxy Authentication,屬性 是冒號分隔的用戶名和密碼。 -X proxy:port 代理服務器和使用的端口號 -V 打印版本號並退出 -k 使用 HTTP KeepAlive 功能 -d 不顯示百分位數服務表 -S 不顯示置信度估計值和警告 -q 執行超過 150 個請求時不顯示進度 -l 接受可變文檔長度(用於動態頁面) -g filename 將收集到的數據輸出到 gnuplot 格式文件 -e filename 輸出帶有百分比的 CSV 文件 -r 不要在套接字接收錯誤時退出。 -m 方法 方法名稱 -h 顯示使用信息(此消息) -I 禁用 TLS 服務器名稱指示 (SNI) 擴展 -Z ciphersuite 指定 SSL/TLS 密碼套件(參見 openssl 密碼) -f protocol 指定 SSL/TLS 協議 (SSL2、TLS1、TLS1.1、TLS1.2 或 ALL) -E certfile 指定可選的客戶端證書鍊和私鑰
結果的部分會長的像是這樣:

Server Software: 主機使用的系統\軟體(nginx or apache 之類)和版本,通嘗是關閉的 Server Hostname: 網站的 Hostname ,網域名稱 Server Port: 連線的 port,大多是 443 或是 80 Server Temp Key: 連線時的臨時交換密鑰 TLS Server Name: TLS 連線的名稱 Document Path: 連線網頁路徑 Document Length: 連線網頁回應的檔案大小 Concurrency Level: 同時進行壓力測試的人數 Time taken for tests: 本次壓力測試所花費的總秒數 Complete requests: 完成的要求數(Requests) Failed requests: 失敗的要求數(Requests) Keep-Alive requests: Keep-Alive 的要求數 Total transferred: 本次壓力測試的總數據傳輸量(包括 HTTP Header 的資料也計算在內) HTML transferred: 本次壓力測試的總數據傳輸量(僅計算回傳的 HTML 的資料) Requests per second: 平均每秒回應要求數量 Time per request: 平均每個要求所花費的時間(注意單位是 ms, 豪秒) Time per request: 平均每個要求所花費的時間,跨所有同時連線數的平均值(注意單位是 ms, 豪秒) Transfer rate: 從 Client 端到 Web Server 之間的網路傳輸速度 Connection Times: 連線的時間統計,是一個二維表格,分別表示最小值\平均\中間值\最大值: Connect: Request 從 Client 端到 Web Server 的時間 Processing: 資料到 Web Server 後到 Response 結束( Response 全部下載完成)的時間 Waiting: 資料 Connect 狀態後,Client 端等待的時間,亦指 Client 送出 Request 後,一收到 Response 前等待的時間 Total: Connect + Processing 的時間,也就是從 Client 發出 Request 到 Response 全部下載完成的時間
要注意幾點:
參考資料:
如果想要在 windows 上操作(我沒做過),參考:
有時下載一個 txt 文件,用文字編輯器打開來發現不是 utf8 編碼,但是不知道他是用了什麼編碼,這邊可以先丟到 chrome 瀏覽器看看,如果 chrome 瀏覽器顯示是正常的,就可以開啟 “開發者工具”,開啟”主控台”,輸入指令:
document.charset
就可以顯示目前的編碼名稱,如下圖所示:

這時如果想要儲存成常用編碼的檔案,這時可以用 sublime 3 或是其他可以轉換編碼的文字編輯器。
用 usblime 3 為例,如圖操作,先開啟指定編碼看是否正確,正確的話再另存編碼即可。


Update 2024-06-17
拜 AI 科技之賜,現在生成型的文字 AI 已經足以處理 php array 翻譯了,我使用 ChatGPT 付費版來處理翻譯,操作上就貼文件給他,直接下指令請他翻譯,參考:

— 舊文 —-
PHP 的多語系或是翻譯實作的形式各式各樣,像是 PO/MO 翻譯檔案、寫在 SQL 資料庫、靜態檔案或是寫在 PHP 檔案之中的作法,作法之多,從 PO/MO 檔案轉換的線上工具可以一窺一二。

這邊使用 Codeigniter 的語系系統,是用 PHP array 來處理的,這樣的形式要批次處理前置翻譯有點困難,如果要是用翻譯的 API 也要額外付費,於是用了一些比較迂迴的作法。
首先擁有的翻譯資源:
實作的 SOP 是這樣的:
附上其中 SOP 的 1. 和 5. 的檔案原始碼:
# php2po.php
<?php
$PATH = dirname(__FILE__) . "/路徑";
$files = glob($PATH . '*.php');
foreach ($files as $file) {
$lang = [];
include $file;
$fh = fopen($file . ".po", 'w');
fwrite($fh, "#\n");
fwrite($fh, "msgid \"\"\n");
fwrite($fh, "msgstr \"\"\n");
foreach ($lang as $key => $value) {
$key = addslashes($key);
$value = addslashes($value);
fwrite($fh, "\n");
fwrite($fh, "#. $key\n");
fwrite($fh, "msgid \"$value\"\n");
fwrite($fh, "msgstr \"$value\"\n");
}
fclose($fh);
}
# po2php.php
<?php
function get_replace_array($file)
{
$input_lines = file_get_contents($file);
preg_match_all('/msgid \"(.*)\"/', $input_lines, $msgids);
preg_match_all('/msgstr \"(.*)\"/', $input_lines, $msgstrs);
$arr = [];
for ($i = 1; $i < count($msgids[1]); $i++) {
// 第一個是空值
$arr[$msgids[1][$i]] = $msgstrs[1][$i];
}
// var_dump($arr);die();
return $arr;
}
$PATH = dirname(__FILE__) . "/路徑";
$files = glob($PATH . '*.php');
foreach ($files as $file) {
$lang = [];
include $file;
$replace_array = get_replace_array($file . ".po");
$php_file = file_get_contents($file);
$_lang = [];
foreach ($lang as $key => $value) {
$_lang[$key] = $value;
$value_tmp = addslashes($value);
if (isset($replace_array[$value_tmp])) {
$_lang[$key] = $replace_array[$value_tmp];
}
if ($value != $replace_array[$value]) {
echo $key . ", " . $_lang[$key] . "
\n";
}
}
file_put_contents($file, '<?php $lang = ' . var_export($_lang, true) . ';');
}
需要注意幾件事情:
如果有需要信件 RWD 功能,現在有一個框架可用,叫做 mjml:
這裡有線上編輯器和各種模版可選擇:
有時會需要更改 Mac 內建的 PHP 版本或是新增一個 PHP 來使用,這時候會需要使用 Homebrew 來安裝:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
安裝好 Homebrew 之後,安裝 php 7.3 會發現已經不支援了,參考 stackoverflow 會得知需要用別的來源:
brew tap shivammathur/php
brew install shivammathur/php/[email protected]
注意 tap 動作只需要成功執行一次就行。
安裝時可能會遇到的注意事項:
/usr/local/opt/[email protected]/bin/php
2023-10-23 update:
現在 PHP 已經更新到 8.2 啦,上述 brew 的方式依然可以更新,安裝時更換版本號碼即可。安裝成功後檢查 ~/.bash_profile 的 PATH 更新為新版本,之後刷新指令 source ~/.bash_profile 就行的。
HTTrack 是一個砍站軟體,他在 windows 上有 GUI 介面,不過在 Mac 上只有 command line 介面,也不難處理,對於下載網頁的靜態資源還是不錯用的。
安裝和執行方法參考:
滿詳盡的,這邊就不贅述。
要注意的重點: