Laravel Sanctum配置及认证接口内存耗尽500错误求助
嘿,我来帮你分析下这个问题!首先看到你遇到的是内存耗尽的500错误,结合你的Sanctum配置,咱们一步步排查:
1. 先解决最直接的内存限制问题
你看到的Allowed memory size of 134217728 bytes exhausted就是说PHP的内存限制只有128MB,Laravel在处理Sanctum认证的时候可能因为某些逻辑(比如模型加载、异常处理)占用了超过这个值的内存。你可以先尝试调高内存限制:
- 如果是用Apache服务器,在项目根目录的
.htaccess文件里添加:php_value memory_limit 256M - 如果是Nginx或者CLI运行,修改你的
php.ini文件,找到memory_limit项改成memory_limit = 256M,改完记得重启服务 - 临时方案可以在
public/index.php的最顶部加上:ini_set('memory_limit', '256M');
先试试这个,如果调高后不再报错,那说明确实是内存不够用导致的;如果还是报同样的错,那咱们再看Sanctum的配置问题。
2. 排查Sanctum的认证配置
检查Auth Guard的驱动配置
你的sanctum.php里设置了'guard' => ['api'],那你得确保config/auth.php里的api guard是用的sanctum驱动,不然Sanctum在认证的时候会找不到正确的用户提供者,可能陷入循环导致内存溢出:
// config/auth.php 'guards' => [ 'api' => [ 'driver' => 'sanctum', // 必须是sanctum驱动 'provider' => 'users', ], ],
调整Session Domain配置
你.env里的SESSION_DOMAIN=*虽然看起来兼容所有域名,但有时候通配符会导致Cookie的作用域异常,Sanctum无法正确识别Cookie里的token,进而反复尝试认证消耗内存。建议改成具体的域名,和SANCTUM_STATEFUL_DOMAINS保持一致,比如:
SESSION_DOMAIN=localhost
检查Cookie加密的中间件冲突
你的sanctum.php里的middleware包含了encrypt_cookies,要确保你手动设置的access_tokenCookie没有被重复加密。另外,确认App\Http\Middleware\EncryptCookies里的$except数组没有把access_token排除在外(因为Sanctum的token存在Cookie里需要加密):
// App\Http\Middleware\EncryptCookies.php protected $except = [ // 不要在这里添加access_token ];
3. 检查Postman的请求设置
因为你的CORS配置里supports_credentials是true,所以在Postman里请求的时候,必须开启“Send cookies”选项(也就是启用withCredentials)。如果请求没带Cookie,Sanctum认证失败的异常处理逻辑可能出现问题,导致内存耗尽。你可以在Postman的请求设置里找到“Cookies”选项,确保启用,或者在请求头里手动带上Cookie。
4. 排查用户模型的潜在问题
如果你的User模型里有复杂的关联关系,或者在模型的boot方法里有自动加载的逻辑,可能在Sanctum认证的时候触发了无限循环(比如关联模型互相引用),导致内存耗尽。你可以暂时注释掉User模型里的关联方法,测试一下user-data接口是否正常,如果正常,再逐步排查哪个关联有问题。
先从调高内存限制开始验证,这个是最快的排查步骤,希望能帮到你!
备注:内容来源于stack exchange,提问作者php_man

