十一月 30 2017
PHPExcel 的活頁簿標題 ( SheetTitle ) 處理
之前曾經使用 PHPExcel 踩到地雷,處理完之後一直忘記載這邊留個紀錄(拖稿?)。
Excel 的活頁簿標題有字元 & 長度限制,但 library ( PHPExcel ) 沒有特別判斷 & 處理,所以…
// Excel 的活頁簿 title 不允許 * : / \ ? [ ] $currTitle = str_replace( array('*', ':', '/', '\\', '?', '[', ']'), "", $currTitle ); // 字數上限 31,保守抓 30 $maxByte = 90; $chars = mb_strlen($currTitle, 'UTF-8'); while ( $chars > 30 ) { $currTitle = mb_strcut($currTitle, 0, $maxByte, 'UTF-8'); $chars = mb_strlen($currTitle, 'UTF-8'); $maxByte--; }
十二月 4 2017
PHP 的 MySQL driver/library 與記憶體耗用
再來還些債…
前陣子我們家在看一些 PHP 的版本差異,也順便拆一些地雷。
先說記憶體耗用,我們用下面這段程式在一些 PHP 版本上執行,觀察記憶體耗用:
在 PHP 5.1 ( on 32-bit Linux ) 觀察到的記憶體差距值大約是 5.8 MB,在 PHP 5.3 ~ 5.6 ( on 64-bit Linux ) 觀察到的記憶體差距值大約是 14 MB,而 PHP 7.1 ~ 7.2 ( on 64-bit Linux ) 觀察到的記憶體差距值大約是 4 MB。
至於 PHP 的 MySQL driver/library 方面…
參考官方提供的 Overview of the MySQL PHP drivers : Buffered and Unbuffered queries ;PHP 的所有的 MySQL extensions 預設使用 buffered mode,所以在撈取大量資料時,PHP 執行完 SQL statement 就會耗用大量記憶體。
另外,在官方提供的 Overview of the MySQL PHP drivers : Choosing a library 可以看到,PHP 5.3 以前的預設 MySQL driver ( libmysqlclient ) 沒使用 PHP 的原生記憶體管理,PHP 5.3 之後的預設 MySQL driver ( mysqlnd; MySQL Native Driver) 才開始用。
對這些行為,我們另外生了一段測試程式:
在 PHP 7.1 ( with mysqlnd , 64-bit Linux ) 的數據如下:
在 PHP 5.1 ( with libmysqlclient , 32-bit Linux ) 的數據則是:
應該有為數不少的 PHP developers 曾經踩過這種記憶體相關的地雷…
By Joe Horn • PHP •