"Php"
- PHP 的請求生命週期與 SAPI:直譯器的位置、程序壽命與狀態壽命
說明一個 HTTP 請求怎麼變成一次 PHP 執行:PHP 在程序啟動與每個請求開始、結束時各做什麼,SAPI 這一層介面怎麼讓同一個直譯器接上 CGI、Apache、FastCGI 與常駐伺服器,以及用直譯器住在哪裡、執行它的程序活多久、應用程式的狀態活多久這組問題比較各種執行模型
- SAPI(Server API)
在 PHP_SAPI 或 phpinfo 看到 cli、fpm-fcgi、apache2handler、frankenphp 這類值,要知道它代表 PHP 以哪種方式被啟動、請求怎麼交進來時
- 無 SSH 的 FTP / 面板管理環境接管
接手一個只有 FTP 和 phpMyAdmin(或 cPanel / Plesk)存取的 PHP 專案:沒有 SSH、沒有 CLI 時,怎麼盤點現況、建立本地開發環境、制定部署與資料庫變更紀律,以及找到升級路徑的切入點
- CGI:每個請求啟動一個 PHP 程序的執行模型
說明 CGI 怎麼把一個 HTTP 請求交給外部程式:web 伺服器為每個請求啟動一個程序,用環境變數與標準輸入輸出傳遞請求和回應;PHP 以 php-cgi 執行時每個請求付出的啟動成本、OPcache 為什麼沒有作用、以每個站台的使用者身分執行帶來的隔離,以及請求資料與程式呼叫參數之間的邊界問題
- Shared-nothing 請求模型
要判斷 PHP 的全域變數、static 變數或類別靜態屬性會不會留到下一個請求,或評估換成常駐 worker(Octane、FrankenPHP worker)時哪些程式碼會出問題時
- 對齊 prod 的 runtime container
要開發一個線上跑 PHP 7.2 / MySQL 5.7 舊環境的專案、或要在本機重現線上事故時回來讀 — 對齊哪些維度、怎麼從線上抄設定、什麼時候值得
- Runtime 版本升級
PHP / Node.js / Python 大版本升級的相容性評估、本地驗證、分批部署策略與常見陷阱
- mod_php
接手 Apache 加 mod_php 的舊站、評估要不要換成 PHP-FPM,或遇到 .htaccess 的 php_value 在新環境回 500 時
- mod_php:PHP 直譯器嵌進 Apache 程序的執行模型
說明 mod_php 怎麼把 PHP 直譯器載入 Apache 的每個子程序:為什麼它要搭配 prefork MPM、每個子程序都帶著 PHP 對記憶體與並發的影響、所有站台共用 Apache 的執行帳號、php.ini 與 .htaccess 的設定方式,以及從 mod_php 搬到 PHP-FPM 時 .htaccess 的 php_value 與 .user.ini 的差異
- FastCGI:讓 web 伺服器與常駐的 PHP 程序溝通的協定
說明 FastCGI 協定怎麼在 CGI 的基礎上去掉每個請求重啟程序這一點:常駐的應用程式程序、web 伺服器與它之間的連線、一個請求在協定裡的樣子,以及 SCRIPT_FILENAME 由 web 伺服器決定會帶來的安全邊界(cgi.fix_pathinfo 與 try_files)
- ZTS(Zend Thread Safety)
在 php -i 看到 Thread Safety 是 enabled 或 disabled,或要判斷某個 PHP 能不能跑在多執行緒的伺服器(Apache worker/event MPM、FrankenPHP)裡時
- PHP-FPM:常駐 PHP worker 的程序管理與主要的調校旋鈕
說明 PHP-FPM 怎麼管理一群常駐的 PHP worker:pool 怎麼做到每個站台不同執行帳號、pm 的三種開程序策略、max_children 如何決定並發上限與請求排隊、max_requests 定期換掉 worker 控制記憶體、request_terminate_timeout 與 slowlog 怎麼處理跑太久的請求、status 頁怎麼讀,以及每一項對壓測數字的影響
- PHP-FPM(FastCGI Process Manager)
在 Nginx 或容器環境看到 php-fpm、9000 埠、pool 設定或 502 Bad Gateway,要知道 PHP-FPM 負責什麼、哪些設定決定並發與記憶體時
- OPcache
部署新版程式碼之後頁面還在跑舊版、評估 OPcache 的大小設定,或比較不同執行模型下 PHP 的效能差距時
- OPcache 與程序壽命:編譯結果的快取在各種執行模型下的效果
說明 OPcache 快取的是什麼、它存在哪裡,以及為什麼它的效果取決於執行 PHP 的程序活多久:CGI 下命中次數永遠為零、PHP-FPM 的 worker 共用同一份快取;框架請求開與關 OPcache 的延遲差、memory_consumption 與 max_accelerated_files 的估算,以及部署新程式碼時 validate_timestamps 與 revalidate_freq 決定舊版還會執行多久
- 容器裡的 Nginx 與 PHP-FPM:拆成兩個容器與放進同一個容器的做法與各自的陷阱
說明把 Nginx 與 PHP-FPM 放進容器的兩種擺法:官方 php-fpm 映像檔替容器改掉的預設值(log 導向、clear_env、監聽位址、停機訊號),拆成兩個容器時程式碼要兩邊都有、否則靜態檔會被 PHP 回成 200 的 HTML,以及放進同一個容器時要自己處理的程序監看、停機訊號轉送與 FastCGI 的監聽範圍
- 常駐 worker 模型:FrankenPHP worker 模式、Laravel Octane 與跨請求殘留的狀態
說明讓 PHP 應用程式只啟動一次、在記憶體裡連續處理請求的常駐 worker 模型:它省下的是每個請求重新啟動框架的成本,失去的是 shared-nothing 的隔離;以 FrankenPHP 的 worker 模式與 Laravel Octane 實測靜態屬性跨請求累積、記憶體隨請求數線性增長與 max-requests 重啟,以及寫給這個模型的程式要避開的寫法
- 無 SSH 環境的資料庫備份與變更管理
在只有 phpMyAdmin 或有限遠端連線的無 SSH 環境裡,怎麼建立可靠的資料庫備份策略、schema 變更紀律與還原演練流程
- 程式碼版控與 FTP 部署紀律
無 SSH 環境的 PHP 專案的程式碼怎麼從 FTP 拉回來建 Git repo、設定檔怎麼分離、FTP 部署怎麼建立可追蹤的流程、以及怎麼用 CI 取代手動上傳
- Legacy PHP 的安全盤點
接手 legacy PHP 專案後的系統性安全審查:credential 掃描、PHP 版本風險、常見漏洞模式的 grep 偵測、.htaccess 防線、檔案權限、外部依賴與掃描工具
- 無 SSH 環境的監控與告警
無 SSH 環境沒辦法裝 agent、沒辦法串 log pipeline,用外部 HTTP check、錯誤追蹤服務與效能基線建立最低成本的監控能力
- Composer
PHP 的套件管理工具,管理專案的第三方依賴、版本鎖定與安全掃描
- Laravel Sanctum 的 Bearer Token 設計剖析:{PK}|{secret} 為什麼這樣設計
Laravel Sanctum `{PK}|{secret}` 格式的設計理由、hash 儲存取捨、constant-time 比對位置,以及跟 GitHub PAT、Stripe API Key 的差異。