Select Page
wordpress 優化 PHP : WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers)

wordpress 優化 PHP : WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers)

我的系統是 Ubuntu 20 + Nginx + Php7.4-fpm ,遇到不能安裝程式,安裝到一半都會停掉,去檢查 /var/log/php7.4fpm.log ,發現出現 warning message

warning : [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 0 idle, and 15 total children

我的解決方法是去到 /etc/php/7.4/fpm/pool.d 下打開 www.conf

sudo nano /etc/php/7.4/fpm/pool.d/www.conf

然後改善 pm 的相關設定值,以我的機器為例,16GB RAM,CPU 4 顆,我的設定值參考公式為

pm.start_servers = min_spare_servers + (max_spare_servers - min_spare_servers) / 2

所以我修改的參數如下

pm = dynamic
pm.max_children = 30 # 10-30 間是常見的設定
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 10
pm.max_requests = 5000

修改完畢之後,重啟就不會看到問題了

pm.max_children 的合理配置方法

要合理的評估一個數字,要先考量以下幾點

  1. 伺服器可用的記憶體(RAM):確認伺服器總共有多少記憶體可供 PHP-FPM 使用。
  2. 每個 PHP 進程的平均記憶體消耗量:觀察或測試你的應用,以確定每個 PHP 進程大概需要多少記憶體。
  3. 保留記憶體:為作業系統和其他服務保留一部分記憶體,以確保系統穩定運行。

步驟 1:測量 PHP 進程的平均記憶體消耗

ps -ylC php-fpm8.2 --sort:rss

找到 RSS 列的值(常駐集大小),將它們加起來,然後除以 PHP-FPM 進程的數量,得到平均記憶體消耗量(單位是 KB)。

步驟 2:計算可用記憶體

確定伺服器上為 PHP-FPM 分配的記憶體總量。如果伺服器僅運行 PHP-FPM(例如,沒有資料庫等其他服務),則可以減去為作業系統和其他必要服務保留的記憶體量。一個常見的保留量是 512MB 到 1GB。

步驟 3:計算 pm.max_children

利用以下公式

pm.max_children = (伺服器可用記憶體 – 保留記憶體) / 平均每個 PHP 進程的記憶體消耗

假設:

  • 伺服器有 6GB(6144MB)的 RAM。
  • 作業系統和其他服務保留了 1GB(1024MB)。
  • 通過測量,你發現每個 PHP 進程平均消耗 50MB 記憶體

pm.max_children = (6144MB – 1024MB) / 50MB = 102.4

在這個例子中,你可以將 pm.max_children 設置為大約 100。

注意:始終留有足夠的餘地來處理意外的高峰,不要將所有資源都分配給 PHP-FPM,以避免伺服器過載。此外,實際部署後,應監控伺服器性能,並根據需要調整 pm.max_children 的值。

參考資料如下

https://www.gushiciku.cn/pl/p9Vf/zh-tw

Ubuntu 20 用 Speedtest 測網速

Ubuntu 20 用 Speedtest 測網速

如果OS有圖形化的介面,可以透過瀏覽器瀏覽 speedtest.net 去測試網速,但來到了 Linux base 的 Ubuntu command line 上頭,就需要安裝 SpeedTest 的 Script 腳本,透過腳本來檢查網速。

安裝 Python

因為 SpeedTest 是用 Python 寫的,所以先打開終端機,先把 Python3 pip 裝起來

sudo apt-get install python3-pip

安裝 SpeedTest

透過 pip3 安裝 SpeedTest

sudo pip3 install speedtest-cli

用 SpeedTest 測試網速

speedtest-cli

用 SpeedTest 測試網速並且分享

speedtest-cli --share

結果會是

https://www.speedtest.net/result/13144792277.png

4G兒童智慧手錶有 Line FB Skype 視訊通話 定位 課表

幼兒園到國小的小朋友,沒辦法帶手機去學校,但父母要接送小朋友,或是在商場走失時候沒法連絡,一值是我們的痛點,這時候我們可以使用可通訊的智能手錶來給小朋友配戴,我所需要的功能是讓他上課的時候不要亂玩,下課得時候可以找的到他,找不到他時候可以通訊即可。

痛點說明

1.上課時不能用

2.控管小朋友的交友和下載

3.要能找的到小朋友,防走失

4.可以語音通訊和視訊通訊

5.價格不要過高,包含通訊費

6.一般手錶防水、防摔功能要有

7.要養電信門號,小朋友使用的很少,感覺划不來

解決方案

  • 可以下載軟體
  • 有鏡頭,可以視訊
  • 有麥克風,可以通話
  • 防水功能,IP67以上
  • 有GPS定位功能
  • 通訊有4G SIM卡
  • 軟體可以定義上課時間
  • 防滑、防過敏、防汗手錶帶

建議附加硬體

  • 藍芽
  • WIFI
  • 保護套
  • SOS按鍵
  • 大電池,最少要一天

建議附加軟體

  • 課表
  • 遠端拍照
  • 安全區域,離開電子圍籬會警報
  • 語言翻譯
  • 學習軟體
  • APP STORE
  • 計算機
  • 手機錢包
  • 導航軟體
  • 常用通訊軟體,LINE、FB Messager等

搭配電信解決方案

  • 預付卡,第一次費用300元,其他用多少算多少
  • 吃到飽方案,每個月付299-799元間,超過的就不要用了,效益不高
  • 漫遊卡、物連網卡,這也是我採用的方案,買卡費用150元內,其他每個月上網費用約70元

最划算適合小朋友的電信解決方案

初始費用100元、每個月50元

推薦的高CP值的兒童智慧手錶

HeroWatch | Hero 4G Smartwatch for kids| NFC payment (abouttime-tech.com)

https://www.fennec.me/tw/index

最便宜的兒童智慧手錶

蝦皮商場請輸入關鍵字「兒童智慧手錶」搜尋,例如這一篇

https://shopee.tw/%E5%8F%B0%E7%81%A324h%E5%87%BA%E8%B2%A8-%E5%85%92%E7%AB%A5%E6%99%BA%E6%85%A7%E6%89%8B%E9%8C%B6-%E6%9C%89Line-FB-WhatsApp%E7%B9%81%E9%AB%94-%E8%A6%96%E8%A8%8A%E9%80%9A%E8%A9%B1-%E5%AE%9A%E4%BD%8D4G%E5%85%92%E7%AB%A5%E6%89%8B%E9%8C%B6-%E9%9B%BB%E8%A9%B1%E6%89%8B%E9%8C%B6-%E5%85%92%E7%AB%A5%E6%99%BA%E8%83%BD%E6%89%8B%E9%8C%B6-i.274166228.16356700757

使用 Openzeppelin 和 Remix 發幣,可以擴充、投票、分潤、管理

使用 Openzeppelin 和 Remix 發幣,可以擴充、投票、分潤、管理

之前推薦過一鍵發幣,那是懶人作法,適合快速且只想要簡單發幣的人,給點錢就能快速地解決問題,但真實的社會是不是這麼簡單的,真正的發幣行為應該是撰寫智能合約,通過第三方驗證,證明無漏洞後,並且發佈在區塊鏈上,聽起來很難,但看過這篇文章後,整個過程也是5分鐘內而已。

OpenZeppeLin 智能合約範本

首先要使用 OpenZeppeLin 來產生你發幣用智能合約,在 OpenZeppeLin 上面可以找到很多範本,可以直接引入即可,但更簡單的方法是使用 OpenZeppeLine精靈 來快速產生智能合約程式碼。

https://wizard.openzeppelin.com/

在這個畫面中如果要簡單發幣的話,可以填入 Name (代幣名稱), Symbol(代幣的代號), Premint (欲鑄的貨幣數量)的資料就可以了,常用的進階功能則有 Burnable, Votes, Pausable, 如果你是為了公司發行,可以在 Access Control 中選擇 Roles 然後建立自己的控制規則,可以多人控管開發行的貨幣

Remix 上發行貨幣

在 OpenZeppeLin 畫面上按下 Open in Remix 按鈕,就可以直接將合約範本直接帶入到 Remix

1.先連結你的 MetaMask 小狐狸錢包

2.選擇對應的編譯器,然後按下編譯,以本例是 0.8.4 版本的編譯器,Solidity 語法

3.將代幣發佈到區塊鏈上,環境選擇 Injected Web3, 並且注意你的 MetaMask 連結的網路是那哩,以我的圖片例子是選在 Ploygon 的測試鏈上,然後發佈的合約要選擇倒剛剛寫好的 ShaneToken, 設定無誤後按下 Deploy 即可發行

5.在 MetaMask 中確認合約正確性,注意發行到的網路是否正確,以及看一下 Gas Fee 多少錢,本例是發行在 Ploygon 上,所以使用的代幣是 MATIC ,自己的錢包有沒有對應的代幣可以支付,檢查完畢按下確認後就可以發行成功了

最後要將代幣匯入到 MetaMask 中

可以在 Polygonscan 中找到你得合約網址

將合約地址填回 MetaMask 就大功告成囉

可以在自己的錢包中看到自己發行的代幣,當個有錢人

延伸閱讀,利用 OpenZeppelin 來發NFT

https://www.frank.hk/blog/nft-smart-contract/

https://wizard.openzeppelin.com/#erc721

測試鏈做測試

測試時,需要去水龍頭那邊取得手續費用

NameLink
polygon-mumbaiPolygon Faucet
harmonyFaucet || Harmony Testnet
Cronoshttps://cronos.crypto.org/faucet
iotexIoTeX Faucet – Getting IoTeX for development
BscBinance Smart Chain: Faucet
HecoHuobi ECO Chain
常用測試鏈

SOL原始程式碼

如果不能用精靈產生程式碼,可以直接複製下面的程式碼

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "@openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20SnapshotUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-ERC20PermitUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20VotesUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20FlashMintUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";

contract TestToken is Initializable, ERC20Upgradeable, ERC20BurnableUpgradeable, ERC20SnapshotUpgradeable, OwnableUpgradeable, PausableUpgradeable, ERC20PermitUpgradeable, ERC20VotesUpgradeable, ERC20FlashMintUpgradeable {
    /// @custom:oz-upgrades-unsafe-allow constructor
    constructor() {
        _disableInitializers();
    }

    function initialize() initializer public {
        __ERC20_init("Test Token", TST");
        __ERC20Burnable_init();
        __ERC20Snapshot_init();
        __Ownable_init();
        __Pausable_init();
        __ERC20Permit_init("Shane Token");
        __ERC20Votes_init();
        __ERC20FlashMint_init();

        _mint(msg.sender, 100000000 * 10 ** decimals());
    }

    function snapshot() public onlyOwner {
        _snapshot();
    }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function mint(address to, uint256 amount) public onlyOwner {
        _mint(to, amount);
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount)
        internal
        whenNotPaused
        override(ERC20Upgradeable, ERC20SnapshotUpgradeable)
    {
        super._beforeTokenTransfer(from, to, amount);
    }

    // The following functions are overrides required by Solidity.

    function _afterTokenTransfer(address from, address to, uint256 amount)
        internal
        override(ERC20Upgradeable, ERC20VotesUpgradeable)
    {
        super._afterTokenTransfer(from, to, amount);
    }

    function _mint(address to, uint256 amount)
        internal
        override(ERC20Upgradeable, ERC20VotesUpgradeable)
    {
        super._mint(to, amount);
    }

    function _burn(address account, uint256 amount)
        internal
        override(ERC20Upgradeable, ERC20VotesUpgradeable)
    {
        super._burn(account, amount);
    }
}

基本的發幣程式碼,支持可以維護以及可以銷毀

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

/// @custom:security-contact 
contract TestTokenMintableBurnable is ERC20, ERC20Burnable, Ownable {
    constructor() ERC20("Test Token Mintable Burnable", "TTMB") {
        _mint(msg.sender, 100000000 * 10 ** decimals());
    }

    function mint(address to, uint256 amount) public onlyOwner {
        _mint(to, amount);
    }
}

發幣之後,驗證合約的安全性

發幣前後都要利用 CoinTool ,來驗證的你合約安全,才會讓大眾們信任

征4戈壁說 | 最感動人心的即興演講 : 放下、鼓勵、堅持與擁抱!

征4戈壁說 | 最感動人心的即興演講 : 放下、鼓勵、堅持與擁抱!

戈壁說

NFT

放下

鼓勵

擁抱

堅持

創業家精神

我是一個創業家,創業10年了,我在創業第8年的時候獲得了富士康以及幾家外商企業共同投資,運營了一段時間,比較有時間的時候到台大EiMBA進修,進修的第一年,教授就邀請我到台大創意創業中心,指導學生和碩士生有關創新、創業方面的相關事宜。 如果說道來到戈壁的體會,先要說到我最喜歡的一句話「像個孩子」,像個孩子般盡情的揮灑、像個孩子般盡情撒野、像個孩子般盡情奔跑。因爲我們生活在都市叢林中,所以我們很難有時間真正把自己的心靈放開的時候,來到戈壁就像小朋友從爬到會走的那一步,他剛剛跨出那一步心中的感受,這句話對我來說非常感動。 還有一首最難忘的歌,《怒放的生命》,這幾天時時聽、經常聽,所以我決定回去一定要去KTV裡面好好地練習。 接下來,我想講一講這四天我學到了什麼。

 

第一天我學到的第一件事就是放下

因爲我的背包實在是太重了,來這邊之前,我什麼都不知道,所以該帶不該帶的東西都帶上了,路途中有人一直叫我放下,這是我來到這邊學到的第一件事。放下就像我們常常講的一句話,你如果握緊你的雙手,握緊你的拳頭,你什麼也得不到,當你張開雙手,天下就是你的。

第二天我學到的是鼓勵

因爲開始有了排名賽,要努力跟上這個大部隊,其實我覺得還是蠻難的,很多時候我一個人走,一個人走的時候,想當起以前當兵的時候,就會唱唱歌,跟著戈友走的時候,就一起聊聊天,非常感覺我們終點的賽事志願者,他陪我一起最後加油,最後我拿到了銀牌,就只差大概三分鐘左右,所以第二天我學到的是鼓勵。

第三天我覺得我學到的是堅持

到了第三天,和其他戈友一樣我也收穫大水泡,除此之外還有腫得像拳頭一樣大的腳踝,所以走起路來格外的辛苦,但是我想到我一個人到達就是整個院校到達,所以我就努力的堅持下去,不斷的堅持到底,沿路的戈友沒有洩氣的話,都是鼓勵的話,所以我覺得第三天非常值得堅持。

到了第四天,我覺得我學到的是擁抱

擁抱大自然,擁抱戈壁,擁抱所有的戈友們,所以我要謝謝我們的領隊、還有一路照顧我飲食起居的志願者、還有所有的戈友們,謝謝大家,我愛你們!