by Rain Chu | 3 月 20, 2024 | PHP
在 Linux 中更改命令行的預設 PHP 執行檔,通常涉及更新系統的 PATH
環境變數或使用 update-alternatives
工具(如果你的系統支援)。以下是幾種常見的方法來變更預設 PHP 執行檔:
方法 1:使用 update-alternatives
(適用於 Debian、Ubuntu 及其衍生系統)
如果你的系統安裝了多個 PHP 版本,可以使用 update-alternatives
工具來設定預設的 PHP 版本。
列出所有可用的 PHP 替代版本:
sudo update-alternatives --display php
設定預設 PHP 版本:
使用下面的命令設定預設版本。將 phpX.Y
替換成你想設定為預設的 PHP 版本號,例如 php8.2
。
sudo update-alternatives --set php /usr/bin/php8.2
如果你想要在可用選項之間手動選擇,可以使用:
sudo update-alternatives --config php
方法 2:直接修改 PATH
環境變數
你可以通過修改 PATH
環境變數來讓系統首先找到你想要的 PHP 版本。這可以通過在你的 ~/.bashrc
、~/.zshrc
或其他適用的 shell 配置檔案中添加一行來實現。
假設你想使用的 PHP 版本位於 /usr/local/phpX.Y/bin
(將 X.Y
替換成具體版本號),可以添加以下行:
export PATH=/usr/local/phpX.Y/bin:$PATH
然後,執行 source ~/.bashrc
(或對應的配置檔案)來使變更生效。
方法 3:使用符號連結
另一個變更預設 PHP 執行檔的方法是建立一個指向你想要的 PHP 版本的符號連結(symlink)。這通常涉及到刪除或重命名舊的 PHP 符號連結,然後創建一個新的指向你選擇的版本。
刪除或重命名當前的符號連結:
sudo mv /usr/bin/php /usr/bin/php.old
建立新的符號連結:
將 /usr/bin/php
指向你想要的 PHP 版本。將 /path/to/your/php
替換成你想要設定為預設 PHP 執行檔的完整路徑。
sudo ln -s /path/to/your/php /usr/bin/php
在進行這些變更後,你可以通過執行 php -v
來驗證新的預設 PHP 版本是否已正確設定。
by Rain Chu | 3 月 6, 2024 | Javascript, NodeJS, web
Web Push 是一種標準的 Web 協議,允許網站向使用者發送推播通知。這項功能可用於各種目的,例如:
- 提醒使用者有新的內容或更新
- 提供即時通知,例如交易狀態或聊天訊息
- 提高使用者參與度
準備工作
- 前端訂閱推播服務的 js 檔案
- 前端訂閱推播服務的網頁,需要包含訂閱服務的 js
- 後端紀錄使用者訂閱資訊的服務
- 後端推播訊息的服務
- 後端註冊訊息伺服器的程式碼
建立前端網頁的訂閱表單
這個檔案將包含安裝、激活、攔截請求和推播事件的處理器。創建一個名為sw.js
的檔案,並將其放在你網站的根目錄下
// 安裝Service Worker
self.addEventListener('install', function(event) {
console.log('Service Worker 安裝成功');
});
// Service Worker 激活
self.addEventListener('activate', function(event) {
console.log('Service Worker 激活成功');
});
// 監聽推播事件
self.addEventListener('push', function(event) {
var title = '推播通知';
var options = {
body: '這是一條推播消息。',
icon: 'icon.png',
badge: 'badge.png'
};
event.waitUntil(self.registration.showNotification(title, options));
});
在你的網站上註冊一個Service Worker,這是實現Web推播的必要步驟。Service Worker將在背景執行,即使用戶沒有直接訪問你的網站也能接收通知。通常會把下面的 javascript 寫在首頁中,觸發訂閱的條件。
// 在主要的JavaScript檔案中
function urlBase64ToUint8Array(base64String) {
const padding = '='.repeat((4 - base64String.length % 4) % 4);
const base64 = (base64String + padding)
.replace(/\-/g, '+')
.replace(/_/g, '/');
const rawData = window.atob(base64);
const outputArray = new Uint8Array(rawData.length);
for (let i = 0; i < rawData.length; ++i) {
outputArray[i] = rawData.charCodeAt(i);
}
return outputArray;
}
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/sw.js').then(function(registration) {
console.log('Service Worker 注册成功:', registration);
}).catch(function(error) {
console.log('Service Worker 注册失败:', error);
});
}
navigator.serviceWorker.ready.then(function(registration) {
if (!registration.pushManager) {
alert('此瀏覽器不支持推播通知');
return false;
}
const applicationServerKey = 'your publice key';
// 訂閱推播
registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlBase64ToUint8Array(applicationServerKey)
}).then(function(subscription) {
console.log('推播訂閱成功:', subscription);
// 發送訂閱資訊到後端
fetch('https://your_webpush_server/subscribe', {
method: 'post',
headers: {
'Content-type': 'application/json'
},
body: JSON.stringify({
subscription: subscription
}),
});
}).catch(function(error) {
console.log('推播訂閱失败:', error);
});
提供紀錄訂閱訊息的服務
這一段的作法很多,通常用你原本伺服器中的解決方案,例如 php,asp.net,nodejs,python,GO等,我這邊為了方便,用nodejs示範下
const express = require('express');
const cors = require('cors');
const bodyParser = require('body-parser');
const app = express();
app.use(cors());
app.use(bodyParser.json());
const subscriptions = {}; // 在實際應用中,應使用資料庫儲存訂閱資訊
const webPush = require('web-push');
// 設置你的VAPID鑰匙
webPush.setVapidDetails(
'mailto:[email protected]',
'your publiec key',
'your private key'
};
app.post('/subscribe', (req, res) => {
const subscription = req.body;
const key = subscription.endpoint; // 使用endpoint作為唯一鑰匙
subscriptions[key] = subscription;
console.log('subscripted');
console.log(subscription);
// subscription是從前端發送到後端的訂閱對象
webPush.sendNotification(subscription.subscription, '消息內容')
.then(result => console.log('推播成功'))
.catch(err => console.log('推播失敗', err));
res.status(200).json({message: '訂閱成功'});
});
app.listen(8060, () => console.log('伺服器運行在8060端口'));
其中 sendNotification 平常應該是要放在 webpush service中的,這邊加入是用來測試使用
生成VAPID鑰匙 (自願應用伺服器身份驗證)
大部分現代瀏覽器(如Chrome、Firefox、Edge)都支持Web推播API,但是如果你不用市面上的解決方案如 OneSignal 而是要直接與這些瀏覽器的推播服務交互的話,需要使用VAPID(自願應用伺服器身份驗證)鑰匙進行身份驗證。
生成 VAPID Key 的方法如下
npx web-push generate-vapid-keys
記住保存生成的鑰匙。公鑰將在前端用於訂閱推播,私鑰將在後端用於發送推播。
如果你無法使用npx
(它通常隨npm
自動安裝,作為npm
5.2.0及更高版本的一部分),那麼你可以通過下載最新版本的 nodejs
https://nodejs.org/
或是升級Node.js,或使用版本管理器如nvm
(Node Version Manager)來管理不同版本的Node.js。
參考資料
https://developer.mozilla.org/en-US/docs/Web/API/Push_API
by Rain Chu | 2 月 21, 2024 | PHP, wordpress
在處理大量數據和高流量的情況下,WordPress網站可能會面臨效能問題。這時,使用高效的緩存解決方案變得尤為重要。Object Cache Pro是一款專業級的物件緩存插件,它能夠顯著提升WordPress網站的性能和響應速度。本文將介紹如何在WordPress中安裝和配置Object Cache Pro。
安裝Object Cache Pro
步驟1:獲取插件
先從Object Cache Pro官方網站購買插件。完成後會取得授權金鑰。
步驟2:上傳並安裝插件
- 登入您的WordPress後台。
- 點擊「插件」>「新增」。
- 選擇「上傳插件」,然後選擇您下載的Object Cache Pro插件文件。
- 上傳並安裝插件。
跟一般外掛不一樣的地方,這邊要自己手動在 /wp-content/wp-config.php 中,去配置參數,配置方法如下
define('WP_REDIS_CONFIG', [
'token' => '<your-license-token>',
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0, // change for each site
'maxttl' => 86400 * 7,
'timeout' => 1.0,
'read_timeout' => 1.0,
'split_alloptions' => true,
'debug' => false,
]);
define('WP_REDIS_DISABLED', false);
步驟4:清除舊資料
步驟4:啟用插件
安裝完成後,點擊「啟用插件」。
進階配置Object Cache Pro
超快速度的配置
Object Cache Pro 進階配置,將序列話變成二進制,並且啟用快速壓縮等功能,再加入多主機支援
define('WP_REDIS_CONFIG', [
'token' => '...',
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0, // change for each site
'timeout' => 0.5,
'read_timeout' => 0.5,
'retry_interval' => 10,
'retries' => 3,
'backoff' => 'smart',
'compression' => 'zstd', // `zstd` compresses smaller, `lz4` compresses faster
'serializer' => 'igbinary',
'async_flush' => true,
'split_alloptions' => true,
'prefetch' => true,
'strict' => true,
'debug' => false,
'save_commands' => false,
'prefix' => 'mysitename',
]);
define('WP_REDIS_DISABLED', getenv('WP_REDIS_DISABLED') ?: false);
安裝 PHP 外掛支援超快速配置
想要享用超快速的 object cache pro 配置的話,有兩個前提要先做好
1.安裝igbinary serializer
簡易安裝
pecl install igbinary
pecl install --configureoptions='enable-redis-igbinary="yes"' redis
原始檔安裝
https://github.com/igbinary/igbinary#installing
2.安裝 lzf/lz4/zstd compression
簡易安裝
# Use prompts
pecl install redis
# Skip prompts
pecl install --configureoptions='enable-redis-lzf="yes" enable-redis-zstd="yes" enable-redis-lz4="yes"' redis
原始檔安裝
https://github.com/phpredis/phpredis/blob/develop/INSTALL.md
測試和優化
安裝並配置好Object Cache Pro後,您應該進行測試,以確保一切運作正常。您可以使用速度測試工具如GTmetrix來檢查網站效能的提升。
結論
使用Object Cache Pro可以顯著提升WordPress網站的效能。通過合理配置和優化,您可以為您的用戶提供更快、更流暢的瀏覽體驗。
by Rain Chu | 11 月 2, 2023 | web
在現代的商業世界中,電子郵件成為了溝通的主要渠道,但當企業的郵件被誤判為垃圾郵件並被列入黑名單時,它可能會對業務運作造成嚴重的影響。被列入黑名單不僅影響公司的信譽,還可能導致與客戶、合作夥伴和潛在業務機會之間的重要信息丟失。在此文章中,我們將與您分享實際的案例經驗,描述如何成功地將企業郵件從垃圾郵件名單中移除,並提供一套實用的策略和方法,以確保您的企業信件能夠順利地抵達收件人的收件箱。無論您是IT主管、企業管理者或只是希望了解更多關於這一議題的人,這篇文章都將為您提供寶貴的見解和建議。讓我們一起深入探討,並學習如何避免和解決這一常見的問題。
好用的垃圾郵件清單工具網站
Spamhaus 、 SpamCop 是我們在網路安全領域中的重要夥伴,專門協助我們追蹤和阻止垃圾郵件和網路威脅。作為 IT 主管,我深知 Spamhaus 提供的各種黑名單如何對我們的企業網路安全起到關鍵作用。
- SBL (垃圾郵件黑名單):這是一個列出可疑 IP 位址的名單,如果我們的系統或伺服器 IP 被列入,那麼我們的郵件可能會被許多組織拒收。這需要我們與 ISP 或 Spamhaus 即時溝通,確保名單上的資訊是正確的。
- XBL (Exploits Block List):這個名單包括那些被劫持的、受到威脅的 IP 位址。作為 IT 主管,我需要確保我們的伺服器和終端設備不會成為這些被劫持的目標。
- PBL (The Policy Block List):這是一個針對終端用戶 IP 的黑名單。當我們的員工使用公司的網路資源時,我需要確保他們的行為不會導致我們的 IP 被列入這個名單。
- DBL (網域黑名單):這個名單對我們來說特別重要,因為它包含了可能與垃圾郵件相關的域名。我們的郵件伺服器需要能夠掃描並識別這些可能的威脅。
- ZEN:這是一個綜合性的黑名單,涵蓋了 SBL、XBL 和 PBL 的功能。使用這個黑名單可以讓我們更有效地識別和阻止垃圾郵件和網路威脅。
- MXToolBox ,用來確認是否被加入垃圾郵件清單
- MultiBL,用來確認你的IP是否被列為垃圾郵件清單
- Sender Score,用來幫你的 email 主機打分數
常見的反垃圾郵件組織
垃圾郵件組織有上百個,這裡整理一些常見的
- Composite Blocking List (CBL)
- Spamhaus Block List (SBL)
- XBL Exploits Block List
- Spamcop
- Passive Spam Block List (PSBL)
- Invaluement
- Barracuda
- SenderScore
Spamhaus 、 spamcop 提供的黑名單對我們的網路安全策略至關重要。我們需要密切關注這些名單,並確保我們的網路和資源不會被誤列或受到威脅。
Gmail垃圾郵件的處理方法
參考資料
https://www.richesinfo.com.tw/index.php/mxmail/mxmail-faq/155-mxmail-faq-gmail
by Rain Chu | 9 月 6, 2023 | IIS, PHP
最近遇到 PHP 太吃記憶體的問題,我除了在php.ini 中設定 limit memory 以外,也打算在 IIS 中把總量的記憶體限制住,避免讓主機的記憶體爆滿,而當機,可以在記憶題超過限制後,把自己行程回收。
設定方法
在管理介面中,找到 「Advanced Settings」 ,進去後往下滑找到 「Private Memory Limit (KB)」 ,這邊這個數值是 KB 為主,如果希望將 Private Memory Limit (KB)
設定為 10GB,您需要將其設定為 10485760
KB 設定公式如下
10 GB = 10 * 1024 * 1024 KB = 10485760 KB
我設定的邏輯是觀察主機上所有的 Application Pool 會用到多少的記憶體,然後去分配她
by Rain Chu | 6 月 30, 2023 | web, wordpress
Redis作為一款開源的高性能key-value數據庫,已經在眾多頂尖科技公司和網站獲得廣泛應用。本文將引領您走過安裝和配置Redis資料庫的過程,並提供實用的優化技巧,助力您的系統性能達到新的高峰。
為什麼選擇Redis?
首先,讓我們理解一下為什麼您應該選擇Redis。Redis以其極速性能、靈活的數據結構和高可用性成為獨一無二的選擇。它可以作為緩存,消息佇列,以及在高壓情況下用作可靠的數據存儲。
安裝Redis
Ubuntu安裝Redis
sudo apt install redis-server
Windows 安裝 Redis
直接下載微軟製作的安裝包,下載網址 https://github.com/MicrosoftArchive/redis/releases
驗證Redis是否安裝成功
如果是剛安裝好,並且在同一台機器上可以直接打指令 redis-cli 就可以連線
redis-cli
redis-cli ping
redis-cli info
如果是別台機器的話,記得要開防火牆,並且指定 IP 以及指定 Port 和指定密碼
redis-cli -h 192.168.0.X -p 6379 -a 123456
設定Redis
設定檔案通常位於 /etc/redis/redis.conf ,編輯完記得要重開服務 sudo systemctl restart redis ,不確定conf檔案的位置的話,可以用 redis-cli info 查找,會顯示以下資訊
executable:/usr/bin/redis-server
config_file:/etc/redis/redis.conf
sudo nano /etc/redis/redis.conf
bind
:若要遠端連入Redis伺服器,就會需要設定 bind 0.0.0.0 ::
databases
:設定可用的資料庫數量,在索引的時候是從0
開始數,預設會使用索引值為0的資料庫。這個項目的預設值是16
save
:設定在一定的間隔時間內若資料庫有發生一定程度的改變,就將記憶體中當下的資料存成檔案(快照)。save
的撰寫格式為save <seconds> <changes>
,save 60 10000
表示在60秒內至少有10000個key被改變則做一次快照。
requirepass
:設定客戶端與Redis伺服器連線時所需要的密碼。預設沒有設定,表示不啟用密碼驗證功能。
maxclients
:設定最大連線數。預設沒有設定,當作10000
。
maxmemory
:設定最大的記憶體使用量,如果記憶體用量達到限制,就會根據maxmemory-policy
項目設定的策略來嘗試移除key,如果無法移除,就會使該次插入或修改的操作回傳錯誤。預設沒有設定,表示不限制。
maxmemory-policy
:記憶體用量達到限制時採取的策略。預設沒有設定,當作noeviction
,不移除key。其它策略如下:
volatile-lru
:根據LRU演算法移除過期的key。
allkeys-lru
:根據LRU演算法移除key。(不管有沒有過期)
volatile-lfu
:根據LFU演算法移除過期的key。
allkeys-lfu
:根據LFU演算法移除key。(不管有沒有過期)
volatile-random
:隨機移除過期的key。
allkeys-random
:隨機移除key。(不管有沒有過期)
volatile-ttl
:移除已過期的key中,TTL最小的key。
#bind 127.0.0.1 ::1
bind 0.0.0.0 ::
重啟服務
sudo systemctl restart redis
清除Redis的資料
利用 redis-cli 進去 Redis 主機後,輸入
清除單一資料的指令是
在 WordPress 中使用 Redis
Redis Object Cache 外掛網址 https://wordpress.org/plugins/redis-cache/
設定 wp-config.php
// adjust Redis host and port if necessary
define( 'WP_REDIS_HOST', '127.0.0.1' );
define( 'WP_REDIS_PORT', 6379 );
// change the prefix and database for each site to avoid cache data collisions
define( 'WP_REDIS_PREFIX', 'my-moms-site' );
define( 'WP_REDIS_DATABASE', 0 ); // 0-15
// reasonable connection and read+write timeouts
define( 'WP_REDIS_TIMEOUT', 1 );
define( 'WP_REDIS_READ_TIMEOUT', 1 );
/* That's all, stop editing! Happy publishing. */
require_once(ABSPATH . 'wp-settings.php');
組態檔
Configuration constant | Default | Description |
---|
WP_REDIS_HOST | 127.0.0.1 | The hostname of the Redis server |
WP_REDIS_PORT | 6379 | The port of the Redis server |
WP_REDIS_PATH | | The path to the unix socket of the Redis server |
WP_REDIS_SCHEME | tcp | The scheme used to connect: tcp or unix |
WP_REDIS_DATABASE | 0 | The database used by the cache: 0-15 |
WP_REDIS_PREFIX | | The prefix used for all cache keys to avoid data collisions, replaces WP_CACHE_KEY_SALT . Should be human readable, not a “salt”. |
WP_REDIS_PASSWORD | | The password of the Redis server. Supports Redis ACLs arrays: ['user', 'password'] |
WP_REDIS_MAXTTL | 0 | The maximum time-to-live of cache keys |
WP_REDIS_CLIENT | | The client used to communicate with Redis: predis , phpredis or relay |
WP_REDIS_TIMEOUT | 1 | The connection timeout in seconds |
WP_REDIS_READ_TIMEOUT | 1 | The timeout in seconds when reading/writing |
WP_REDIS_IGNORED_GROUPS | [] | Groups that should not be cached between requests in Redis |
常用控制指令
Command | Description |
---|
wp redis status | Shows the object cache status and diagnostics |
wp redis enable | Enables the object cache |
wp redis disable | Disables the object cache |
wp redis update-dropin | Updates the object cache drop-in |
效能考量,安裝 Phpredis
請先到 phpredis 這邊搜尋對應你平台的檔案,用 Linux Ubuntu 為例,下載 redis-6.0.2 版本 ,並且解壓縮他
wget https://pecl.php.net/get/redis-6.0.2.tgz
tar -zxvf redis-6.0.2.tgz
cd redis-6.0.2
接下來先編譯原檔案
sudo phpize
sudo ./configure
sudo make && sudo make install
完成編譯檔案後,要把 .so 檔案放到 php 的 modules 中,先把該目錄找出來
php -i | grep extension_dir
系統回應我,extension_dir => /usr/lib/php/20220829 => /usr/lib/php/20220829 ,則將剛編譯好,放在 modules 下的 redis.so 複製到正確的目錄中
sudo cp ./modules/redis.so /usr/lib/php/20220829/
複製完畢後,需要去修改 php.ini 檔案,讓他支援 redis,這邊我示範用 Nginx
sudo nano /etc/php/8.2/fpm/php.ini
將 extension 打開,請找到 Dynamic Extensions ,並且在下面加入
設定完成後,重開 php 讓他生效
sudo systemctl restart php8.2-fpm
檢查方法,利用info.php,並且搜尋是否有redis字眼,如下圖就是成功了
關於Redis的大小事
預設安裝完畢,初始話是支援16個資料庫的,分別由編號 0-15 ,要增加資料庫,要去 Redis 的組態檔裡面修改 redis/redis.conf 中,找到 databases ,並且調整數值後,重新啟動即可
Redis 讀取資料
redis-cli set my_key "Value"
redis-cli get my_key
Redis 列出所有的 KEY
相關文章
詳細的指令操作介紹
近期留言