psysh 必须本地安装(composer require --dev psy/psysh)而非全局,且需在项目根目录运行 vendor/bin/psysh;配置 config.php 并通过 -c 指定,利用 startup 回调注入上下文变量,用 show() 或调整 dumper 参数实现对象属性展开。

直接用 composer require 装不上 PsySH?先确认项目类型
PsySH 不是普通库,它本身是个 CLI 工具,不能像 monolog/monolog 那样直接 require 后在代码里 new 实例调用。装错位置会导致 psysh 命令找不到、或 vendor/bin/psysh 执行报错。
关键判断:你是否需要在当前项目上下文中运行交互式 Shell(比如调试 Laravel 或 Symfony 的请求上下文)?如果是,必须把 PsySH 安装到项目本地;如果只是想全局用,才该用 composer global require —— 但后者无法自动加载项目里的 autoloader,基本没用。
- 项目级安装:
composer require --dev psy/psysh(推荐,--dev是因为它是开发工具) - 全局安装(不推荐):
composer global require psy/psysh,需确保~/.composer/vendor/bin在$PATH中 - 装完后检查:
vendor/bin/psysh --version应输出版本号,否则说明未正确安装或权限问题
vendor/bin/psysh 报 Class not found?Autoloader 没生效
常见错误现象:PHP Fatal error: Uncaught Error: Class 'Psy\Shell' not found。这不是 PsySH 自身坏了,而是 Composer 的 autoloader 没加载进来 —— 尤其在非标准项目结构(比如没 composer.json 的脚本目录)或手动 require 了 autoloader 但顺序不对时。
根本原因:PsySH 启动时依赖 vendor/autoload.php,但它默认只在项目根目录下找。如果你从子目录执行 vendor/bin/psysh,它可能找不到 autoload 文件。
- 始终在项目根目录(含
composer.json的目录)下运行vendor/bin/psysh - 不要手动
require 'vendor/autoload.php'再调new \Psy\Shell()—— 这绕过了 PsySH 自带的启动逻辑,会丢掉配置、命令、上下文绑定 - 如果必须在子目录触发,用完整路径:
php -d auto_prepend_file=vendor/autoload.php vendor/bin/psysh
如何让 PsySH 加载当前项目的类和配置?靠 config.php 和上下文注入
默认的 PsySH 启动后只能访问 PHP 内置函数和已加载的类,不会自动包含你的 app/、src/ 或框架服务。要让它真正“进入项目”,得配 config.php 并显式引入上下文。
在项目根目录建 psysh 目录(或任意位置),放一个 config.php:
<?php return [
'runtimeDir' => sys_get_temp_dir() . '/psysh',
'usePcntl' => true,
'commands' => [],
// 关键:让 PsySH 知道你的 autoloader
'startup' => function ($shell) {
// 如果项目用了框架,这里可以初始化容器或 DB 连接
// 例如 Laravel:$app = require __DIR__.'/bootstrap/app.php';
// $shell->setScopeVariables(['app' => $app]);
},
];
然后通过 -c 参数指定配置:vendor/bin/psysh -c psysh/config.php。注意:startup 回调里不能 throw 异常,否则 Shell 启动失败。
-
startup函数里可require项目引导文件(如bootstrap/app.php),但别重复执行autoload.php - 用
$shell->setScopeVariables([...])注入变量,之后在 Shell 里就能直接用$app、$container等 - 避免在
startup里做耗时操作(如连接数据库),否则每次启动 Shell 都卡住
为什么 dump() 不显示对象属性?不是 Bug,是 PsySH 默认关闭了对象展开
在 PsySH 里执行 dump($user) 只显示类名和内存地址,不像 Laravel Tinker 那样展开属性 —— 这是因为 PsySH 默认使用 Symfony VarDumper 的精简模式,且不自动启用 Reflection 权限。
解决方法不是换工具,而是调整 PsySH 的 dumper 行为:
- 临时开启完整展开:
dump($user, ['maxDepth' => 10, 'maxStringLength' => 256]) - 永久生效:在
config.php里加'casters' => [\Psy\VarDumper\Caster\ReflectionCaster::class] - 更实用的是用
show($user)(PsySH 内置命令),它会调用对象的__debugInfo()(如果定义了)并格式化输出
另外注意:某些框架对象(如 Laravel Eloquent Model)的属性是动态代理的,dump() 看不到实际值,得用 $user->toArray() 或 $user->getAttributes() 显式取。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











