使用 PHP 啟動 Golang Binary 的 DIRECTORY SEPARATOR 問題
Toby
Toby

在開發 AOB 的時候不知道為啥 Windows 開發的 Websocket JWT 登入系統在 Linux 上跑不動,然後 Golang 寫的 WS Server 還不斷噴 Error,一開始還以為是 Golang 的問題,最後原來是啟動 Golang binary 的 PHP 的問題 。

Golang WebSocket Server 在 parse PHP 輸出的 JSON 時出現了 “<” 無法解釋所以 panic 了
在 Windows 上取得由 Web Root 到 Authentication Service Script 位置的代碼,Linux 上會回傳 “” (Empty String),必須移除有關 / 跟 \ 的處理部分才能使用。
//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() 的時候特別容易出錯)