在Laravel中使用runkit扩展重写dd方法
背景
一次疏忽,忘记删除用于调试的dd代码,导致生产回滚。后发现可以使用runkit扩展,重写方法来避免上面的问题。
调试代码:
<?php
namespace App\Http\Controllers;
class IndexController extends Controller
{
public function index()
{
$a = 'abc';
//调试代码
dd($a);
return 'test';
}
}
环境
php 版本:7.2.6
Laravel 版本:7.30.6
解决方案
首先安装runkit扩展,这部分可自行百度。
然后修改app/Providers/AppServiceProvider
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
$env = config('app.env');
//beta和生产环境起效
if (in_array($env, ['beta','production'])) {
runkit7_function_redefine('dd', function (...$args) {
app('log')->info('使用了dd函数', $args);
//todo 发送邮件或其他动作
});
}
}
}
最后访问IndexController@index,就只返回test,且记录日志中。
替换或删除php内置函数
如果想替换比如var_dump等php内置方法,则需要在php.ini中增加配置
runkit.internal_override=1
总结
开发中需要注意调试代码是否在上线时已被删除或注释,加上用runkit进行兜底,就可以避免一些发版问题了。
本作品采用《CC 协议》,转载必须注明作者和本文链接
不是很建议在生产环境中使用。
对于这个问题,可以考虑在 git hooks 里面,用正则匹配一下
\bdd\(
可以在一定程度上避免了