V posledních měsících se mi častokrát stávalo, že při použití composeru a updatu závislostí pomocí
composer update
se opakovaně zobrazovala chyba při nedostatku paměti. Nebylo možné tak updatovat balíčky na mých projektech. Jedná se o tuto chybovou zprávu:
VirtualAlloc() failed: [0x00000008] Not enough memory resources are available to process this command.
VirtualFree() failed: [0x000001e7] Attempt to access invalid address.
PHP Fatal error: Out of memory
Při hledání na fórech jsem našel jako jedno z možných řešení navyšování memory limitu PHP v souboru php.ini
; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit=512M
Bohužel se ukázalo, že ani při nastavení hodnoty na -1, což je neomezený limit, se nepodařilo composeru doběhnout bezchybně. Pokud se dostanete do takové situace, narazili jste pravěpodobně na strop 32 bitové architektury, kdy je možné PHP skriptem adresovat maximálne 2GB paměti.
Abychom tedy byli schopni problém vyřešit, bude nutné přejít na 64 bitovou verzi PHP. Pokud totiž pro vývoj používáte Windows a nějaký ten Xampp, WampServer, Neard, většinou se jedná o 32bit verze. Máte-li OS x64, pak si můžete vybrat například WampServer x64, který jsem v tomto případě použil i já. Problém lze tak snadno vyřešit jeho instalací. Pokud naopak používáte OS x32, budete muset využít nějakou formu virtualizace, například VirtualBox umožňuje spustit 64bit OS na fyzickém 32bit operačním systému, samozřejmě za předpokladu, že to podporuje váš procesor.
Po jeho instalaci pak spustíme composer pomocí této 64 bitové verze PHP:
C:\wamp\bin\php\php7.2.10\php -d memory_limit=-1 composer.phar update
Nyní již vše doběhne bez nejmenších problémů.
Pro zajímavost ještě můžeme spustit composer s parametrem –profile pro představu, kolik paměti celý skript na svůj úśpěšný běh potřeboval:
C:\wamp\bin\php\php7.2.10\php -d memory_limit=-1 composer.phar update --profile -vvv
V mém případě se jednalo o 1,8GB, což je opravdu hodně! Samozřejmě jako první věc, která vás napadne je, jak je možné, že composer spotřebuje tak velké množství paměti. A ptáte se velmi správně, předpokládám však, že to nikoho moc netrápí. Spousta vývojářů používá Linux, případně MacOs a ty již v dnešní době jsou 64bit včetně PHP. Pak na takové limity pravděpodobně většina ani nenarazí. V každém případě je to trochu smutná situace, kdy dnešní software není zkrátka optimalizovaný a není nic, co by tvůrce k tomu nějak nutilo.