天天看點

阿裡雲函數計算php7.2無法加載字型檔案等資源檔案的解決辦法

最近團隊準備更多将服務放在serverless上,然後上周跟小夥伴一起體驗了阿裡雲的函數計算(第一個項目基于TP5),初步感覺還不錯,輕輕松松并發幾百上千,免運維無煩勞杜絕半夜電話催人重新開機伺服器(開玩笑的 - -)。

不過有一點小小的不舒服,登入背景後發現字型檔案無法加載,woff ttf等全部報502,小夥伴電話跟阿裡雲溝通被告知不支援(我是有點懵逼的,0202年了字型為何不能支援),無果暫時不管這個。

又過了幾天想起這事,專門研究了下,嘗試了2個小時,總結出了2個結論

  • 加載.woff .ttf字尾的檔案會異常
  • 加載字型資料會異常(沒錯,就算把字型字尾改為其他的也會異常)

配置過的應該都知道函數計算有一個index.php入口檔案,裡面包含php_run和static_run 2個處理方法,而上面的第一個問題,會導緻根本無法加載handler,第二個問題會導緻static_run讀取檔案fopen打開的時候出錯。

雖然感覺這樣的設定很奇怪,但是找到了辦法就好辦了,針對第一個問題,改名即可 于是我改成了

font.woff >> font.woff.svg           

這樣就能進入static_run裡面了。

然後針對第二個問題,将字型檔案進行編碼或加密,我這裡直接用的hex轉碼,用其他的編碼應該也是可以的

$fontData = file_get_contents("font.woff.svg");
file_put_contents("font.woff.hexencode.svg", bin2hex($fontData));           

然後index的static_run需要針對字型檔案做一些特殊處理

$contentType = $GLOBALS['fcPhpCgiProxy']->getMimeType($file_dir);
    if (stripos($uri, '.hexencode.') !== false) {
        // 如果包含hexencode就轉碼一下
        $contents = hex2bin($contents);
        if (stripos($uri, '.woff') !== false) {
            $contentType = 'application/font-woff';
        } else {
            $contentType = 'application/octet-stream';
        }
    }           

最後一步,還需要修改其他檔案中的引用位址為新位址 font.woff.hexencode.svg

再次部署,終于看到了綠色的可愛的200狀态,字型也正常顯示。

不過這始終隻是一個臨時解決方案,而且這樣改了之後,本地開發調試也需要特殊處理下。是以還是希望阿裡雲盡快支援下字型加載,字型檔案跟js css jpg等資源檔案并沒有本質的不同,不清楚為何要留這麼大個坑在這裡,大家如果有更好的方法,歡迎指教下。

原文連結

https://www.jianshu.com/p/d1ca14038bda

繼續閱讀