php artisan tinker 直接可用,但需确保 psy/psysh 已通过 composer require --dev psy/psysh 安装;Windows 用户建议用 Git Bash 或 Windows Terminal;查数据优先用 Eloquent 而非 DB::table();大批量操作须用 chunk() 防内存溢出;类修改后执行 reload 重载,单例需重启 tinker;事务需手动包裹。

php artisan tinker 直接可用,无需额外安装或配置——只要项目能跑 artisan 命令,它就在那儿。
启动失败:Class 'Psy\Shell' not found 怎么办
这是最常见报错,本质是 psy/psysh 依赖缺失,不是 Laravel 本身问题。
- 执行
composer require --dev psy/psysh(必须加--dev) - Windows 用户若用 CMD 启动后无响应或乱码,换
Git Bash或Windows Terminal - Mac/Linux 下支持上下键调历史命令;CMD 不支持,别硬试
- 生产环境禁用:它会加载全部服务提供者,可能意外触发队列、缓存预热、日志轮转等副作用
查数据为什么别用 DB::table()->get()
DB::table('users')->get() 返回纯数组,字段名大小写、时间格式、JSON 字段、软删除状态全得手动处理;而 Eloquent 自动走访问器、强制类型转换、模型事件。
- 查一个用户:用
User::first(),不是DB::table('users')->first() - 验证作用域:直接
User::active()->count(),比拼 SQL 直观 - 看软删除:
User::withTrashed()->first()比deleted_at IS NOT NULL更可靠 - 找关联数据:
$user = User::with('posts')->first(); $user->posts,不用自己 join
大批量操作时内存爆掉或卡死怎么办
get() 会把全部结果一次性载入内存,10 万条记录就可能 OOM;tinker 又没默认超时,一个 SLEEP(5) 就让终端假死 5 秒。
- 遍历数据改用
chunk(100, function ($users) { ... }),避免内存溢出 - 耗时操作前先设限:
set_time_limit(3),防止无限挂起 - 别在
tinker里调Artisan::call('queue:work')这类长时进程 - 修改完记得
$user->save(),tinker不自动 commit
类改了但 tinker 里不生效?
tinker 是基于 psysh 的 REPL,不是实时监听文件变化的开发服务器。
- 普通类更新后,执行
reload命令重载类定义 - 单例类(如服务容器绑定的实例)无法 reload,必须退出再进:
exit后重跑php artisan tinker - 如果用了
require_once手动引入文件,改完也得重新require_once一次 - 箭头函数在旧版
psysh中可能解析失败,遇到语法错误可降级写法或升级psy/psysh
真正容易被忽略的是:它不处理事务边界。你在 tinker 里执行多条 Eloquent 操作,不会自动包裹在事务里——误删或误改,关掉终端也撤不回。需要时得手动 DB::transaction(...) 包一层。


















