PHP + Flash 時代的遺產:Ming 擴展實現服務端 SWF 生成
本文記錄了早期 PHP 4 時代使用 Ming 擴展 (基於 libswf 庫) 動態生成 Flash (.swf) 動畫的完整安裝與開發流程。雖然 Flash 已退出歷史舞台,但服務端矢量圖形生成的架構思想 (後續演變為 SVG/Canvas/WebGL 生成) 仍具參考價值。
環境依賴
- libswf 庫:
https://reality.sgi.com/grafica/flash/dist.99.linux.tar.Z (C 語言 SWF 生成庫)
- PHP 4 源碼:
https://www.php.net
- 編譯工具鏈:gcc, make, autoconf, libtool
安裝步驟
# 1. 安裝 libswf
cp dist.99.linux.tar.Z /usr/local
cd /usr/local
tar xvzf dist.99.linux.tar.Z
cd dist
make
# 生成 image.swf, test.swf 驗證庫可用
# 2. 設置環境變量 (寫入 /etc/profile)
export SWFBINPATH=/usr/local/dist/bin
export SWFFONTPATH=/usr/local/dist/fonts
# 3. 編譯 PHP 4 支援 Ming
./configure --with-swf=/usr/local/dist [其他選項]
# 若報找不到 swf.h:
cp /usr/local/dist/swf.h /php/src/directory/ext/swf/
make && make install
# 4. 確保 Apache 對 swf 輸出目錄有寫權限
PHP 生成 SWF 範例
<?php
// 簡單文本動畫生成
$movie = new SWFMovie();
$movie->setDimension(320, 240);
$movie->setBackground(0x00, 0x00, 0x00);
$movie->setRate(12); // 12 fps
// 字體處理 (需預先轉換)
$font = new SWFFont("fonts/chinese.fdb"); // pstoff 工具轉換 .pfb -> .fdb
$text = new SWFText();
$text->setFont($font);
$text->setColor(0xFF, 0xFF, 0xFF);
$text->setHeight(24);
$text->moveTo(50, 100);
$text->addString("PHP 動態生成 Flash!");
$movie->add($text);
// 輸出
header("Content-Type: application/x-shockwave-flash");
$movie->output();
?>
工具鏈說明
| 工具 | 用途 | 備註 |
imgtofi | RGB/GIF/JPG → libswf 內部格式 | 位圖資源轉換 |
pstoff | PostScript 字體 → libswf 字體 | 中文字體轉換歷來困難 |
中文支持挑戰
歷史痛點: libswf/Ming 對多字節字符集 (GBK/Big5/UTF-8) 支持極差。pstoff 雖能轉換英文字體,但中文字體 (數萬字符) 轉換出的 .fdb 文件極大且渲染錯位。早期常見方案:預渲染常用字為位圖、或使用 JavaScript 前端渲染替代。
技術演進脈絡
- Ming (PHP 4/5) → SWF 二進制生成
- PHP GD / ImageMagick → 服務端光柵圖片生成
- SVG 生成 (DOMDocument/XMLWriter) → 矢量圖形標準化
- Canvas/HTML5 → 前端渲染,服務端僅輸出數據
- Headless Chrome / Puppeteer → 服務端截圖/PDF 生成
- WebAssembly (skia-wasm, canvaskit-wasm) → 瀏覽器級渲染引擎服務端化
現代替代方案對比
| 方案 | 適用場景 | 優勢 | 劣勢 |
| SVG 模板 + PHP 渲染 | 圖表、證書、報表 | 標準化、可縮放、文本可選 | 複雜動畫受限 |
| Chart.js / ECharts + Headless Chrome | 數據可視化圖表 | 豐富交互、像素完美 | 資源消耗大、延遲高 |
| GD / ImageMagick | 圖片處理、水印、縮略圖 | 成熟穩定、功能全 | 非矢量、文本渲染弱 |
| PHP-WASM (實驗性) | 高性能圖形計算 | 接近原生速度 | 生態不成熟 |
歷史意義
Ming 擴展代表了「服務端富媒體生成」的早期探索。雖然技術棧已過時,但其解決的核心問題——如何在無 GUI 環境下程序化生成視覺內容——在現代雲原生、Serverless、邊緣計算場景下以新形式 (WASM、GPU 加速、流式渲染) 繼續演進。
- 上一篇文章: PHP 動態修改 php.ini 配置:ini_set、ini_get、ini_restore 實戰
- 下一篇文章: rFastTemplate PHP 模板類:核心架構與設計解析(一)
Copyright ©
程式碼之家 All Rights Reserved