Laravel 5.2 的一处严重性能问题

原文链接:http://tech.tjs.im/2017-10-08/mb_strpos-pe...

最近发现 Laravel 在处理某类队列任务时时间超长,经排查发现 src/Illuminate/Queue/Jobs/Job.php 文件中的 rolveQueueableEntity 使用了 Illuminate Str 的 startsWith,此方法中使用了 mb_strpos 方法。mb_strpos 的性能非常差 (Why is mb_strpos so considerably slower than strpos?),在处理大 string (100M以上) 时会产生严重性能问题。可以看到这里处理的数据有一种是序列化后的 Job 实例,是有可能出现大的 string.

由于 Laravel 已经停止对 5.2 版本的支持,5.5版本也更新了实现,不再使用rolveQueueableEntity方法,这个问题只能自行修复。修复方法:fix bad performance of resolve queueable entity

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 5年前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 8

升级laravel版本呗。

6年前 评论
leo

100M 以上的 string,什么场景会出现?

6年前 评论

@leo 把一个实例放到job里

6年前 评论

@江湖大虾仁 据比较这块做了比较大的修改

6年前 评论

@江湖大虾仁 哦,以为说的修改消费job的实现

当时没看startsWith的新实现,不过在第一次修改的时候确实用了截取头再比较的方法。话说这个substr对多字节内容操作后不会有问题吗。

6年前 评论

@江湖大虾仁 这样看来这个问题在新版本已经被彻底修复了

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!