基於unoconv的在線office預覽

方案選擇

這幾天在搞在線文檔預覽,網上查了幾種方案,php

  • 第一種:使用google的在線預覽 -> 國內被Q,pass前端

  • 第二種:使用第三方的,好比:永中dcs -> 要錢,passlinux

  • 第三種:先轉換爲pdf,在使用pdf在線預覽插件預覽 -> 對服務器負擔比較大。git

  • 第四種:本身寫解析庫 -> 我這實力,開玩笑呢?github

查了查,也就第三種可行。不過我以前都是作的簡單的web開發,想到文檔轉換對於cpu的消耗比較大,應該沒法適應大規模的併發情形。也在segmentfault上提了一個問題:php長時間的服務的設計與和前端的交互,不過並無獲得很好的解決。 web

後來我問了一個同窗,他以前用的unoconv把office文件轉爲pdf,而後經過站內信的方式提醒用戶文檔轉換完成。中間用了php-resque這個輕量級消息隊列。 redis

和平時的php開發不一樣,除了cgi服務器之外,還要有個Worker,專門用來處理文檔轉換。 segmentfault

大概流程就是:php處理前端上傳來的文件後,把轉化文件的任務添加到redis裏,而後不斷的判斷轉換是否完成,轉換完成後把pdf的路徑傳給前端,前端跳轉過去。
流程windows

實現

見:https://github.com/nladuo/online_office_viewerbash

效果

安裝

sudo apt-get install unoconv redis-server php5-redis
git clone https://github.com/nladuo/online_office_viewer.git
cd online_office_viewer && composer install

啓動redis

redis-server

start-redis

啓動Worker

cd online_office_viewer/cli
bash ./start_worker.sh

start-worker

啓動CGI服務器

cd online_office_viewer
php -S 0.0.0.0:8888

start-cgi

測試轉換

選擇一個文檔

open-browser

等待上傳

uploading

查看Worker的日誌

worker-log

轉換成功後

finished

若是轉換出現了亂碼,是由於linux系統上沒有windows的字體,須要把字體文件拷貝到服務器上。具體能夠百度unoconv中文亂碼

相關文章
相關標籤/搜索