2015-05-17 56 views
4

我使用wkhtmltopdf將HTML文檔轉換爲我們網站上的PDF文件。我使用下面的代碼在我的PHP類:proc_open在Apache2與CLI中給出不同的輸出

<?php 

$pdfConv = proc_open('wkhtmltopdf -q -s letter --no-background --print-media-type --title Test - -', [ 
    0 => array('pipe', 'r'), 
    1 => array('pipe', 'w'), 
    2 => array('pipe', 'w') 
], $pipes, '/tmp', NULL, [ 
    'bypass_shell' => true 
]); 

if(is_resource($pdfConv)){ 
    // Send STDIN 
    fwrite($pipes[0], $htmlData); 
    fclose($pipes[0]); 

    // Receive STDOUT 
    $pdfFile = stream_get_contents($pipes[1]); 
    fclose($pipes[1]); 

    // Set headers and send file to browser to be downloaded 

    // Close process 
    proc_close($pdfConv); 
} 

注:出於測試目的,我做了$htmlData = file_get_contents('http://google.com');

當我瀏覽的網頁在我的網頁瀏覽器,點擊「下載PDF」,我得到了以下的輸出:

Messed up PDF File

Download original PDF file

試圖弄清楚什麼是錯的,我走上了命令行並跑了:

wkhtmltopdf -q -s letter --no-background --print-media-type --title Test http://google.com /tmp/google.pdf 

這工作完美,所以我想知道是否有什麼問題wi PHP。我輸入php -a並將上面的代碼粘貼到命令行中並運行它,並且它運行得非常完美。

這裏是PDF應該是什麼樣子:

Good PDF File

Download original PDF file

爲什麼會(通過我的網絡瀏覽器)運行Apache的相同代碼給出了不同的PDF比上運行命令行直接?這些奇怪的角色是從哪裏來的?我怎樣才能調試呢?

+2

貌似相關的環境變量的東西。查看命令'export'的輸出是否在shell中以及在Apache中由PHP調用時是否相同。 'PATH'通常是vilan,你可能希望在運行程序之前將其值設置爲與shell中的值相匹配。 – Havenard

+1

@Havenard:我看到一些差異!除了'TERM'和'PATH'之外,唯一的*大*差異是shell說'LANG = en_US.UTF8',而PHP說'LANG =「C」'。 –

+0

@Havenard:DUDE!我一直盯着這幾個小時!就是這樣!我不知道LANG =「C」是什麼,但那是個問題。 –

回答

1

感謝@Havenard,我找到了問題所在。我在我的命令行中運行了export,並通過PHP中的proc_open運行並比較了輸出。

在我的命令行上,我看到LANG=en_US.UTF8,但是來自PHP它說的是LANG="C"

的解決方案是建立在環境中LANGproc_open

$pdfConv = proc_open('wkhtmltopdf -q -s letter --no-background --print-media-type --title Test - -', [ 
    0 => array('pipe', 'r'), 
    1 => array('pipe', 'w'), 
    2 => array('pipe', 'w') 
], $pipes, '/tmp', [ 
    'LANG' => 'en_US.UTF8' 
], [ 
    'bypass_shell' => true 
]); 
+0

上帝,是的,謝謝!我一直在爲此奮鬥了好幾個小時,非常感謝你回到你的線索並回復!我幾乎錯過了你和@Havenard之間的討論。 –