摘要:使用該命令,來進行文件的生成寫入工作生成寫入基于管道命令,所以在輸入輸出有一方出現問題,就會導致,該管道無法關閉,從而出現管道阻塞,從而導致宕機。見代碼取自文件總的方法片段代碼中的,規定了包含了要傳送至進程的管道的描述信息。
一.問題描述
需要用php把html生成pdf,找了了個php擴展,HTML2PDF,只能生成一些簡單的HTML代碼,復雜的HTML+css無法生成。網上找到了強大的wkhtmltopdf。
二.wkhtmltopdf介紹
工具全名叫 "wkhtmltopdf" ; 是一個使用 Qt WebKit 引擎做渲染的,能夠把html 文檔轉換成 pdf 文檔 或 圖片(image) 的命令行工具。(強調一下:是 “命令行工具” )支持多個平臺,可在win,linux,os x 等系統下運行。
三.wkhtmltopdf安裝(linux環境)
安裝步驟很簡單,我在這里就不贅述了,具體可以參照(https://blog.csdn.net/assasin...://blog.csdn.net/qq_26562641/article/details/72875344),里面寫的都很詳細
問題1:測試后發現,生成的pdf文件對中文并不支持(外國人寫的軟件,這個沒辦法)? 答案:自行下載中文字體,安裝在linux的字體庫,具體方法可以參照(https://yq.aliyun.com/ziliao/269854)進行操作,其中字體可以在此網站下載(http://www.font5.com.cn/font_download.php?id=150&part=1237886897) ***下面是重點戲!!!!!!!***
三.php操作wkhtmltopdf
方法:1.一個是exec執行 2.擴展包操作(建議采用,本文介紹的就是這個方法,由于我們是采用php語言開發,所以我在composer中選用了 mikehaertl/phpwkhtmltopdf包)
四.mikehaertl/phpwkhtmltopdf包的具體使用
1.包的安裝(composer很方便)
2.具體使用可以參照該包的使用說明
3.使用中出現的問題:
q.在本地環境測試可以正常的下載,但是在linux環境下卻不行? a.php.ini的禁用函數 proc_open()要去除,如果不行(將禁用函數去除) q.php.ini中的禁用函數去除后,還是不行,槽糕的是,把服務器搞的無法訪問(解決辦法:清除瀏覽器緩存)? a.說的這個問題,我們來科普一下proc_open()---php內置函數 proc_open():執行一個命令,并且打開用來輸入/輸出的文件指針。 wkhtmltopdf使用該命令,來進行pdf文件的生成&寫入工作(生成&寫入基于管道命令),所以在輸入&輸出有一方出現問題,就會導致,該管道無法關閉,從而出現管道阻塞,從而導致宕機。見代碼(取自: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,規定了包含了要傳送至進程的管道的描述信息。 第一個元素為描述符類型, 第二個元素是針對該描述符的選項。 有效的類型有:pipe (第二個元素可以是: r 向進程傳送該管道的讀取端,w 向進程傳送該管道的寫入端), 以及 file(第二個元素為文件名)。
表達一個真實文件描述符的流資源類型 (例如:已打開的文件,一個 socket 端口,STDIN)。
而我在實際調試中卻發現,我在本地調試時,該參數寫入端為w,而linux中寫入端為r,這個是宕機的罪魁禍首。進行代碼分析: $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"),問題解決。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29939.html
摘要:編譯安裝添加用戶下載解壓安裝包安裝依賴編譯安裝建立軟鏈對運行用戶進行設置建立軟鏈配置環境變量,加入全局命令啟動服務查看是否啟動殺死或者 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 zabbix@192.168.8.143 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 zabbix@192.168.8.143 cd /home/zabbix/softs/nginx-1.10.3 ./configure --prefix=/home/zabbix/nginx-1.10.3 --pid-path=/tmp/nginx/nginx.pid --with-...
摘要:安裝擴展下載擴展包以及解壓進入解壓后目錄,編譯安裝出現問題安裝開始編譯褲子韓查找配置環境編譯安裝配置,添加擴展重啟安裝擴展克隆安裝且編譯配置,添加擴展重啟更多精彩內容,請關注作者博客, 1.安裝redis擴展 下載redis擴展包以及解壓 wget https://github.com/edtechd/phpredis/archive/php7.zip unzip php7.zip 進...
閱讀 811·2023-04-25 20:18
閱讀 2092·2021-11-22 13:54
閱讀 2527·2021-09-26 09:55
閱讀 3857·2021-09-22 15:28
閱讀 2969·2021-09-03 10:34
閱讀 1710·2021-07-28 00:15
閱讀 1629·2019-08-30 14:25
閱讀 1281·2019-08-29 17:16