Ошибка в PHP Imagick::readImageBlob() - Width or height exceeds limit OpenPixelCache
Ошибка в 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