[PHP] 強制清除所有session

透過調整以下三種參數去清除不太即時,且還要改回設定

  • session.gc_probability
  • session.gc_divisor
  • session.gc_maxlifetime

 

Session預設是以檔案的形式存放在檔案系統中

透過刪除Session File也可以達到效果,且非常即時

缺點是無差別地圖砲,Server上所有網站的session都會被清掉

至於檔案是存放在/var/lib/php5

root@localhost [/var/lib/php5] [15:09] ls
total 148
drwxr-xr-x 6 root     root        55 Mar 18  2016 modules
-rw------- 1 www-data www-data     0 Jan 11 15:03 sess_0ds3e4m3r7lgjooltl9a3l55c5
-rw------- 1 www-data www-data     0 Jan 11 15:05 sess_0pdn79vvlmk49pocsog0lm1s04
-rw------- 1 www-data www-data    21 Jan 11 14:52 sess_181m0vk41kg4jpbptqqkomvu45
-rw------- 1 www-data www-data     0 Jan 11 15:03 sess_22hv9nrcie1dgklni03ici5rg1
-rw------- 1 www-data www-data     0 Jan 11 15:07 sess_2jf0i4ld55pvov4d24s103rjh3
-rw------- 1 www-data www-data    21 Jan 11 14:50 sess_2u8fsfnkp9a1fanfa7qnemlpf5
-rw------- 1 www-data www-data     0 Jan 11 15:04 sess_43511pnkfu8vmmjk5uk5fa53f4
-rw------- 1 www-data www-data    21 Jan 11 14:45 sess_45a6khgkcq4irmvsg43ok8k766
-rw------- 1 www-data www-data   593 Jan 11 15:05 sess_4tpqknfnmt5k8mqq6g0ompmda5
-rw------- 1 www-data www-data     0 Jan 11 15:05 sess_6kdp8fepotp0v1krkv41dcqeu0
-rw------- 1 www-data www-data   512 Jan 11 14:52 sess_78h12laa6erhi4gsfa3l4s0h06
-rw------- 1 www-data www-data   488 Jan 11 15:07 sess_7u31csrpr889ubarhitom72ij6
-rw------- 1 www-data www-data    21 Jan 11 14:50 sess_8f2s5i1fb6v59t4rb0eenet682
-rw------- 1 www-data www-data     0 Jan 11 15:04 sess_8m5mov1o5mkjt7vuf0td0ilv53
(以下簡略...)

 

其中有個modules目錄是存放一些PHP的元件

記得不要手誤去刪到

刪掉所有Session Files

root@locahost [/var/lib/php5] [15:09] rm -f sess_*
root@locahost [/var/lib/php5] [15:09] ls
total 1
drwxr-xr-x 6 root     root        55 Mar 18  2016 modules

 

重整網站後就會發現session全部都刷新了

Cloc – 快速計算程式碼行數

最近剛好一個閒來無事

想看看專案規模成長到多大

雖然以程式碼行數來去看是不太準

但起碼依然是指標的一種

 

Cloc不但計算快速

且除了程式碼行數,還會列出檔案總數、空行數和註解行數

 

GitHub: https://github.com/AlDanial/cloc


安裝

Cloc可以透過多種Package manager安裝:

npm install -g cloc                    # https://www.npmjs.com/package/cloc
sudo apt-get install cloc              # Debian, Ubuntu
sudo yum install cloc                  # Red Hat, Fedora
sudo dnf install cloc                  # Fedora 22 or later
sudo pacman -S cloc                    # Arch
sudo pkg install cloc                  # FreeBSD
sudo port install cloc                 # Mac OS X with MacPorts
brew install cloc                      # Mac OS X with Homebrew
choco install cloc                     # Windows with Chocolatey

也可以直接下載Released package進行安裝 (下載頁面 )

 


操作

指令:cloc [options] <file(s)/dir(s)> | <set 1> <set 2> | <report files>

Calos@Workstation:~/project/my-project$ cloc .
     538 text files.
     520 unique files.
     154 files ignored.

https://github.com/AlDanial/cloc v 1.66  T=2.61 s (182.4 files/s, 38389.0 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
PHP                            299           3141           1457          35339
JavaScript                      97           5996           5308          30628
CSS                             44            386            207          11262
SQL                              2             25             54           2732
HTML                            14            423             98           2699
JSON                            10              1              0            282
Bourne Shell                     8             21              2             77
make                             1             12             13             28
YAML                             1              0              0             10
-------------------------------------------------------------------------------
SUM:                           476          10005           7139          83057
-------------------------------------------------------------------------------

個人常用的參數有三種:

  • –exclude-dir: 排除特定目錄,以逗號隔開
  • –exclude-lang: 排除特定語言,以逗號隔開
  • –exclude-ext: 排除特定副檔名,以逗號隔開

完整參數說明請參考官方文件 

 

以下範例為:

  1. 排除plugins、makefiles、storage三個特定目錄下所有檔案
  2. 排除make語言的所有檔案
  3. 排除副檔名為html的所有檔案
Calos@Workstation:~/project/my-project$ cloc . --exclude-dir=plugins,makefiles,storage --exclude-lang=make --exclude-ext=html
     372 text files.
     364 unique files.
      63 files ignored.

https://github.com/AlDanial/cloc v 1.66  T=0.44 s (808.6 files/s, 102809.6 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
PHP                            286           2986           1390          34250
JavaScript                      39            604            286           4056
CSS                             28            230             23           1055
-------------------------------------------------------------------------------
SUM:                           353           3820           1699          39361
-------------------------------------------------------------------------------

 

[PHP] 利用flush()、ob_flush()強制輸出網頁內容

正常情況下,執行中的 PHP 過程中輸出的內容會先進到緩衝區 (output_buffer)

PHP Script 全部執行完畢後,產生的資料才會從 output_buffer 一次輸出到瀏覽器上

但是若程式要跑一段時間,想要看到執行過程中輸出的內容,可以透過 ob_flush()flush() 達成

雖然看起來名稱很像,但是做的事情不太一樣:

ob_flush():把 PHP output_buffer (假設有打開)的東西輸出,但並不是立刻輸出到終端
flush():把非 PHP output_buffer,伺服器上準備輸出的資料輸出到瀏覽器上”顯示出來”

 

寫一小段測試 code

<?php
header('Content-type: text/html; charset=utf-8');
for ($i = 0; $i < 100; $i++) {
    echo $i . '<br>';
    flush();
    ob_flush();
    usleep(20000); // 20ms
}

 

HTTP Server 設定也會影響到 function

Apache 預設值不影響,不過 Nginx 會

所以如果 HTTP Server 使用 Nginx

需要針對 PHP 類型額外做設定:

編輯 /etc/nginx/site-available/default

# 找到針對PHP的directive
location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
        return 404;
    }

    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_read_timeout 300;

    # 加入這三行
    fastcgi_keep_conn on; # fastcgi保持連線
    proxy_buffering off; # 如果沒使用proxy的話這行可以不加
    gzip off; # 關閉gzip壓縮
}

 

值得注意的是 fastcgi_keep_conn 在 Nginx 下預設是 off 的

雖然啟用後理論上效能能得到提升 (Connection TIME_WAIT 數量會明顯下降)

不過在某些特殊情況下可能會發生異常

所以預設情況下是關閉的

 

Reference: Re: Why does fastcgi_keep_conn default to off?

 

[Bootstrap] Modal 自動設定最大高度

Bootstrap 有個 modal 懸浮窗

如果裡面內容過多,bootstrap 並不會把內容限縮在 modal-body 裡

為了美觀,所以需要 CSS 的 max-height 屬性套用至 modal-body 上

如此一來內容過長造成溢出時,modal-body 會顯示捲動欄

同時 modal-header 與 modal-footer 的內容亦會固定在視窗上

網站上可能會用到多個 modal ,一個一個設定的話要自己去抓數字,很麻煩

所幸 bootstrap modal 有 shown.bs.modal 這個 event 可以使用

所以寫了一段全部 modal 都適用的 code

$('.modal').on('shown.bs.modal', function(){
    var margin_vertical = parseInt( $(this).find('.modal-dialog').css('margin-top') ) + parseInt( $(this).find('.modal-dialog').css('margin-bottom') ) || 0;
    var height_header   = parseInt( $(this).find('.modal-header').css('height') ) || 0;
    var height_footer   = parseInt( $(this).find('.modal-footer').css('height') ) || 0;
    var height_body     = ( window.innerHeight - height_header - height_footer - margin_vertical - 10 ) + 'px';
    $(this).find('.modal-body').css('max-height', height_body).css('overflow', 'auto');
});

 

關於多扣 10px 的部分,因為有其他誤差值,造成 body 的捲動欄會出現

個人猜想可能是因為其他部分 box-model 的關係導致 (border-width 等 blahblah)

不過我也抓不到就是了QQ,所以就偷懶多扣 10px 混過去 XD

至於為什麼會用 shown.bs.modal 這個event,而不是 show.bs.modal

是因為 modal 顯示前的的 css height 是 0

show.bs.modal 觸發的時機是顯示前,而 shown.bs.modal 則是顯示後

因此要等modal顯示時,偵測到的css height才是正確的

而這裡又有一個小小的缺點

就是當你使用 fade-in & fade-out 效果時

在動畫結束前,body 的捲動欄會出現

直到動畫結束後觸發了 shown.bs.modal event

才會顯示成正常的樣子

小弟才疏學淺,這個問題還不知道要怎麼解決

或許加快 css animation speed 做為障眼法混過去勉強可行

不過因為這種情況只會在該 modal 第一次顯示時才會出現

之後只要 browser inner height 沒有變,都不會出現

所以就將就一下囉~

順帶一提,如果你想要能限制最大高度,又能固定佔滿版,只要將第六行的「max-height」改成「height」即可。如下所示

$(this).find('.modal-body').css('height', height_body).css('overflow', 'auto');

 

Update:
2017-05-10: 利用 || 0 預防取回高度值為 nan 的情況下出錯。

[CSS] 元素翻轉

/* 水平翻轉 */
.flip-horizontal {
    -moz-transform: scale(-1, 1);
    -webkit-transform: scale(-1, 1);
    -o-transform: scale(-1, 1);
    -ms-transform: scale(-1, 1);
    transform: scale(-1, 1);
}

/* 垂直翻轉 */
.flip-vertical {
    -moz-transform: scale(1, -1);
    -webkit-transform: scale(1, -1);
    -o-transform: scale(1, -1);
    -ms-transform: scale(1, -1);
    transform: scale(1, -1);
}