2012-04-25 76 views
0

這是我的代碼:PHP了shell_exec命令不會像的bash /返回錯誤

$url = escapeshellarg("http://www.mysite.com"); 
$command = shell_exec("xvfb-run -a -s '-screen 0 640x480x16' wkhtmltopdf --dpi 300 --page-size A4 $url /srv/www/mysite/public_html/tmp_pdf.pdf"); 
$str = file_get_contents("/srv/www/mysite/public_html/tmp_pdf.pdf"); 
header('Content-Type: application/pdf'); 
header('Content-Length: '.strlen($str)); 
header('Content-Disposition: inline; filename="pdf.pdf"'); 
header('Cache-Control: private, max-age=0, must-revalidate'); 
header('Pragma: public'); 
ini_set('zlib.output_compression','0'); 
die($str); 

以我的bash(使用Debian)命令

了shell_exec(「xvfb的運行-a -s '式屏幕640 * 480 * 0' wkhtmltopdf --dpi 300 --page尺寸A4的html://www.mysite.com /srv/www/mysite/public_html/tmp_pdf.pdf

作品它會生成一個pdf文件所需的位置,但是當我在PHP中執行命令時,沒有任何東西被創建,並且我返回一個空pdf文件(因爲它不存在)。 有人可以幫我弄清楚什麼是錯的?

+0

我希望html://協議存在,否則你可能想要嘗試http:// ..另外,爲了確保URL中沒有字符被shell_exec/bash解釋,請使用escapeshellarg( )的URL http://php.net/manual/en/function.escapeshellarg.php之前傳遞它作爲參數。乾杯 – smassey 2012-04-25 12:24:10

回答

1

問題是Apache服務器沒有對我試圖寫入pdf的文件夾(我的例子中是/ srv/www/mysite/public_html /)的寫入權限。

因此,我只是簡單地將文件夾位置改爲/ tmp(其中每個人都有寫權限),現在它可以工作。更正後的代碼是:

$url = escapeshellarg("http://www.mysite.com"); 
$command = shell_exec("xvfb-run -a -s '-screen 0 640x480x16' wkhtmltopdf --dpi 300 --page-size A4 $url /tmp/tmp_pdf.pdf"); 
$str = file_get_contents("/tmp/tmp_pdf.pdf"); 
header('Content-Type: application/pdf'); 
header('Content-Length: '.strlen($str)); 
header('Content-Disposition: inline; filename="pdf.pdf"'); 
header('Cache-Control: private, max-age=0, must-revalidate'); 
header('Pragma: public'); 
ini_set('zlib.output_compression','0'); 
die($str); 
0

我不知道你的工具在那裏,所以拿一噸鹽。

如果您有url並且該工具下載url本身,則可能會阻止某些網絡權限。如果您可以自行下載url,並將該工具簡單地提供給可能會消除該可能性的內容(或來自臨時文件)。

還檢查您嘗試寫入該文件夾的文件夾的權限。

既然你說Debian,請執行以下命令:

which xvfb-run 

這會給你的可執行文件,我將在這呼籲了shell_exec使用的完整路徑。

至於流出文件,我會使用readfile。

$filePath = "/srv/www/mysite/public_html/tmp_pdf.pdf"; 

header('Content-Type: application/pdf'); 
header('Content-Length: ' . filesize($filePath)); 
header('Content-Disposition: inline; filename="pdf.pdf"'); 
header('Cache-Control: private, max-age=0, must-revalidate'); 
header('Pragma: public'); 
ini_set('zlib.output_compression','0'); 

readfile($filePath); 
exit(); 

優點是整個文件不需要被讀入內存中。