我正在为客户创建一个 Web 前端以下载他们的报告。该公司使用的程序是用 Java 编写的,由 31 个 mysql 表组成,其中需要 4 个报告,每个报告有超过 140 个数据点。我正在用 PHP 制作网站并用 Java 制作报告生成器,但我在查找有关如何让内存 PDF 直接加载到客户端浏览器中的信息时遇到问题。我想使用从 Java 到 PHP 的 TCP 客户端/服务器,但我如何对其进行编码,以便不必将其写入服务器驱动器并作为链接提供。我也不希望将 17,000 行 Java 代码重写为 PHP,因为我是 PHP 新手。有没有办法完成这件事?先感谢您。
问问题
94 次
2 回答
1
根据 java 应用程序运行需要多长时间,您可以考虑使用proc_open
创建一个到 java 程序的管道:
<?php
$desc = array(array('pipe','r'),array('pipe','w'));
$resource= proc_open('bash',$desc,$pipes);
if (!is_resource($resource))
{
throw new Exception('PDF stream creation failed');
}
usleep(5);//for safety
fwrite($pipes[0],'java mkPDF paras'."\n");//double quoted \n is crucial
fclose($pipes[0]);
usleep(100);//while java app is running;
$pdf = stream_get_contents($pipes[1]);
fclose($pipes[1]);
proc_close($resource);
?>
这只是一个基本示例,它将流式 pdf 集中在一个大块中,因此它远非完美。您-IMO-应该研究的是使用while循环以块的形式获取流。php手册页包含几个这样的例子,基本上,repleace
usleep(100);//while java app is running;
$pdf = stream_get_contents($pipes[1]);
和:
usleep(10);//while java app is running;
$pdf = '';
while (($pdfBuff = fgets($pipes[1],1024)) !== null)
{
$pdf.=$pdfBuff;//or echo, or whatever
}
fclose($pipes[1]);
后者未经测试,所以我不确定这是否适用于你的情况......但你明白了
于 2012-05-14T08:33:48.307 回答