asmblah/heap-walker
Composer 安装命令:
composer create-project asmblah/heap-walker
包简介
PHP userland heap walker
README 文档
README
Walks as much of the userland heap as possible, looking for instances of the given FQCN (Fully-Qualified Class Name).
This helps figure out where a given object is being referred to from, in order to help solve memory leaks.
Usage
Install
composer require --dev asmblah/heap-walker
Use
<?php // ... $heapWalk = new HeapWalk(); // Find all instances of Item and how to reach them. $pathSets = $heapWalk->getInstancePathSets([Item::class]); // Inspect the result as needed.
Full example
<?php use Asmblah\HeapWalk\HeapWalk; use Asmblah\HeapWalk\Result\Path\InstancePathSet; require_once __DIR__ . '/vendor/autoload.php'; class Item { public $description; public function __construct($description) { $this->description = $description; } } class Bag { // Note that visibility is ignored. private static $items = []; public static function init() { self::$items[] = new Item('a cabbage'); } } Bag::init(); $heapWalk = new HeapWalk(); // Find all instances of Item and how to reach them. $pathSets = $heapWalk->getInstancePathSets([Item::class]); // Inspect the result as needed. assert(count($pathSets) === 1); assert($pathSets[0] instanceof InstancePathSet); assert(count($pathSets[0]->getPaths()) === 1); assert($pathSets[0]->getPaths()[0]->toString() === 'Bag::$items[0]'); assert($pathSets[0]->getPaths()[0]->getEventualValue() instanceof Item); assert($pathSets[0]->getPaths()[0]->getEventualValue()->description === 'a cabbage');
Caveats & limitations
-
Scopes other than the global one are not fully inspected; only their arguments are captured through use of
debug_backtrace(). -
The local scope of paused Generators is not accessible. For example, if a paused generator has an iterator variable
$ideclared inside with no other references to it existing, it will not be discovered. -
If a captured object is a descendant of another uncaptured object, then recursion handling will (currently) mean that only the first path to the captured object via the uncaptured one will be recorded. e.g. a service in Symfony container will only be shown via
$kernel->bundles->...->container[...]and not also via$kernel->container[...]. -
Internal references between PHP objects, that are not exposed to userland, are not discoverable. For example, a
PDOStatementhas an internal strong reference to itsPDOConnection, but there is no way to access thePDOConnectionfrom thePDOStatement. It should be possible to use the uopz extension to hookPDOConnection->prepare(...)and link back to it from thePDOStatement(in a future plugin for this tool, for example), however this must be done carefully to avoid preventing thePDOConnectionfrom being GC'd.
asmblah/heap-walker 适用场景与选型建议
asmblah/heap-walker 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 9.05k 次下载、GitHub Stars 达 0, 最近一次更新时间为 2021 年 10 月 01 日, 在 PHP 生态内属于活跃度较高的组件。
我们在过去多个企业项目中使用过 asmblah/heap-walker 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 asmblah/heap-walker 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
统计信息
- 总下载量: 9.05k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 27
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2021-10-01