laravel命令行内存控制分两类:artisan命令用php -d memory_limit=512m artisan ...临时覆盖;队列worker用--memory=128参数设阈值,超限后自动重启,并需配合supervisor的autorestart及--max-jobs/--max-time等防护机制。

在 Laravel 命令行中设置运行内存大小,核心是控制 PHP 进程的 memory_limit,而非 Laravel 本身提供独立配置项。关键分两类场景:执行 Artisan 命令(如 php artisan migrate)和运行队列 worker(如 php artisan queue:work),处理方式不同但目标一致——防止 Allowed memory size exhausted 或 OOM 被系统强杀。
执行普通 Artisan 命令时临时调高内存
适用于迁移、缓存清理、数据导入等一次性命令,推荐用命令行参数直接覆盖:
- 不限制(仅限本地调试):
php -d memory_limit=-1 artisan migrate - 设为 512MB(更稳妥):
php -d memory_limit=512M artisan db:wipe --force - Windows PowerShell 需加引号:
php -d "memory_limit=512M" artisan optimize:clear
注意:该设置只影响当前命令,不修改 php.ini,无需重启服务;生产环境禁用 -1,应设具体上限值。
运行队列 worker 时限制内存并自动重启
队列进程是长生命周期的,不能只靠 memory_limit,必须结合 Laravel 内置机制:
- 用
--memory参数设硬性阈值(单位 MB):php artisan queue:work --memory=128,超限时当前任务完成后退出 - 配合 Supervisor 实现无缝重启:在
supervisord.conf中确保autorestart=true,并把--memory=128写入command行 - 叠加周期性保护:
--max-jobs=500(每处理 500 个任务重启)、--max-time=1800(运行 30 分钟后重启)
通过环境变量或配置文件统一管控
适合 CI/CD 或多命令批量执行场景,避免重复写参数:
- Linux/macOS:
export COMPOSER_MEMORY_LIMIT=2G(专用于 Composer 相关命令) - 所有 PHP CLI 命令通用:
export PHP_MEMORY_LIMIT=256M,再运行php artisan ... - 若用 systemd 管理队列服务,可在 service 文件中添加:
Environment="PHP_MEMORY_LIMIT=192M"
注意:Supervisor 的 environment 配置不透传到 PHP ini,需改用 php -d 或 systemd 方式。
排查与验证是否生效
别只信配置,要实测确认:
- 运行
php -i | grep memory_limit查看 CLI 模式下的实际生效值 - 在 Artisan 命令开头加
echo ini_get('memory_limit')."\n";输出当前限制 - 队列任务中用
memory_get_usage(true)采样,对比任务前后差值,判断真实增量
如果日志里只看到 “Killed” 而无 PHP 错误,大概率是系统 OOM Killer 干的,此时需检查 dmesg -T | grep -i "killed process",并确认 --memory 和 php -d 是否已协同生效。











