首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 異步執行不等待結果:popen + 前端 AJAX 輪詢實現網頁快照生成

     編輯:PHP 相關知識

PHP 異步執行不等待結果:popen + 前端 AJAX 輪詢實現網頁快照生成

短網址系統需根據長網址生成網頁快照,耗時不可預估。採用「後台異步生成 + 前端輪詢狀態」模式: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
超時保護前端設置最大輪詢次數/總時間,防無限等待

現代化替代方案

  • 任務隊列:Redis/RabbitMQ + Worker 消費生成快照,狀態寫入 Redis,前端輪詢或 WebSocket 推送。
  • Swoole/Workerman:常駐進程直接管理異步任務,支持毫秒級定時、信號量控制。
  • Server-Sent Events (SSE):單向長連接推送進度,比輪詢更省資源。
  • Headless Chrome (Puppeteer):替代 PhantomJS,支持現代 Web 標準、更穩定。

「異步執行 + 輪詢/推送」是處理長耗時任務的經典模式,核心在於**請求即返回、狀態可查、結果可獲**,根據業務量級選擇合適技術棧即可。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved