2017年1月22日 星期日

[PHP]關於記憶體使用的三兩事

通常在執行一些排程, 或是資料處理量較大的程式的時候常常會遇到

Fatal error: Allowed memory size of xxx bytes


這樣的錯誤, 通常一般人會想說, 那就調高就好了,

但這不會是很好的做法, 畢竟沒搞清楚為何會超過設定值.

以下為記憶體相關 function  ,
// 當前記憶體使用量
memory_get_usage();

// 此次執行記憶體峰值
memory_get_peak_usage();

// 單位轉換
function convert($size){
$unit=array('b','kb','mb','gb','tb','pb');
return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}

切記!通常使用過量都是因峰值造成,故debug請用
// 此次執行記憶體峰值
memory_get_peak_usage();

另外,最近在使用Laravel Collect function 有稍微注意了一下內部核心寫法有使用到 array_map()

發現使用 array_map 與 使用單純 foreach + & 的方式 記憶體峰值大約差了三倍...


所以如果有使用較大量資料時可能要考量一下...

 

最後來分享一下較常發生記憶體使用過量的原因&解法,

  1. 預設值太小(這部分須自行評估, 特別注意這次一次的使用量, 如果設定太大可能會造成其他服務癱瘓)
    ini_set("memory_limit","256M");


  2. 迴圈設assign參數造成占用過多記憶體
    // 善用&, 可以減少記憶體浪費
    foreach (range(1, 40) as $key => &$value)
    {
    $value = $value * $value;
    }
    // 又或者要記得清除不會在被使用的參數
    unset($value);


  3. 瞬間記憶體峰值過高(json_decode較大資料時容易發生)
    // 這個要看情況,之前遇到我是提出分批decode的方式。
    // 不然就要尋求第三方套件了,但之前試過大概也是使用了80%


2016年11月4日 星期五

[CentOS]安裝Laravel注意事項(SELinux)

安裝Laravel時須注意SELinux會擋掉寫入的權限,
故需另外開啟後才能正常進入頁面。
// 需為伺服器使用者的身份有寫入權限
CHOWN nginx:nginx storage

// 開啟SELinux資料夾讀寫權限
chcon -r -t httpd_sys_rw_content_t storage

 

2016年10月30日 星期日

[CentOS7] Restart PHP-FPM

今天為了開發Laravel,裝了一些套件

殊不知... 裝完之後... 重啟PHP-FPM失敗
systemctl restart php-fpm

原來只是PHP-FPM的名字比較有個性(!?)
[root@ip-QAQ ~]# systemctl | grep "fpm"
php70-php-fpm.service loaded active running The PHP FastCGI Process Manager

但我好懶 ... 複製也懶 ... 就設了這一句alias ...
 systemctl | grep "fpm" | awk '{print "systemctl restart " $1 | " bash "}'

 

2016年10月12日 星期三

[HTML5]自訂必填欄位訊息

某天看著長串的Validate的Javascript ...

但大部分都只是必填 ... 但 required 的訊息都是同一個 ...

有時候還真不太懂要填什麼好 ...

這時候就需要自訂一下必填的訊息了 ....

2016年9月26日 星期一

[PHP] 從陣列抓出Datetime格式

<?php

$data = array (
'2016-11-02 14:30:00 Mary is a girl.',
'Hello 2016-11-14 14:30:00Mary.',
'Mark 2016-11-02 14:30:00is a boy ',
'Hello Mark'
);

$matches = array ();
foreach ($data as $str)
if (preg_match ('/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/i', $str, $m))
$matches[] = $m[0];


var_dump($matches);

 

2016年5月10日 星期二

[Linux]使用GREP從文件中取出所有Email

當... 沒有在Email塞入資料庫前先做過濾時 ...

就可能需要用到這 ...
// 取出 test.csv 中符合 Email 格式的資料
的的grep -E -o“B [A-ZA-Z0-9 ._%+ - ] + @ [A-ZA-Z0-9 .-] + [A-ZA-Z] {2,6} B” test.csv

// 獨特
的的grep -E -o“B [A-ZA-Z0-9 ._%+ - ] + @ [A-ZA-Z0-9 .-] + [A-ZA-Z] {2,6} B” test.csv | 排序| uniq的的

 

2016年3月9日 星期三

[SQL]auto_increment

#-- 利用 LAST_INSERT_ID() 取得上一筆 AUTO_INCREMENT
#-- *注意* 此函數僅返回此次 Connection所Insert之AUTO_INCREMENT, 故如未Insert則為 0
INSERT INTO [DB_name] (uid, name, mobile_phone, email, cretat_ts) VALUES (NULL, "Glenn", "0912345678", CONCAT(LAST_INSERT_ID() + 1, "@dkstu.com"), UNIX_TIMESTAMP());

#-- 獲取指定表的 AUTO_INCREMENT
select AUTO_INCREMENT from INFORMATION_SCHEMA.TABLES where TABLE_NAME = [DB_name] ;