如何在PHP

时间:2017-09-21 01:22:26

标签: php stream pipe proc-open

我尝试使用Inkscape从SVG创建PNG。我正在使用Linux。命令,

cat in.svg | inkscape -z /dev/stdin -w 800 -h 475 -e /dev/stderr 2> out.png

工作正常,但我不想在服务器上写输出文件。

我的代码是,

<?php
$svg_data = file_get_contents('in.svg');

$descriptorspec = array(
  0 => array("pipe", "r"),  // stdin
  1 => array("pipe", "w"),  // stdout
  2 => array("pipe", "w")   // stderr 
);

$pipes = array();

$process = proc_open("inkscape -z /dev/stdin -w 800 -h 475 -e /dev/stderr", $descriptorspec, $pipes);
if (is_resource($process)) {
    fwrite($pipes[0], $svg_data);
    fclose($pipes[0]);
    $fil_data = stream_get_contents($pipes[2]);
    fclose($pipes[1]);
    fclose($pipes[2]);  
    proc_close($process);
    file_put_contents("out.png", $fil_data);
}

?> 

如果我改变了行,

$process = proc_open("inkscape -z /dev/stdin -w 800 -h 475 -e /dev/stderr", $descriptorspec, $pipes);

$process = proc_open("inkscape -z /dev/stdin -w 800 -h 475 -e out.png", $descriptorspec, $pipes);

正确的&#34; out.png&#34;打印出来。

当前代码写入文件,但文件已损坏。它似乎从头到尾都被破坏了,但它大小合适。

我想要$ fil_data中的数据(out.png),但我不想从磁盘驱动器中读取它。

为什么out.png已损坏,如何在不使用磁盘的情况下进行正确的转换。

1 个答案:

答案 0 :(得分:0)

Inkscape在写入文件之前向stderr发送了一些消息。同样的事情发生在stdout上。通过跳过消息解决了这个问题。这一行,

$fil_data = stream_get_contents($pipes[2]);

更改为,

$fil_data = stream_get_contents($pipes[2], -1, 150);

如果有更好的方法,我希望看到它。