[PHP] 處理二進制資料 – Binary Data Pack/Unpack

Intro PHP支援二進制的資料處理,應用上在跟低階語言(如C語言)做資料介接就幫上許多。 PHP函式 pack() 封裝 Data to BIN unpack 分析 BIN to Data $bin = pack(“Sa3”, 50, ‘abc’); file_put_contents(‘data.bin’, $bin); $bin = file_get_contents(‘data.bin’); $data = unpack(“SShort/a3Char3”, $bin); print_r($data); Array ( [Short] => 50 [Char[3]] => abc )

[PHP] PHP-FPM Pool Socket (Multi-Sock-User) 設定指南

Intro 情境:想要某個Site的PHP-FPM改變執行使用者(例如Webhook trigger特殊程式) 設定方式 概念上,一個pool sock擁有一組設定,包含執行使用者(user)或群組(group),所以可以利用開立多個pool sock來提供給Web server多種PHP-FPM Conf達到應用。 1. 開立新的pool PHP-FPM Pool設定複製原始www.conf出新的自定義設定檔,將listen sock自定義改掉,讓var/run/php下自動產生新定義的socket,例如/etc/php/7.0/fpm/pool.d/deployer.conf: ; pool name (‘www’ here) [deployer] user = deployer group = www-data listen = /run/php/php7.0-fpm_deployer.sock 設定完後restart PHP-FPM即會自動生成對應的新Sock 2. 提供新的Socket給Web server site 以Nginx為例,換上新的Socket: location ~ \.php$ { […]

[Yii2] i18n(Internationalization) – 語系架構設定範例 (使用Key對應架構)

Intro 官網文件:Internationalization 語系代碼:[i18n] 淺談Internationalization – Language Identifiers (RFC 3066) 架構範例 別於官網以主要語系(英文)為sourceLanguage,本章範例以Key的架構去定義語系(也就是Message是指定一個Key必經轉譯)。 Configuration return [ // set target language to be English ‘language’ => ‘en-US’, // set source language to be a customized key which means it will always translate. ‘sourceLanguage’ […]

[PHP] Codeigniter 3 底層解析

Intro CodeIgniter User Guide bcit-ci/CodeIgniter Router Core: system/core/Router.php 由Codeigniter core class執行裝載為$RTR。 Uri中,Query String(Uri)的載入是在__construct()執行_set_routing()後,分別設定完成以下Properties: class – Controller name method – Action name directory – Controller directory if exist _set_routing() => _parse_routes() > _set_request() or _set_default_controller() 所以Router需裝載Uri並透過Uri取得segments注入設定。 Uri Core: system/core/Uri.php __construct()即會解析Uri(uri_string)至segments:_set_uri_string() Uri拿取方法uri_protocol預設就是使用:_parse_request_uri() […]

[Windows] 環境變數設定(Environment Variables) – 如php, mysql, cygwin cmd.

Intro 一般應用在使用如Xampp的php想要有alias指令,或像Cygwin執行檔環境變數問題。 Windows10環境變數設定選單: “My Computer” -> Properties -> Advanced -> Environment Variables 或 “Control Panel\System and Security\System” -> Advanced system settings -> Advanced -> Environment Variables 效益上就是要達到SET PATH=%PATH%;C:\your,差異在設定方式會是永久保存。 環境變數設定 可以先看到分User variables與System variables,一般我們只需要異動使用者的。 變數Path Path變數提供類似Command Alias功能, 實作上例如安裝Xampp後期待可以透過cmd輸入php,mysql等alias執行相依程式。 以PHP安裝在D:\xampp\php\目錄舉例,在環境變數設定介面選擇Path的變數進行編輯,可以新增一行: D:\xampp\php 儲存後,可以在cmd下測試輸入php -v是否有成功。

[PHP] PHP底層效能原理測試 – PHP Core Performance Test

Intro PHP底層效能原理測試 指標&記憶體 測試版本:PHP 5 $data2 = $data; $data3 = $data; 以第一行為例:此時的宣告記憶體配置等同於$data2 = &$data,即記憶體不會因$data2宣告而多複製產生,只有在相依變數產生異動(Assign Write)時才會有相應機制: 當$data先產生異動 異動事件如: $data[0] = ‘modified’; $value = &$data[0]; 異動前記憶體共用同一份$data內容,以下為流程: 因為$data有相依變數,PHP會將異動前$data的記憶體內容複製或保留至暫存區(Temp),自己使用新的內容進行異動。 此時記憶體有兩塊內容:新的$data與舊的$data內容 原本相依$data的變數($data2與$data3)轉擁有或轉指向這個暫存區(Temp)。 若$data2又發生異動,則會同第一步自己使用新的內容進行異動,此時$data3為擁有暫存區(Temp)因為沒有其他相依變數。 此時記憶體有三塊內容:$data,$data2,$data3內容 若$data3又發生異動,因為沒有相依變數,等於擁有內容則直接異動。 以上在記憶體形成3塊由原生$data產出的內容,最後各自獨立。 Foreach Pointer 個人不偏好在foreach內使用Pointer,本身Loop內也沒有必要使用Pointer優化。 弊端方面就是foreach的特性,還會產生母變數記憶體複製的問題。 弊端特性之一:PHP Pass by reference in […]

[Yii2] Widget 建構與目錄架構 – Widget Pattern

Intro Yii2 Application Structure: Widgets Directory Structure 通用(共用)Widget架構 your_app (e.g. frontend)/ – widgets/ – assets/ – js/ – hedaer.js – css/ – header.css – views/ – hedaer.php – HeaderWidget.php – HeaderWidgetAsset.php 通用架構上,assets即可以考慮另外移至web外層以省搬移成本。 獨立Widget架構 your_app (e.g. frontend)/ – widgets/ – header/ […]

[Yii2] Why Yii2 Framwork – Yii2 框架選型指南

Introduction 為什麼選擇Yii2作為PHP Framework。 特色 Application Components Components事先定義,透過Magic Method用到才new出來,效能與結構兼具考量。 概念如同CodeIgniter 3的Library(不做Alias),在單一Request cycle中為一次性啟動物件(Singleton)。 Asset Manager Assets支援物件導向管理,並且支援application內動態生成(適合用在Composer assets)。特色包含繼承、載入順序、重複載入防止。 保留Controller作為預設路由 如同CodeIgniter,預設使用Controller資料夾結構映射Route,但也支援自訂Route Map。 Yii2 Url Manager的Rule還可以支援URL生成比對,對應的Route Value在Url::to()宣告是可以自動生成Route Key。例如,’test’ => ‘site/action’的rule在URL::to設定site/action實際會生成test。 Pure Template Engine PHP本身就是個樣板引擎! Yii2使用原生PHP達到框架View Layout,相對於Laravel額外多一層打造的Blade引擎或CodeIgniter沒架構的純粹View引入法,Yii2扮演著中庸最適解決方案。 原理是使用規範的嵌入點打造每個Layout,藉由Controller決定選用的Layout套入Content View。 …補齊中…

[Yii2] Yii 2 Advanced Template 開發流程指南

Intro Yii 2 Advanced Project Template 適合前後站台Spec開發模板。 Dev – 開發人員 建置與更新其實與Composer流程相同: ./init –env=Development –overwrite=All composer install Prod/Stage – 佈署 Stage的建置與更新也相同,唯獨佈署時Stage可以包固定流程以確保每次更新: ./init –env=Production –overwrite=All composer install 設定檔 設定檔位於/environments內,更新後對應的環境得再跑一次init。

[PHP] 三元運算式 – Ternary Operator (?:) – 簡化if (符號:問號/冒號 | ? | : )

簡介 三元運算子,在許多程式語言都會有,基本上您可以把它想成是if的一種簡化. 直接來看例子比較: // Example usage for: Ternary Operator $action = (empty($_POST[‘action’])) ? ‘default’ : $_POST[‘action’]; // The above is identical to this if/else statement if (empty($_POST[‘action’])) { $action = ‘default’; } else { $action = $_POST[‘action’]; } 可以直接參考官方文件:PHP Comparison […]