proc_open在Apache2和CLI中提供不同的输出

时间:2015-05-17 06:16:08

标签: php apache wkhtmltopdf

我正在使用wkhtmltopdf将HTML文档转换为我们网站上的PDF文件。我在我的PHP类中使用以下代码:

$htmlData = file_get_contents('http://google.com');

注意:出于测试目的,我做了wkhtmltopdf -q -s letter --no-background --print-media-type --title Test http://google.com /tmp/google.pdf

当我在网络浏览器中浏览页面并点击"下载PDF"时,我得到以下输出:

Messed up PDF File

Download original PDF file

试图弄清楚出了什么问题,我走到了命令行并跑了:

php -a

这完美无缺,所以我想知道PHP是否有问题。我输入了 package com.sqisland.android.versionview; import android.app.Activity; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textViewversionName = (TextView) findViewById(R.id.text); try { PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0); textViewversionName.setText(packageInfo.versionName); } catch (PackageManager.NameNotFoundException e) { } } } 并将上面的代码粘贴到命令行中并运行它,它运行得很好。

以下是PDF的外观:

Good PDF File

Download original PDF file

为什么从Apache(通过我的网络浏览器)运行相同的代码会提供与直接在命令行上运行不同的PDF?这些奇怪的角色来自哪里?我怎么能调试这个?

1 个答案:

答案 0 :(得分:1)

感谢@Havenard,我发现了问题。我从命令行运行export并在PHP中通过proc_open运行并比较输出。

在我的命令行上,我看到了LANG=en_US.UTF8,但是从PHP中它说LANG="C"

解决方案是在LANG

中设置环境中的proc_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
]);