短網址系統需根據長網址生成網頁快照,耗時不可預估。採用「後台異步生成 + 前端輪詢狀態」模式:PHP 立即返回短網址,啟動 PhantomJS 後台進程生成快照;前端定時 AJAX 查詢快照是否就緒,就緒則停止輪詢並展示。
$cmd = '/home/emp/phpinstall/phantomjs-1.5.0/bin/phantomjs '
. '/home/emp/phpinstall/phantomjs/snap.js "'
. $url . '" '
. '/home/emp/public_html_demo/cms/' . $thumb . ' &';
try {
@pclose(popen($cmd, "r")); // 非阻塞啟動,立即返回
} catch (Exception $e) {}
popen(..., "r") 打開進程管道,pclose() 關閉管道但**不等待**進程結束(因命令末尾加 & 後台運行)。@ 抑制警告,try-catch 兜底,確保主流程不受影響。// 定時器:每 200ms 請求一次檢測接口
_wt = window.setInterval(
"sys.ajax('?m=shorturl&c=index&a=check_snap', '', callback.checkSnap);",
200
);
callback.checkSnap = function(response) {
if (response.snap_ready) {
clearTimeout(_wt); // 停止輪詢
// 顯示快照圖片、更新 UI
}
};
| 環節 | 技術點 |
|---|---|
| 後台進程 | PhantomJS(已停維,現建議 Puppeteer/Playwright) |
| 異步啟動 | popen + & 後台符 + pclose 即刻返回 |
| 狀態持久化 | 快照文件落地 + 數據庫狀態字段(可選) |
| 前端輪詢 | setInterval + AJAX,收到就緒信號 clearTimeout |
| 超時保護 | 前端設置最大輪詢次數/總時間,防無限等待 |
「異步執行 + 輪詢/推送」是處理長耗時任務的經典模式,核心在於**請求即返回、狀態可查、結果可獲**,根據業務量級選擇合適技術棧即可。