在開發 AOB 的時候不知道為啥 Windows 開發的 Websocket JWT 登入系統在 Linux 上跑不動,然後 Golang 寫的 WS Server 還不斷噴 Error,一開始還以為是 Golang 的問題,最後原來是啟動 Golang binary 的 PHP 的問題 。
//Parse the launch paramters
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
//Windows. Parse the launching path for validation services from wamp service webroot
$fullPath = str_replace($_SERVER['DOCUMENT_ROOT'],"",realpath(str_replace("\\","/",__DIR__) . "../../jwt/validate.php"));
$fullPath = str_replace("\\","/",$fullPath);
$launchpath = str_replace($_SERVER['DOCUMENT_ROOT'] . "/","",$fullPath);
}else{
//Life is always simplier on Linux
$launchpath = str_replace($_SERVER['DOCUMENT_ROOT'] . "/","",realpath("../jwt/validate.php"));
}
這問題主要出在 PHP 可以把 / 跟 \ 同時當作 “/” ,所以在程式裡作為 Directory Separator 用 “/” 就好,不需要特別處理,但是在 Golang 裡 “/” 跟 “\” 是不同的符號,必須要先做好預處理再 feed in 到裡面。
(你問我為啥不用 DIRECTORY_SEPARATOR ?因為測試過這東西也不能用啊?特別是要經過 realpath() 的時候特別容易出錯)