安装和使用composer

安装和使用composer

安装

mac电脑,以php7.2为例。

在 Mac 上使用 PHP 7.2 安装 Composer 的步骤如下:

步骤 1:确保 PHP 7.2 可用

  1. 打开终端,运行以下命令以检查 PHP 版本: php -v 如果 PHP 版本是 7.2,则继续。如果不是,可以通过以下方式安装并设置 PHP 7.2:
    • 使用 brew 安装 PHP 7.2: brew install php@7.2
    • 将 PHP 7.2 添加到路径中(如果需要): echo 'export PATH="/usr/local/opt/php@7.2/bin:$PATH"' >> ~/.zshrc source ~/.zshrc
    • 再次运行 php -v 确保 PHP 7.2 可用。

步骤 2:下载 Composer 安装程序

在终端中执行以下命令:

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

步骤 3:验证安装脚本的完整性

  1. 获取安装脚本的哈希值: php -r "echo hash_file('SHA384', 'composer-setup.php') . PHP_EOL;"
  2. Composer 官方页面 查看最新的 SHA384 校验和,并确保与上述命令输出匹配。

步骤 4:运行安装程序

如果校验值匹配,则运行以下命令安装 Composer:

php composer-setup.php --install-dir=/usr/local/bin --filename=composer

步骤 5:验证安装

完成后,验证 Composer 是否安装成功:

composer --version

如果显示 Composer 的版本信息,则说明安装成功。


注意事项

  1. 如果 Composer 提示与 PHP 版本或扩展相关的问题,请确保 PHP 7.2 的相关扩展已安装并启用,例如 openssljson
  2. 若需要切换不同的 PHP 版本,可以考虑使用工具如 Laravel Valetbrew-php-switcher 进行版本切换。

composer本身

Composer 本身是用 PHP 开发的。它是一个为 PHP 应用程序提供依赖管理功能的工具,因此其代码也是用 PHP 编写的,以便能够直接运行在 PHP 环境中。

关键点:

  1. 开发语言
    • Composer 的源代码完全用 PHP 编写。
    • 它通过解析 composer.json 文件,来管理项目中的依赖关系和版本约束。
  2. 运行环境
    • Composer 依赖 PHP 环境才能运行。
    • 通常需要一个支持 cURLopenssl 的 PHP 安装,因为它需要下载依赖包和与远程仓库通信(例如 Packagist)。
  3. 核心功能实现
    • Composer 通过 PHP 实现了以下功能:
      • 读取和解析 composer.json 文件。
      • 与远程包管理器(如 Packagist)交互。
      • 自动处理依赖关系及其版本约束。
      • 下载并安装库到指定目录。
  4. 开源项目
    • Composer 是开源的,其源代码托管在 GitHub:Composer Repository
    • 如果你对其实现感兴趣,可以查看代码,学习其设计和实现细节。

示例:Composer 的 PHP 文件

composer 命令实际上是调用了一个 PHP 文件,如:

#!/usr/bin/env php
<?php
// Composer 的入口文件
require __DIR__ . '/vendor/autoload.php';

use Composer\Console\Application;

$application = new Application();
$application->run();

Composer 实际上运行的就是 PHP 脚本。

用引入日志类库举例

使用 Composer 初始化和引入 Monolog 的步骤

1. 初始化 Composer 项目

在项目目录下运行以下命令来初始化 Composer:

composer init

这个命令会引导完成以下步骤:

  1. 设置项目的名称(例如 myproject)。
  2. 设置描述、作者信息。
  3. 选择项目的最小 PHP 版本。
  4. 添加依赖项(你可以稍后通过 composer require 添加)。

完成后,它会生成一个 composer.json 文件。


2. 安装 Monolog

运行以下命令安装 Monolog:

composer require monolog/monolog

3. 版本适配

Composer 会自动根据当前的 PHP 版本(例如 PHP 7.2)和依赖库的版本约束,选择最适合的 Monolog 版本。这是因为:

  1. 每个库的 composer.json 文件中定义了其依赖的 PHP 版本范围。
    • 例如,Monolog 的 composer.json 中可能包含: "require": { "php": ">=7.2" }
  2. 如果当前 PHP 版本不满足某个库的要求,Composer 会找到最新的满足要求的版本。

4. 检查安装的 Monolog 版本

安装完成后,你可以运行以下命令查看具体安装的版本:

composer show monolog/monolog

输出示例:

name     : monolog/monolog
descrip. : Sends your logs to files, sockets, inboxes, databases and various web services
keywords : logging, psr-3
version  : 2.3.5
...

5. 加载 Autoloader 并使用 Monolog

Composer 安装完成后会生成一个 vendor 目录和 vendor/autoload.php 文件。需要在项目代码中加载 autoload.php 才能使用 Monolog。

示例代码:

<?php

require 'vendor/autoload.php';

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

// 创建日志实例
$log = new Logger('my-app');

// 添加日志处理器(输出到文件)
$log->pushHandler(new StreamHandler('app.log', Logger::WARNING));

// 写入日志
$log->warning('这是一个警告日志');
$log->error('这是一个错误日志');

6. 调整版本(如需特定版本)

如果需要安装特定版本(例如 Monolog 的 1.x 版本),可以指定版本号:

composer require monolog/monolog:^1.0

^1.0 表示安装 1.x 版本中最新的一个。


总结

  • Composer 会根据 PHP 版本自动选择兼容的依赖版本。
  • 如果有特殊需求,可以手动指定版本。
  • 使用 composer show 查看依赖详细信息,确保兼容性无误。

composer init

在执行composer init命令的时候,会有一些提示,这里是一些例子。

Minimum Stability

在执行 composer init 时,Minimum Stability 是一个可选配置项,它用于指定项目所允许的最小稳定性级别。稳定性级别决定了 Composer 在安装依赖时,是否可以接受不稳定的版本(例如 beta、alpha 或 dev 版本)。如果没有指定,Composer 默认是 stable

可能的稳定性选项:

  1. stable: 仅允许稳定的版本(最常见的选择)。它意味着只有已经发布的正式版本(例如 1.0.0)才会被安装。
  2. RC (Release Candidate): 允许发布候选版本。这是开发人员认为接近稳定,但可能还需要一些修复的版本(例如 1.0.0-RC1)。
  3. beta: 允许 beta 版本。通常是开发中的版本,可能存在较多的 bug(例如 1.0.0-beta)。
  4. alpha: 允许 alpha 版本。非常早期的版本,通常不稳定,包含大量未完成的功能(例如 1.0.0-alpha)。
  5. dev: 允许开发版本。这个版本是开发中最新的代码(例如 dev-master)。通常不适合生产环境。

如何选择:

  • 如果不希望使用不稳定版本,或者项目较为成熟,可以选择 stableMinimum Stability [stable]:
  • 如果愿意接受较新的不稳定版本(比如 beta 或 RC),可以选择更低的稳定性级别: Minimum Stability [beta]:
  • 如果需要依赖于开发中的代码,例如一些库仍在活跃开发中,可以选择 devMinimum Stability [dev]:

一般情况下:

  • 对于大多数常见的项目(尤其是生产环境中的项目),stable 是最合适的选择,它确保你只会安装稳定版本的依赖。
  • 如果你正在开发一个早期项目,或者需要依赖一些处于 beta 或 alpha 阶段的库,可以考虑使用 betaalpha

示例:

如果选择 stable,直接按回车即可。比如:

Minimum Stability [stable]: 

如果想允许 beta 版本:

Minimum Stability [stable]: beta

如果不确定,可以直接选择默认值 stable,它是最安全的选择。

Licence

如果项目是 公司内部项目,并且 不打算公开,可以在 License 字段中选择 一个合适的非开源许可证,或者直接标记为 proprietary(专有的)。

选项:

  1. proprietary(专有许可证):
    • 这是最常见的选择,用于没有开放源代码或未授权发布的私有项目。大多数公司内部项目都使用这个标识。
    • License 字段中填写: License [MIT]: proprietary
  2. 其他许可证
    • 如果希望使用某种特定的非开源许可证(例如,公司自定义的许可证),可以直接填写该许可证名称。
    • 示例: License [MIT]: Company-Internal-License
  3. MIT 许可证(仅供参考):
    • 如果愿意公开部分代码,或者以后可能开源,MIT 也是一个常见选择,它是非常宽松的开源许可证,但这适用于开源项目。
    • License 字段中填写: License [MIT]: MIT

注意:

对于 公司内部项目,最合适的选择是填写 proprietary,它表明这个项目是专有的,不公开源代码。

require

可能会看到这个提示「Would you like to define your dependencies (require) interactively [yes]?」

这个提示是让你决定是否在初始化过程中交互式地定义你的项目依赖(即 require)项。你可以选择 ,根据你的需求来决定。

选项解释:

  1. 选择 “yes”(是):
    • 如果你选择 “yes”,Composer 会提示你逐个选择和添加项目的依赖库(例如 Monolog、Guzzle 等)。
    • 它会询问你要安装的包的名称和版本,并根据你的回答更新 composer.json 文件。
  2. 选择 “no”(否):
    • 如果你选择 “no”,Composer 不会在初始化时让你定义任何依赖。你可以稍后手动添加依赖,或者通过运行 composer require 来添加。
    • composer.json 文件会保持为空,你可以自己决定何时和如何添加依赖。

如果你选择 “yes”:

在交互模式下,Composer 会引导你输入所需的依赖包和版本。举个例子:

  • 当你想要添加 Monolog 时,Composer 会提示你: Would you like to define your dependencies (require) interactively [yes]? Enter package name (or press Enter to skip): monolog/monolog
  • 然后它会询问你是否需要选择版本: Enter the version constraint (or press Enter to use the latest stable version):

如果你选择 “no”:

你仍然可以通过以下命令稍后手动添加依赖:

composer require monolog/monolog

总结:

  • 选择 “yes” 如果你希望在初始化时就交互式地添加依赖。
  • 选择 “no” 如果你想在初始化完成后再手动添加依赖。

大多数时候,如果你已经知道需要哪些依赖,选择 “no” 并在之后手动添加依赖会更加灵活。如果你不确定,可以选择 “yes”,让 Composer 帮助你一步步添加所需的包。

一个简单的例子

以下是满足你需求的 PHP 代码示例,使用 Monolog 来记录日志,并确保每个请求的日志包含 Trace-Id,记录到文件中,并且格式化为 JSON,符合指定的时间格式。

完整示例代码

<?php

require 'vendor/autoload.php'; // 加载 Composer 自动加载文件

use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Formatter\JsonFormatter;

// 初始化日志函数
function initLogger(): Logger {
    // 创建日志实例
    $logger = new Logger('app');

    // 创建文件日志处理器
    $streamHandler = new StreamHandler(__DIR__ . '/app.log', Logger::DEBUG);

    // 配置 JSON 格式化日志
    $formatter = new JsonFormatter();
    $formatter->includeStacktraces(); // 包含堆栈信息(可选)
    $streamHandler->setFormatter($formatter);

    // 将处理器添加到日志实例
    $logger->pushHandler($streamHandler);

    return $logger;
}

// 获取请求头中的 Trace-Id
function getTraceIdFromHeaders(): ?string {
    // 获取所有请求头
    $headers = getallheaders(); // 适用于 Apache/NGINX 环境
    return $headers['Trace-Id'] ?? null; // 返回 Trace-Id,如果不存在返回 null
}

// 初始化日志
$logger = initLogger();

// 获取 Trace-Id
$traceId = getTraceIdFromHeaders();

// 在每条日志中附带 Trace-Id 信息
if ($traceId) {
    $logger->pushProcessor(function ($record) use ($traceId) {
        $record['extra']['Trace-Id'] = $traceId;
        return $record;
    });
}

// 示例:写入日志
$logger->info('Request received', ['endpoint' => '/api/example']);
$logger->warning('Something might be wrong');
$logger->error('An error occurred', ['details' => 'Invalid input']);

代码说明

  1. 日志初始化
    • 使用 Logger 创建日志实例。
    • 配置 StreamHandler 将日志写入 app.log 文件。
    • 使用 JsonFormatter 格式化日志为 JSON 格式。
  2. 附带 Trace-Id
    • 使用 getallheaders() 函数提取 HTTP 请求头中的 Trace-Id 值。
    • 使用 pushProcessorTrace-Id 添加到每条日志的 extra 字段中。
  3. 日志时间格式
    • JsonFormatter 默认会记录 ISO8601 格式的时间戳。
    • 如果需要更改时间戳格式,可以自定义日志记录中的时间格式(扩展自 JsonFormatter,见后文)。
  4. 日志内容格式
    • 日志内容为 JSON 格式,每条日志记录将包括 Trace-Id 和日志内容。
    • 日志示例: { "message": "Request received", "context": {"endpoint": "/api/example"}, "level": 200, "level_name": "INFO", "channel": "app", "datetime": "2023-01-29T17:29:30.588233+00:00", "extra": {"Trace-Id": "12345-abcd"} }

可选改进:自定义时间格式

如果需要精确到微秒的特定时间格式(2023-01-29 17:29:30.588233),可以扩展 JsonFormatter

use Monolog\Formatter\JsonFormatter;

class CustomJsonFormatter extends JsonFormatter {
    protected function formatDate(\DateTimeInterface $date): string {
        return $date->format('Y-m-d H:i:s.u');
    }
}

// 使用自定义格式化器
$formatter = new CustomJsonFormatter();
$streamHandler->setFormatter($formatter);

这样会使日志的时间字段符合 2023-01-29 17:29:30.588233 的格式。


日志文件路径

日志文件默认写在当前目录下的 app.log 文件中。如果需要更改路径,可以在 StreamHandler 中指定其他路径:

$streamHandler = new StreamHandler('/var/log/myapp/app.log', Logger::DEBUG);

发表回复