在PHP开发服务器Win 10上更改imagick的权限或更改tmp目录

问题描述

我正在运行symfony开发服务器的Windows 10 pc上开发PHP7.1应用程序,但是每次我运行脚本将svg转换为png时,都会收到此错误

WriteBlob失败`/tmp/5f49ac095abe6.png'@ error / png.c / MagickPNGErrorHandler / 1630

我刚刚购买了这台计算机,该脚本可在旧的Windows笔记本电脑上使用。我做了研究,怀疑这是一个权限问题,但是我用尽了所有更改PHP和imagick tmp存储位置的方法

如果确实是权限问题,那么我如何更新PHP / imagick保存tmp文件的位置。

这是我的全部参考方法

private function createImageFromSVG(Configlogo $logoConfig)
{
    $svg = $logoConfig->getDefaultimage()->getContent();
    $idColorArray = [
        'first' => $logoConfig->getFirstColor(),'second' => $logoConfig->getSecondColor(),'third' => $logoConfig->getThirdColor(),];

    foreach ($idColorArray as $state => $color) {
        if ($color != 'FFFFFF') {
            $svg = preg_replace(
                '/class="' . $state . '" style="fill:#([0-9a-fA-F]{6})/','class="' . $state . '" style="fill:#' . $color,$svg
            );
        }
    }

    $fileName = sprintf('%s.png',uniqid());
    $filePath = sprintf('/tmp/%s',$fileName);
    $this->filePath = $filePath;

    $im = new \Imagick();
    $im->setBackgroundColor(new \ImagickPixel('transparent'));
    $im->readImageBlob($svg);
    $im->setimageFormat("png24");
    $im->writeImage($filePath);  //error !

    $file = new UploadedFile($filePath,$fileName .'.png');
    $im->clear();
    $im->destroy();

    $oldImages  = $logoConfig->getRenderedlogoImages();
    foreach ($oldImages as $image) {
        if ($image->getimageName() !== 'default_logo.png') {
            $this->uploadHandler->remove($image,'imageFile');
        }
        $logoConfig->removeRenderedlogoImage($image);
    }

    $renderedImage = new ConfiglogoDefaultimage();
    $renderedImage->setimageFile($file);
    $renderedImage->setimageName($fileName);
    $logoConfig->addRenderedlogoImage($renderedImage);
    $this->operateImage($logoConfig,'Renderedlogo');
}

错误发生在第$im->writeImage($filePath)行;

在此先感谢您的帮助。

解决方法

无论谁面对此问题,我在C:/ tmp创建tmp目录后都已解决。显然imagick没有使用在系统属性或php.ini中设置的系统tmp目录。