摘要:使用該命令,來進(jìn)行文件的生成寫入工作生成寫入基于管道命令,所以在輸入輸出有一方出現(xiàn)問題,就會(huì)導(dǎo)致,該管道無法關(guān)閉,從而出現(xiàn)管道阻塞,從而導(dǎo)致宕機(jī)。見代碼取自文件總的方法片段代碼中的,規(guī)定了包含了要傳送至進(jìn)程的管道的描述信息。
一.問題描述
需要用php把html生成pdf,找了了個(gè)php擴(kuò)展,HTML2PDF,只能生成一些簡單的HTML代碼,復(fù)雜的HTML+css無法生成。網(wǎng)上找到了強(qiáng)大的wkhtmltopdf。
二.wkhtmltopdf介紹
工具全名叫 "wkhtmltopdf" ; 是一個(gè)使用 Qt WebKit 引擎做渲染的,能夠把html 文檔轉(zhuǎn)換成 pdf 文檔 或 圖片(image) 的命令行工具。(強(qiáng)調(diào)一下:是 “命令行工具” )支持多個(gè)平臺(tái),可在win,linux,os x 等系統(tǒng)下運(yùn)行。
三.wkhtmltopdf安裝(linux環(huán)境)
安裝步驟很簡單,我在這里就不贅述了,具體可以參照(https://blog.csdn.net/assasin...://blog.csdn.net/qq_26562641/article/details/72875344),里面寫的都很詳細(xì)
問題1:測(cè)試后發(fā)現(xiàn),生成的pdf文件對(duì)中文并不支持(外國人寫的軟件,這個(gè)沒辦法)? 答案:自行下載中文字體,安裝在linux的字體庫,具體方法可以參照(https://yq.aliyun.com/ziliao/269854)進(jìn)行操作,其中字體可以在此網(wǎng)站下載(http://www.font5.com.cn/font_download.php?id=150&part=1237886897) ***下面是重點(diǎn)戲?。。。。。?!***
三.php操作wkhtmltopdf
方法:1.一個(gè)是exec執(zhí)行 2.擴(kuò)展包操作(建議采用,本文介紹的就是這個(gè)方法,由于我們是采用php語言開發(fā),所以我在composer中選用了 mikehaertl/phpwkhtmltopdf包)
四.mikehaertl/phpwkhtmltopdf包的具體使用
1.包的安裝(composer很方便)
2.具體使用可以參照該包的使用說明
3.使用中出現(xiàn)的問題:
q.在本地環(huán)境測(cè)試可以正常的下載,但是在linux環(huán)境下卻不行? a.php.ini的禁用函數(shù) proc_open()要去除,如果不行(將禁用函數(shù)去除) q.php.ini中的禁用函數(shù)去除后,還是不行,槽糕的是,把服務(wù)器搞的無法訪問(解決辦法:清除瀏覽器緩存)? a.說的這個(gè)問題,我們來科普一下proc_open()---php內(nèi)置函數(shù) proc_open():執(zhí)行一個(gè)命令,并且打開用來輸入/輸出的文件指針。 wkhtmltopdf使用該命令,來進(jìn)行pdf文件的生成&寫入工作(生成&寫入基于管道命令),所以在輸入&輸出有一方出現(xiàn)問題,就會(huì)導(dǎo)致,該管道無法關(guān)閉,從而出現(xiàn)管道阻塞,從而導(dǎo)致宕機(jī)。見代碼(取自:vendor/mikehaertl/php-shellcommand/Command.php文件總的execute方法片段): $process = proc_open($command, $descriptors, $pipes, $this->procCwd, $this->procEnv, $this->procOptions); if (is_resource($process)) { if ($this->_stdIn!==null) { if (is_resource($this->_stdIn) && in_array(get_resource_type($this->_stdIn), array("file", "stream"), true)) { stream_copy_to_stream($this->_stdIn, $pipes[0]); } else { fwrite($pipes[0], $this->_stdIn); } fclose($pipes[0]); } $this->_stdOut = stream_get_contents($pipes[1]); $this->_stdErr = stream_get_contents($pipes[2]); fclose($pipes[1]); fclose($pipes[2]); $this->_exitCode = proc_close($process); if ($this->_exitCode!==0) { $this->_error = $this->_stdErr ? $this->_stdErr : "Failed without error message: $command"; return false; } } else { $this->_error = "Could not run command $command"; return false; } 代碼中的$descriptors,規(guī)定了包含了要傳送至進(jìn)程的管道的描述信息。 第一個(gè)元素為描述符類型, 第二個(gè)元素是針對(duì)該描述符的選項(xiàng)。 有效的類型有:pipe (第二個(gè)元素可以是: r 向進(jìn)程傳送該管道的讀取端,w 向進(jìn)程傳送該管道的寫入端), 以及 file(第二個(gè)元素為文件名)。
表達(dá)一個(gè)真實(shí)文件描述符的流資源類型 (例如:已打開的文件,一個(gè) socket 端口,STDIN)。
而我在實(shí)際調(diào)試中卻發(fā)現(xiàn),我在本地調(diào)試時(shí),該參數(shù)寫入端為w,而linux中寫入端為r,這個(gè)是宕機(jī)的罪魁禍?zhǔn)住_M(jìn)行代碼分析: $descriptors = array( 1 => array("pipe","w"), 2 => array("pipe", $this->getIsWindows() ? "a" : "w"), ); public function getIsWindows() { return strncasecmp(PHP_OS, "WIN", 3)===0; } 將 2 => array("pipe", $this->getIsWindows() ? "a" : "w"),=》修改為 2 => array("pipe", "a"),問題解決。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29939.html
摘要:編譯安裝添加用戶下載解壓安裝包安裝依賴編譯安裝建立軟鏈對(duì)運(yùn)行用戶進(jìn)行設(shè)置建立軟鏈配置環(huán)境變量,加入全局命令啟動(dòng)服務(wù)查看是否啟動(dòng)殺死或者 3.php編譯安裝 添加用戶 useradd -r -s /sbin/nologin php-fpm 下載解壓安裝包 cd /data/pkg wget http://php.net/get/php-7.2.2.tar.gz/from/this/mir...
摘要:編譯安裝編譯安裝配置拷貝前端文件到目錄下并配置頁面端配置瀏覽器打開 1.編譯安裝NGINX ssh [email protected] cd /home/zabbix/softs/nginx-1.10.3 ./configure --prefix=/home/zabbix/nginx-1.10.3 --pid-path=/tmp/nginx/nginx.pid --with-...
摘要:編譯安裝編譯安裝配置拷貝前端文件到目錄下并配置頁面端配置瀏覽器打開 1.編譯安裝NGINX ssh [email protected] cd /home/zabbix/softs/nginx-1.10.3 ./configure --prefix=/home/zabbix/nginx-1.10.3 --pid-path=/tmp/nginx/nginx.pid --with-...
摘要:安裝擴(kuò)展下載擴(kuò)展包以及解壓進(jìn)入解壓后目錄,編譯安裝出現(xiàn)問題安裝開始編譯褲子韓查找配置環(huán)境編譯安裝配置,添加擴(kuò)展重啟安裝擴(kuò)展克隆安裝且編譯配置,添加擴(kuò)展重啟更多精彩內(nèi)容,請(qǐng)關(guān)注作者博客, 1.安裝redis擴(kuò)展 下載redis擴(kuò)展包以及解壓 wget https://github.com/edtechd/phpredis/archive/php7.zip unzip php7.zip 進(jìn)...
閱讀 839·2023-04-25 20:18
閱讀 2136·2021-11-22 13:54
閱讀 2583·2021-09-26 09:55
閱讀 3936·2021-09-22 15:28
閱讀 3008·2021-09-03 10:34
閱讀 1742·2021-07-28 00:15
閱讀 1665·2019-08-30 14:25
閱讀 1306·2019-08-29 17:16