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

公羊学义
2023-12-01
项目中使用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);
    }
 类似资料: