2021年7月6日 星期二

php-fpm.conf 中的 request_terminate_timeout 設定

 request_terminate_timeout:

  • 預設值0,代表off
  • 可設定單位:s(秒、預設)、m(分)、h(小時)、d(日)
  • 效果:執行逾時,會發生錯誤中斷執行
  • 錯誤訊息:
    PHP error log => execution timed out, terminating
    Nginx => 502 Bad Gateway
  • 使用時機:當 max_execution_time 執行超時限制無作用時,又有需求須中止執行時,可考慮設定此參數。

官網說明:
request_terminate_timeout mixed
The timeout for serving a single request after which the worker process will be killed.
This option should be used when the 'max_execution_time' ini option does not stop script execution for some reason.
A value of '0' means 'Off'. Available units: s(econds)(default), m(inutes), h(ours), or d(ays). Default value: 0.


max_execution_time 說明:
max_execution_time 只算 PHP Script 本身執行的時間。
system calls using system(), stream operations, database queries...這些不列入計算。
例如,使用 sleep()延遲執行花的時間、curl_init()抓取網站花的時間,都不屬於PHP本身Script執行時間,都不會導致超過 max_execution_time 限制產生逾時。
若這些時間也要加入執行逾時考量,可以考慮使用 request_terminate_timeout 參數。





參考:



2021年6月19日 星期六

Go 語言取得命令列參數

[cmd_arg.go 內容]
package main

import (
    "flag"
    "fmt"
    "os"
)

func main() {
    //取得命令列參數(變數為指標)
    varAA := flag.String("aa", "ABC", "字串參數")
    varBB := flag.Int("bb", 123, "整數參數")
    varCC := flag.Bool("cc", false, "布林值參數")
    //取得命令列參數(將現有變數,設定為接收為參數)
    var varDD string
    flag.StringVar(&varDD, "dd", "DEF", "字串參數")

    flag.Parse()

    fmt.Println("aa:", *varAA)
    fmt.Println("bb:", *varBB)
    fmt.Println("cc:", *varCC)
    fmt.Println("dd:", varDD)
    fmt.Println("不在規定內,其他形式的參數:", flag.Args())
    fmt.Println("另一個方式,使用os.Args取得參數陣列 os.Args   :", os.Args)
    fmt.Println("另一個方式,使用os.Args取得參數陣列 os.Args[0]:", os.Args[0])
    if len(os.Args) > 1 {
        fmt.Println("另一個方式,使用os.Args取得參數陣列 os.Args[1]:", os.Args[1])
    }
}


[結果]
D:\Go>go build cmd_arg.go

D:\Go>cmd_arg -h
Usage of cmd_arg:
  -aa string
        字串參數 (default "ABC")
  -bb int
        整數參數 (default 123)  
  -cc
        布林值參數
  -dd string
        字串參數 (default "DEF")

D:\Go>cmd_arg
aa: ABC
bb: 123
cc: false
dd: DEF
不在規定內,其他形式的參數: []
另一個方式,使用os.Args取得參數陣列 os.Args   : [cmd_arg]
另一個方式,使用os.Args取得參數陣列 os.Args[0]: cmd_arg

D:\Go>cmd_arg -bb=99 -dd=XYZ ww xx dfs
aa: ABC
bb: 99
cc: false
dd: XYZ
不在規定內,其他形式的參數: [ww xx dfs]
另一個方式,使用os.Args取得參數陣列 os.Args   : [cmd_arg -bb=99 -dd=XYZ ww xx dfs]
另一個方式,使用os.Args取得參數陣列 os.Args[0]: cmd_arg
另一個方式,使用os.Args取得參數陣列 os.Args[1]: -bb=99

D:\Go>cmd_arg -bb=99 -dd=XYZ ww xx dfs
aa: ABC
bb: 99
cc: false
dd: XYZ
不在規定內,其他形式的參數: [ww xx dfs]
另一個方式,使用os.Args取得參數陣列 os.Args   : [cmd_arg -bb=99 -dd=XYZ ww xx dfs]
另一個方式,使用os.Args取得參數陣列 os.Args[0]: cmd_arg
另一個方式,使用os.Args取得參數陣列 os.Args[1]: -bb=99

