PHP ImagickDraw threaded



我正试图在PHP上使用ImagickDraw,使用大量(约100000(circle((rectangle((等调用来绘制图像。这些信道分为4个cmyk信道,因此每个信道可获得约3万个呼叫。

实际的circle()rectangle()调用本身非常快,整个程序部分在不到一秒钟的时间内运行;然后我在4个单独的ImagickDraw对象中的每一个上使用drawImage,这需要每层运行>15秒。。。知道这是一个非常复杂的图像,但有什么方法可以加快速度吗?

我考虑过使用pthread,为4个ImagickDraw对象中的每一个都有一个单独的pthread。这只会导致程序挂起:

class Render extends Thread
{
public $im;
private $svg;
public function __construct($width, $height, $bg, $svg)
{
$this->im = new Imagick();
$this->svg = $svg;
$this->im->newImage($width, $height, $bg);
}
public function run()
{
$id = new ImagickDraw();
$id->setVectorGraphics($this->svg);
$this->im->drawImage($id);
}
}
$threads = [];
$imarray = [];
foreach($drawar as $c=>$s){
$threads[$c] = new Render($finalsize['width'], $finalsize['height'], 'white', $s);
$threads[$c]->start();
}
foreach($threads as $c=>$p){
$p->join();
$imarray[$c] = $p->im;
echo "Got {$c} datan";
}

谢谢!

我很惊讶I(工作速度如此之快。

我建议尝试的是忘记给Imagick打这么多单独的电话。

相反,使用适当的SVG圆形和矩形标记手动生成SVG XML文档。然后使用Imagick将该图像合成/转换为所需的输出图像格式。

我考虑过使用pthread,有一个单独的pthread对于4个ImagickDraw对象中的每一个要挂起的程序:

是的,那行不通。底层的C库与pthreads不兼容。

最新更新