محمد علوی
محمد علوی
خواندن ۳ دقیقه·۵ سال پیش

رفع مشکل تخصیص حافظه در PHPUnit


معمولا وقتی پروژه یکمی بزرگ میشه و در جوارش تست ها هم زیاد میشن طبیعتا حافظه ای که برای اجرای اون تست ها هم لازمه زیادتر میشه. اینجاست که مشکل تخصیص حافظه به PHPUnit رخ میده. یه چیزی مثل این:

PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1052672 bytes) in

برای رفع این مشکل دو راه پیشنهاد میدم:

1. افزایش محدودیت حافظه PHP
2. تغییر کانفیگ PHPUnit

هر کدوم از این راه ها نقطه قوت و نقطه ضعف خودشون رو دارن.
(همه توضیحات بر مبنای ست آپ لوکال خودم، ویندوز 10 و php 7.4.3 هست).


افزایش محدودیت حافظه PHP:

نقطه قوت: تغییری در سرعت تست ایجاد نمی کنه
نقطه ضعف: برای دپلوی بر روی سرور مشکلاتی ایجاد می کنه

برای این کار باید در پوشه نصب PHPتون و در فایل php.ini این رو سرچ کنید:

memory_limit

نکته: در صورت استفاده از bash میتونید از دستور زیر برای پیدا کردن مسیر نصب PHPتون استفاده کنید:

which php

به صورت پیشفرض حداکثر حافظه ای که یک اسکریپت PHP میتونه استفاده کنه 128M هست که باید اون رو به میزانی که نیاز دارید به صورت زیر افزایش بدید. در اکثر مواقع 2G باید کافی باشه.

memory_limit = 2G

استفاده از این روش مشکل استفاده لوکالمون که زیاد محدودیت حافظه نداریم رو حل می کنه ولی وقتی داریم از سیستم های Continuous Integration مثل TravisCI استفاده می کنیم و همه تست ها در سرور هم اجرا میشن به دلیل اینکه معمولا مقدار حافظه ای که در سرور در دسترسمون هست محدود هست باز هم به همین مشکل بر می خوریم. اینجاست که راه دوم به کمکمون میاد.

تغییر کانفیگ PHPUnit

نقطه قوت: هم میتونیم در لوکال استفاده کنیم و هم برای دپلوی بر روی سرور
نقطه ضعف: کاهش محسوس سرعت اجرای تست ها

در فایل phpunit.xml این کانفیگ رو به این شکل اضافه و یا تغییر بدید:

processIsolation=&quottrue&quot

این کانفیگ به PHPUnit میگه که هر تست رو به صورت ایزوله انجام بده. اینکار باعث میشه که بعد از اجرا شدن هر تست حافظه مورد استفاده اون آزاد بشه ولی هزینه ای که بابتش پرداخت می کنیم این هست که با فعال کردنش تست ها بسیار کند تر از قبل اجرا میشن. مزیت این روش این هست که میتونیم با خیال راحت تست ها رو دپلوی کنیم بدون اینکه به مشکل کمبود حافظه در سرور بر بخوریم. سرور هم میشینه آروم آروم برای خودش تست ها رو اجرا می کنه ^^


خلاصه اینکه در نوشتن تست فراز و نشیب زیاد هست ولی ارزشش رو داره :) به امید روزی که کد بدون تست نبینیم 3>




phpunittddphplaravelunittest
توسعه دهنده وب فول استک (لاراول, ویو)
شاید از این پست‌ها خوشتان بیاید