D:\Go>cmd_arg -bb 99 -dd XYZ ww xx dfs
aa: ABC
bb: 99
cc: false
dd: XYZ
不在規定內,其他形式的參數: [ww xx dfs]
另一個方式,使用os.Args取得參數陣列 os.Args   : [cmd_arg -bb 99 -dd XYZ ww xx dfs]
另一個方式,使用os.Args取得參數陣列 os.Args[0]: cmd_arg
另一個方式,使用os.Args取得參數陣列 os.Args[1]: -bb





參考:


Go 語言跨平台編譯

Go 語言可以在另一個平台(作業系統)上,編譯出另一個平台(作業系統)的執行檔。


[參數]
GOOS:作業系統(android、ios、linux、windows...)
GOARCH:作業系統架構(arm、amd64...)
CGO_ENABLED:是否啟用CGO (不能啟用CGO,故設為0)

例1:windows 上編譯出 Linux 執行檔(僅用SET,沒用-w設定的環境變數,僅在此次開啟的termial有效)
SET CGO_ENABLED=0 
SET GOOS=linux
SET GOARCH=amd64
go build main.go


例2:Linux 上編譯出 windows 執行檔
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go



[查詢支援的平台]
>go tool dist list
aix/ppc64
android/386
android/amd64
android/arm
android/arm64
darwin/amd64
darwin/arm64
dragonfly/amd64
freebsd/386
freebsd/amd64
freebsd/arm
freebsd/arm64
illumos/amd64
ios/amd64
ios/arm64
js/wasm
linux/386
linux/amd64
linux/arm
linux/arm64
linux/mips
linux/mips64
linux/mips64le
linux/mipsle
linux/ppc64
linux/ppc64le
linux/riscv64
linux/s390x
netbsd/386
netbsd/amd64
netbsd/arm
netbsd/arm64
openbsd/386
openbsd/amd64
openbsd/arm
openbsd/arm64
openbsd/mips64
plan9/386
plan9/amd64
plan9/arm
solaris/amd64
windows/386
windows/amd64
windows/arm





參考:


2021年6月11日 星期五

JavaScript 複製文字

<a class="link" href="http://example.com" target="_blank">http://example.com</a>
<input type="button" name="btnCopy" value="複製">

<script type="text/javascript">
    $(function () {
        $("input[name=btnCopy]").click(function () {
            var node = document.querySelector('.link');
            var range = document.createRange();
            range.selectNode(node);
            window.getSelection().removeAllRanges();
            window.getSelection().addRange(range);
            try {
                var successful = document.execCommand('copy');
                if (successful) {
                    alert("複製成功");
                } else {
                    alert("複製失敗");
                }
            } catch (err) {
                alert("複製失敗!");
            }
            window.getSelection().removeAllRanges();
        });
    });
</script>



參考:

Node.js socket.io

let app = require('express')();
let http = require('http').Server(app);
let io = require('socket.io')(http);
let cookie = require('cookie');
let ws_port = 9999;
//設定監聽IPv4的IP,避免取remote IP連IPv6一起取(::ffff:192.168.96.1)
http.listen(ws_port, '0.0.0.0', function () {
    console.log('listening on *:' + ws_port);
});

const test_io = io.of('/test');

test_io.on('connection', function (socket) {
    //client連線數量
    let client_cnt = io.engine.clientsCount;
    
    //取得 query 參數(GET 參數)
    let aa = socket.handshake.query['aa'];
    
    //取得 cookie
    let cookies = '';
    try {
        cookies = cookie.parse(socket.handshake.headers.cookie);
    } catch (err) {
        console.log('#無效cookie:', socket.handshake.headers.cookie);
        console.log(err);
    }
    
    //取得IP
    let client_ip = socket.request.connection.remoteAddress;
    
    //取得header資訊
    if (undefined !== socket.handshake.headers["x-real-ip"]) {
        client_ip = socket.handshake.headers["x-real-ip"];
    }


    socket.on('disconnect', async function () {
        ......
    });
    
    async function main() {
        ......
    }
    main().catch(err => {
        .....
        socket.disconnect(true);
    });
    
    socket.on('testmsg', function () {
        .......
    });

    ......
});


其它:
  1. socket.handshake 物件內的資料
    {
      headers: /* the headers sent as part of the handshake */,
      time: /* the date of creation (as string) */,
      address: /* the ip of the client */,
      xdomain: /* whether the connection is cross-domain */,
      secure: /* whether the connection is secure */,
      issued: /* the date of creation (as unix timestamp) */,
      url: /* the request URL string */,
      query: /* the query params of the first request */,
      auth: /* the authentication payload */
    }

 

參考: