如何安装 Composer

安装前请务必确保已经正确安装了 PHP.打开命令行窗口并执行 php -v 查看是否正确输出版本号.

打开命令行并依次执行下列命令安装最新版本的 Composer:

php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
  • 执行第一条命令下载下来的 composer-setup.php 脚本将简单地检测 php.ini 中的参数设置,如果某些参数未正确设置则会给出警告;然后下载最新版本的 composer.phar 文件到当前目录.

  • 上述 3 条命令的作用依次是:

  1. 下载安装脚本 - composer-setup.php - 到当前目录.
  2. 执行安装过程.
  3. 删除安装脚本.

局部安装

  • 上述下载 Composer 的过程正确执行完毕后,可以将 composer.phar 文件复制到任意目录(比如项目根目录下),然后通过 php composer.phar 指令即可使用 Composer 了!

全局安装

  • 全局安装是将 Composer 安装到系统环境变量 PATH 所包含的路径下面,然后就能够在命令行窗口中直接执行 composer 命令了.

Mac 或 Linux 系统:

  • 打开命令行窗口并执行如下命令将前面下载的 composer.phar 文件移动到 /usr/local/bin/ 目录下面
sudo mv composer.phar /usr/local/bin/composer

Windows 系统:

  1. 找到并进入 PHP 的安装目录(和你在命令行中执行的 php 指令应该是同一套 PHP).
  2. composer.phar 复制到 PHP 的安装目录下面,也就是和 php.exe 在同一级目录.
  3. 在 PHP 安装目录下新建一个 composer.bat 文件,并将下列代码保存到此文件中.
@php "%~dp0composer.phar" %*
  • 最后重新打开一个命令行窗口试一试执行 composer --version 看看是否正确输出版本号.

提示:不要忘了经常执行 composer selfupdate 以保持 Composer 一直是最新版本哦!

关于升级 Composer

Composer 升级时是无法利用我们的镜像加速下载的,而必须连接到 Composer 国外官网的服务器上下载升级文件,某些时候就会导致升级的速度非常慢甚至失败.

  • 这里提供一个简单的办法:

  • 如果你的系统中已经有可以正常使用的 Composer 了,说明系统环境是符合要求的,那么只需要下载新的 Composer 文件并覆盖原来的文件即可.

  • 首先你要确定现有的 Composer 的安装目录,然后通过下面的链接下载 composer.phar 文件(复制以下地址到浏览器地址栏可直接下载),

https://install.phpcomposer.com/composer.phar
  • 将前面下载的 composer.phar 文件覆盖系统中已经安装的 composer.phar 文件即可.注意,有可能在安装时将 composer.phar 改名为 composer 了,注意用同样的名字覆盖即可.

Packagist 镜像使用方法

镜像用法

有两种方式启用本镜像服务:

  • 系统全局配置: 即将配置信息添加到 Composer 的全局配置文件 config.json 中.见方法一
  • 单个项目配置: 将配置信息添加到某个项目的 composer.json 文件中.见方法二

方法一: 修改 composer 的全局配置文件(推荐方式)

  • 打开命令行窗口(windows用户)或控制台(Linux,Mac 用户)并执行如下命令:
composer config -g repo.packagist composer https://packagist.phpcomposer.com
#或者使用阿里云的镜像
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

方法二: 修改当前项目的 composer.json 配置文件

  • 打开命令行窗口(windows用户)或控制台(Linux,Mac 用户),进入你的项目的根目录(也就是 composer.json 文件所在目录),执行如下命令
composer config repo.packagist composer https://packagist.phpcomposer.com
#或者使用阿里云的镜像
composer config repo.packagist composer https://mirrors.aliyun.com/composer/
  • 上述命令将会在当前项目中的 composer.json 文件的末尾自动添加镜像的配置信息(你也可以自己手工添加)
"repositories": {
    "packagist": {
        "type": "composer",
        "url": "https://packagist.phpcomposer.com"
    }
}

以 laravel 项目的 composer.json 配置文件为例,执行上述命令后如下所示(注意最后几行)

{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.5.9",
        "laravel/framework": "5.2.*"
    },
    "config": {
        "preferred-install": "dist"
    },
    "repositories": {
        "packagist": {
            "type": "composer",
            "url": "https://packagist.phpcomposer.com"
        }
    }
}
  • OK,一切搞定!试一下 composer install 来体验飞一般的速度吧!

镜像原理

  • 一般情况下,安装包的数据(主要是 zip 文件)一般是从 github.com 上下载的,安装包的元数据是从 packagist.org 上下载的.
  • 然而,由于众所周知的原因,国外的网站连接速度很慢,并且随时可能被"墙"甚至"不存在".
  • "Packagist 中国全量镜像"所做的就是缓存所有安装包和元数据到国内的机房并通过国内的 CDN 进行加速,这样就不必再去向国外的网站发起请求,从而达到加速 composer install 以及 composer update 的过程,并且更加快速,稳定.因此,即使 packagist.org,github.com 发生故障(主要是连接速度太慢和被墙),你仍然可以下载,更新安装包.

解除镜像

  • 如果需要解除镜像并恢复到 packagist 官方源,请执行以下命令
composer config -g --unset repos.packagist
  • 执行之后,composer 会利用默认值(也就是官方源)重置源地址.将来如果还需要使用镜像的话,只需要根据前面的"镜像用法"中介绍的方法再次设置镜像地址即可.

tp5安装es插件并使用

  • 在tp5目录下执行该命令安装es插件
composer require elasticsearch/elasticsearch
  • 会安装在vendor目录下
  • 以下是官方的一些使用样例整合
