Ошибка в PHP Imagick::readImageBlob() - Width or height exceeds limit OpenPixelCache

Категория: PHP

Ошибка в PHP при чтении изображения весом 1MB в методе Imagick::readImageBlob():

width or height exceeds limit `' @ error/cache.c/OpenPixelCache/3911

Причина в том, что размер изображения превышает допустимый (width:height).

Файл конфигурации:

sudo nano /etc/ImageMagick-6/policy.xml
Исходный конфиг:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policymap [
  <!ELEMENT policymap (policy)+>
  <!ATTLIST policymap xmlns CDATA #FIXED ''>
  <!ELEMENT policy EMPTY>
  <!ATTLIST policy xmlns CDATA #FIXED '' domain NMTOKEN #REQUIRED
    name NMTOKEN #IMPLIED pattern CDATA #IMPLIED rights NMTOKEN #IMPLIED
    stealth NMTOKEN #IMPLIED value CDATA #IMPLIED>
]>

<!--
  Configure ImageMagick policies.
  .....
-->

<policymap>
  <!-- <policy domain="system" name="shred" value="2"/> -->
  <!-- <policy domain="system" name="precision" value="6"/> -->
  <!-- <policy domain="system" name="memory-map" value="anonymous"/> -->
  <!-- <policy domain="system" name="max-memory-request" value="256MiB"/> -->
  <!-- <policy domain="resource" name="temporary-path" value="/tmp"/> -->
  <policy domain="resource" name="memory" value="256MiB"/>
  <policy domain="resource" name="map" value="512MiB"/>
  <policy domain="resource" name="width" value="16KP"/>
  <policy domain="resource" name="height" value="16KP"/>
  <!-- <policy domain="resource" name="list-length" value="128"/> -->
  <policy domain="resource" name="area" value="128MB"/>
  <policy domain="resource" name="disk" value="1GiB"/>
  <!-- <policy domain="resource" name="file" value="768"/> -->
  <!-- <policy domain="resource" name="thread" value="4"/> -->
  <!-- <policy domain="resource" name="throttle" value="0"/> -->
  <!-- <policy domain="resource" name="time" value="3600"/> -->
  <!-- <policy domain="coder" rights="none" pattern="MVG" /> -->
  <!-- <policy domain="module" rights="none" pattern="{PS,PDF,XPS}" /> -->
  <!-- <policy domain="delegate" rights="none" pattern="HTTPS" /> -->
  <!-- <policy domain="path" rights="none" pattern="@*" /> -->
  <!-- <policy domain="cache" name="memory-map" value="anonymous"/> -->
  <!-- <policy domain="cache" name="synchronize" value="True"/> -->
  <!-- <policy domain="cache" name="shared-secret" value="passphrase" stealth="true"/> -->
  <!-- <policy domain="system" name="pixel-cache-memory" value="anonymous"/> -->
  <!-- <policy domain="system" name="shred" value="2"/> -->
  <!-- <policy domain="system" name="precision" value="6"/> -->
  <!-- not needed due to the need to use explicitly by mvg: -->
  <!-- <policy domain="delegate" rights="none" pattern="MVG" /> -->
  <!-- use curl -->
  <policy domain="delegate" rights="none" pattern="URL" />
  <policy domain="delegate" rights="none" pattern="HTTPS" />
  <policy domain="delegate" rights="none" pattern="HTTP" />
  <!-- in order to avoid to get image with password text -->
  <policy domain="path" rights="none" pattern="@*"/>
  <!-- disable ghostscript format types -->
  <policy domain="coder" rights="none" pattern="PS" />
  <policy domain="coder" rights="none" pattern="PS2" />
  <policy domain="coder" rights="none" pattern="PS3" />
  <policy domain="coder" rights="none" pattern="EPS" />
  <policy domain="coder" rights="none" pattern="PDF" />
  <policy domain="coder" rights="none" pattern="XPS" />
</policymap>

Нужно установить нужный вам допустимый размер изображения:

<policy domain="resource" name="width" value="24KP"/>
<policy domain="resource" name="height" value="24KP"/>

Или задаем значение xml-конфига командой sed (сделайте, на всякий, бекап конфига):

cp /etc/ImageMagick-6/policy.xml ./
sed -i -r 's/(name="width" value=")[^"]+"/\124KP"/' /etc/ImageMagick-6/policy.xml
sed -i -r 's/(name="height" value=")[^"]+"/\124KP"/' /etc/ImageMagick-6/policy.xml

* Непривычные единицы измерения для картинки - "KP")

Примечание

Советовали установить значение через переменную MAGICK_AREA_LIMIT, но это не помогло. Возможно, это применимо для консольного запуска convert, хз..

env MAGICK_AREA_LIMIT=48MP php some_script.php


Ошибка:

Failed mapping doc 82698. cache resources exhausted `' @ error/cache.c/OpenPixelCache/4083

Правим:

<policy domain="resource" name="disk" value="4GiB"/>


#php, #imagic

категория: PHP