laravel-admin+elasticsearch升级PHP到7.3的一些问题整理

项目中使用laravel-admin,版本为:5.3.31,是老版本了。但是最近要升级软件环境,将PHP版本由5.6.34升级到7.3.28,升级后引出一系列问题,其他问题逐一解决,基本都是些函数弃用的问题。

但是项目中用到elasticsearch,搜索时报错:{“error”:“Content-Type header [] is not supported”,“status”:406},出现问题后网上也搜了一下,大都是curl请求时需要增加头部信息,问题也确实出在这,但是解决方法大都是命令行, 如:curl -H “Content-Type: application/json” -XPOST。一般命令行请求确实可以解决。
ES中需要改动部分文件。
解决办法为:找到文件:
CODE-XXX\vendor\elasticsearch\elasticsearch\src\Elasticsearch\Connections\Connection.php
构造方法中参数初始化,增加Content-Type等参数,如下:

/**
     * Constructor
     *
     * @param $handler
     * @param array $hostDetails
     * @param array $connectionParams Array of connection-specific parameters
     * @param \Elasticsearch\Serializers\SerializerInterface $serializer
     * @param \Psr\Log\LoggerInterface $log              Logger object
     * @param \Psr\Log\LoggerInterface $trace
     */
    public function __construct($handler, $hostDetails, $connectionParams,
                                SerializerInterface $serializer, LoggerInterface $log, LoggerInterface $trace)
    {
        if (isset($hostDetails['port']) !== true) {
            $hostDetails['port'] = 9200;
        }

        if (isset($hostDetails['scheme'])) {
            $this->transportSchema = $hostDetails['scheme'];
        }

        if (isset($hostDetails['user']) && isset($hostDetails['pass'])) {
            $connectionParams['client']['curl'][CURLOPT_HTTPAUTH] = CURLAUTH_BASIC;
            $connectionParams['client']['curl'][CURLOPT_USERPWD] = $hostDetails['user'].':'.$hostDetails['pass'];
        }

        /*
         * 是因为在 ES6.0 之后,ES 对 content-type 的检测更为严格,在 ES 的早期版本中,content-type 是可选的,
         * 如果缺省或者 ES 无法辨别,ES 会根据请求内容进行猜测。
         * 这个功能最先出现在 5.3 版本,http.content_type.required 是在配置中的,
         * 在 5.x 版本中,默认参数是 false,但是在 6.0 版本中,这个参数是 true,并且不能改变。
         * 为什么要对这个做出改变呢,是因为随着 ES 的发展,ES 认为可靠性和可预测性更重要,猜测一定会猜错,
         * 但是增加了一点点内容,有助于安全和清晰,这是非常明智的。
         * 转自链接:https://learnku.com/articles/46475
         */
        //升级php7.3+后,es搜索报错:{"error":"Content-Type header [] is not supported","status":406}
        //请求时需增加头部信息即可
        $connectionParams['client']['curl'][CURLOPT_HTTPHEADER] =  ['Accept: application/json', 'Content-Type: application/json'];

        $host = $hostDetails['host'].':'.$hostDetails['port'];
        $path = null;
        if (isset($hostDetails['path']) === true) {
            $path = $hostDetails['path'];
        }
        $this->host             = $host;
        $this->path             = $path;
        $this->log              = $log;
        $this->trace            = $trace;
        $this->connectionParams = $connectionParams;
        $this->serializer       = $serializer;

        $this->handler = $this->wrapHandler($handler, $log, $trace);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将Laravel-Admin与ELK整合在一起,你可以按照以下步骤进行操作: 1. 首先,按照之前提供的方法安装并配置Laravel-Admin。 2. 接下来,使用docker-compose安装ELK堆栈,可以参考前面提供的教程。 3. 在Laravel项目中安装Elasticsearch客户端库。可以使用Composer运行以下命令: ``` composer require elasticsearch/elasticsearch ``` 4. 创建一个新的控制器来处理日志数据。在命令行中运行以下命令来生成控制器: ``` php artisan make:controller LogController ``` 5. 在LogController中,你可以编写相应的方法来将日志数据发送到Elasticsearch。以下是一个简单的示例: ```php <?php namespace App\Http\Controllers; use Elasticsearch\ClientBuilder; use Illuminate\Http\Request; class LogController extends Controller { public function sendLog(Request $request) { $client = ClientBuilder::create()->build(); // 将日志数据发送到Elasticsearch $params = [ 'index' => 'logs', // 定义索引名称 'body' => [ 'message' => $request->input('message'), // 日志消息 'level' => $request->input('level'), // 日志级别 ], ]; $response = $client->index($params); return response()->json($response); } } ``` 请根据你的实际需求进行适当的调整。 6. 在routes/web.php文件中定义相关的路由。例如,可以添加以下路由: ```php Route::post('/log', 'LogController@sendLog'); ``` 7. 在Laravel-Admin中创建相应的页面和表单,用于输入日志数据。你可以使用Laravel-Admin的表单组件来创建一个用于输入日志消息和级别的表单。 8. 在Laravel-Admin的表单提交处理方法中,使用Guzzle或其他HTTP客户端库将日志数据发送到上面定义的路由。以下是一个简单的示例: ```php use GuzzleHttp\Client; // ... public function handleFormSubmit(Request $request) { $client = new Client(); $response = $client->post('http://your-domain/log', [ 'form_params' => [ 'message' => $request->input('message'), 'level' => $request->input('level'), ], ]); // 处理响应结果 return redirect()->back()->with('success', 'Log sent successfully.'); } ``` 请根据你的实际情况进行适当调整。 通过以上步骤,你可以将Laravel-Admin与ELK整合在一起。在Laravel-Admin中创建一个页面和表单,用于输入日志数据,并在后台将这些数据发送到Elasticsearch。然后,你可以使用Kibana等工具对这些日志数据进行可视化和查询。记得根据你的实际需求进行适当的调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值