<?php
namespace app\index\controller;
require '../vendor/autoload.php';
use Elasticsearch\ClientBuilder;
class Search
{
    private $client;
    // 构造函数
    public function __construct()
    {
        $params = array(
            '127.0.0.1:9200'
        );
        $this->client = ClientBuilder::create()->setHosts($params)->build();
    }

    // 创建索引
    public function index() { // 只能创建一次

        $r = $this->delete_index();

        $r = $this->create_index();  //1.创建索引

        $r = $this->create_mappings(); //2.创建文档模板


        $r = $this->get_mapping();


        $docs = [];
        $docs[] = ['id'=>1,'name'=>'小明','profile'=>'我做的ui界面强无敌。','age'=>23];
        $docs[] = ['id'=>2,'name'=>'小张','profile'=>'我的php代码无懈可击。','age'=>24];
        $docs[] = ['id'=>3,'name'=>'小王','profile'=>'C的生活,快乐每一天。','age'=>29];
        $docs[] = ['id'=>4,'name'=>'小赵','profile'=>'就没有我做不出的前端页面。','age'=>26];
        $docs[] = ['id'=>5,'name'=>'小吴','profile'=>'php是最好的语言。','job'=>21];
        $docs[] = ['id'=>6,'name'=>'小翁','profile'=>'别烦我,我正在敲bug呢!','age'=>25];
        $docs[] = ['id'=>7,'name'=>'小杨','profile'=>'为所欲为,不行就删库跑路','age'=>27];

        foreach ($docs as $k => $v) {
            $r = $this->add_doc($v['id'],$v);   //3.添加文档
        }

        $r = $this->search_doc("删库 别烦我");  //4.搜索结果
    }

    // 创建索引
    public function create_index($index_name = 'test_ik') { // 只能创建一次
        $params = [
            'index' => $index_name,
            'body' => [
                'settings' => [
                    'number_of_shards' => 5,
                    'number_of_replicas' => 0
                ]
            ]
        ];

        try {
            return $this->client->indices()->create($params);
        } catch (Elasticsearch\Common\Exceptions\BadRequest400Exception $e) {
            $msg = $e->getMessage();
            $msg = json_decode($msg,true);
            return $msg;
        }
    }

    // 删除索引
    public function delete_index($index_name = 'test_ik') {
        $params = ['index' => $index_name];
        $response = $this->client->indices()->delete($params);
        return $response;
    }

    // 创建文档模板
    public function create_mappings($type_name = 'users',$index_name = 'test_ik') {

        $params = [
            'index' => $index_name,
            'type' => $type_name,
            'body' => [
                $type_name => [
                    '_source' => [
                        'enabled' => true
                    ],
                    'properties' => [
                        'id' => [
                            'type' => 'integer', // 整型
                            'index' => 'not_analyzed',
                        ],
                        'name' => [
                            'type' => 'string', // 字符串型
                            'index' => 'analyzed', // 全文搜索
                            'analyzer' => 'ik_max_word'
                        ],
                        'profile' => [
                            'type' => 'string',
                            'index' => 'analyzed',
                            'analyzer' => 'ik_max_word'
                        ],
                        'age' => [
                            'type' => 'integer',
                        ],
                    ]
                ]
            ]
        ];

        $response = $this->client->indices()->putMapping($params);
        return $response;
    }

    // 查看映射
    public function get_mapping($type_name = 'users',$index_name = 'test_ik') {
        $params = [
            'index' => $index_name,
            'type' => $type_name
        ];
        $response = $this->client->indices()->getMapping($params);
        return $response;
    }

    // 添加文档
    public function add_doc($id,$doc,$index_name = 'test_ik',$type_name = 'users') {
        $params = [
            'index' => $index_name,
            'type' => $type_name,
            'id' => $id,
            'body' => $doc
        ];

        $response = $this->client->index($params);
        return $response;
    }

    // 判断文档存在
    public function exists_doc($id = 1,$index_name = 'test_ik',$type_name = 'users') {
        $params = [
            'index' => $index_name,
            'type' => $type_name,
            'id' => $id
        ];

        $response = $this->client->exists($params);
        return $response;
    }


    // 获取文档
    public function get_doc($id = 1,$index_name = 'test_ik',$type_name = 'users') {
        $params = [
            'index' => $index_name,
            'type' => $type_name,
            'id' => $id
        ];

        $response = $this->client->get($params);
        return $response;
    }

    // 更新文档
    public function update_doc($id = 1,$index_name = 'test_ik',$type_name = 'users') {
        // 可以灵活添加新字段,最好不要乱添加
        $params = [
            'index' => $index_name,
            'type' => $type_name,
            'id' => $id,
            'body' => [
                'doc' => [
                    'name' => '大王'
                ]
            ]
        ];

        $response = $this->client->update($params);
        return $response;
    }

    // 删除文档
    public function delete_doc($id = 1,$index_name = 'test_ik',$type_name = 'users') {
        $params = [
            'index' => $index_name,
            'type' => $type_name,
            'id' => $id
        ];

        $response = $this->client->delete($params);
        return $response;
    }

    // 查询文档 (分页,排序,权重,过滤)
    public function search_doc($keywords = "运维",$index_name = "test_ik",$type_name = "users",$from = 0,$size = 2) {
        $params = [
            'index' => $index_name,
            'type' => $type_name,
            'body' => [
                'query' => [
                    'bool' => [
                        'should' => [
                            [ 'match' => [ 'profile' => [
                                'query' => $keywords,
                                'boost' => 3, // 权重大
                            ]]],
                            [ 'match' => [ 'name' => [
                                'query' => $keywords,
                                'boost' => 2,
                            ]]],
                        ],
                    ],
                ],
                'sort' => ['age'=>['order'=>'desc']]
                , 'from' => $from, 'size' => $size
            ]
        ];

        $results = $this->client->search($params);
        return $results;
    }

}