在 Ubuntu 系统上安装和使用 Composer 的完整指南

本教程详细介绍了在 Ubuntu 系统上安装 PHP 依赖管理工具 Composer 的步骤。内容涵盖从安装 PHP 和必要依赖、验证并全局安装 Composer,到在 PHP 项目中使用 Composer 管理依赖、使用自动加载以及更新项目的全过程。

如何在 Ubuntu 上安装和使用 Composer

关键要点

  • Composer 自动化处理 PHP 依赖管理,包括库的安装、版本控制和更新,从而省去手动管理包的工作。
  • 全局安装允许从任何目录系统范围内访问 Composer 命令,而本地安装则提供项目特定的控制和版本隔离。
  • 下载 Composer 安装程序时进行哈希验证对于安全至关重要,可防止安装脚本被篡改或损坏。
  • composer.lock 文件通过锁定开发、预发布和生产环境中确切的依赖版本,确保了一致性。
  • Composer 是现代 PHP 开发的标准工具,可无缝集成到 Laravel 和 Symfony 等框架中,并得到 Packagist 上超过 400,000 个包的支持。

前提条件

要遵循本指南,您需要具备以下条件:访问一台 Ubuntu 服务器(20.04 LTS、22.04 LTS 或 24.04 LTS)作为非 root sudo 用户,并且在服务器上启用了防火墙。

步骤 1 — 安装 PHP 和其他依赖项

除了 Ubuntu 系统应已包含的依赖项(如 gitcurl)之外,Composer 还需要 php-cli 来在命令行执行 PHP 脚本,以及 unzip 来解压缩归档文件。

首先,更新包管理器缓存:

1
sudo apt update

接下来,运行以下命令安装所需包:

1
sudo apt install php-cli unzip

系统将提示您输入 Y 然后按 ENTER 键确认安装。 安装完先决条件后,即可继续安装 Composer。

步骤 2 — 下载并安装 Composer

Composer 提供了一个用 PHP 编写的安装程序脚本。我们将下载它,验证它是否损坏,然后用它来安装 Composer。

确保您在主目录中,然后使用 curl 获取安装程序:

1
2
cd
curl -sS https://getcomposer.org/installer -o /tmp/composer-setup.php

接下来,我们将验证下载的安装程序是否与 Composer 公钥/签名页面上最新安装程序的 SHA-384 哈希值匹配。为方便验证,您可以使用以下命令以编程方式从 Composer 页面获取最新哈希值并将其存储在 shell 变量中:

1
HASH=`curl -sS https://composer.github.io/installer.sig`

如果您想验证获取的值,可以运行:

1
echo $HASH

现在执行以下 PHP 代码(如 Composer 下载页面所提供),以验证安装脚本是否可以安全运行:

1
php -r "if (hash_file('SHA384', '/tmp/composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

您将看到以下输出:

1
Installer verified

如果输出显示 Installer corrupt,则需要重新下载安装脚本,并仔细检查您使用的哈希值是否正确。然后,重复验证过程。当您拥有经过验证的安装程序后,即可继续。

要全局安装 composer,请使用以下命令,该命令将下载 Composer 并将其作为名为 composer 的系统级命令安装到 /usr/local/bin

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

您将看到类似于以下的输出:

1
2
3
4
5
All settings correct for using Composer
Downloading...

Composer (version 2.2.9) successfully installed to: /usr/local/bin/composer
Use it: php /usr/local/bin/composer

要测试您的安装,请运行:

1
composer

这将验证 Composer 是否已成功安装在您的系统上并可在系统范围内使用。

注意:如果您希望为此服务器上托管的每个项目使用单独的 Composer 可执行文件,可以按项目在本地安装。当您的系统用户没有在系统范围内安装软件的权限时,此方法也很有用。

为此,请使用命令 php /tmp/composer-setup.php。这将在您当前目录中生成一个 composer.phar 文件,该文件可通过 php composer.phar 执行。本地安装对于跨项目维护不同的 Composer 版本或在受限环境中工作时特别有用。

现在让我们看看如何使用 Composer 来管理依赖项。

步骤 3 — 在 PHP 项目中使用 Composer

PHP 项目通常依赖于外部库,管理这些依赖项及其版本可能很棘手。Composer 通过跟踪项目版本和依赖项来解决这个问题,同时还简化了查找、安装和更新项目所需包的过程。

为了在项目中使用 Composer,您需要一个 composer.json 文件。composer.json 文件告诉 Composer 需要为您的项目下载哪些依赖项,以及允许安装每个包的哪些版本。这对于保持项目一致性并避免安装可能导致向后兼容性问题的非稳定版本至关重要。

您不需要手动创建此文件 - 手动操作时经常会出现语法错误。如果您计划稍后在 Packagist 上将您的项目作为公共包共享,Composer 提供了一种基于用户输入创建新 composer.json 文件的交互方式,这是一个不错的选择。当您运行 composer require 命令将依赖项包含在新创建的项目中时,Composer 也会自动生成一个基本的 composer.json 文件。

使用 Composer 在项目中安装包作为依赖项的过程包括以下步骤:

  1. 确定应用程序需要什么类型的库。
  2. 在 Composer 的官方包仓库 Packagist.org 上研究合适的开源库。
  3. 选择您想要依赖的包。
  4. 运行 composer require 将依赖项包含在 composer.json 文件中并安装该包。

让我们用一个演示应用程序来试试。 这个应用程序的目标是将给定的句子转换成一个对 URL 友好的字符串 - 即 slug。这通常用于将页面标题转换为 URL 路径(就像本教程 URL 的最后部分一样)。

首先为我们的项目创建一个目录。我们称之为 slugify

1
2
3
cd ~
mkdir slugify
cd slugify

虽然不要求,但您现在可以运行 composer init 命令为您的项目创建一个详细的 composer.json 文件。由于我们项目的唯一目标是演示如何使用 Composer 安装依赖项,因此我们将使用一个更简单的 composer.json 文件,该文件将在我们需要第一个包时自动生成。

现在是时候在 Packagist.org 上搜索可以帮助我们生成 slug 的包了。如果您在 Packagist 上搜索术语 “slug”,您会得到类似这样的结果:

您会在列表中每个包的右侧看到两个数字。顶部的数字表示该包通过 Composer 安装了多少次,底部的数字显示该包在 GitHub 上获得了多少星标。一般来说,安装次数更多、星标更多的包往往更稳定,因为有更多人使用它们。同样重要的是检查包描述的相关性,以确保它是您需要的。

我们需要一个字符串转 slug 的转换器。从搜索结果来看,出现在该页面第一个结果的 cocur/slugify 包似乎是一个不错的选择,拥有合理的安装次数和星标数量。

Packagist 上的包有一个供应商名称和一个包名称。每个包都有一个唯一的标识符(命名空间),其格式与 GitHub 用于其仓库的格式相同:vendor/package。我们要安装的库使用命名空间 cocur/slugify。您需要在项目中要求一个包的命名空间。

现在您确切知道要安装哪个包后,可以运行 composer require 将其作为依赖项包含进来,并为您的项目生成 composer.json 文件。需要注意的一点是,Composer 既跟踪应用程序级依赖项,也跟踪系统级依赖项。系统级依赖项对于指示包依赖于哪些 PHP 模块非常重要。对于 cocur/slugify 包,它需要一个我们尚未安装的 PHP 模块。

当所需的包依赖于您的服务器上当前未安装的系统库时,您将收到一个错误,告知缺少哪些要求:

1
composer require cocur/slugify

输出示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Using version ^4.0 for cocur/slugify
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Installation request for cocur/slugify ^4.0 -> satisfiable by cocur/slugify[v4.0.0].
    - cocur/slugify v4.0.0 requires ext-mbstring * -> the requested PHP extension mbstring is missing from your system.
...

要解决系统依赖项问题,我们可以使用 apt search 搜索缺少的包:

1
apt search mbstring

输出示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Sorting... Done
Full Text Search... Done
php-mbstring/jammy 2:8.1+92ubuntu1 all
  MBSTRING module for PHP [default]

php-patchwork-utf8/jammy 1.3.1-1 all
  UTF-8 strings handling for PHP

php8.1-mbstring/jammy 8.1.2-1ubuntu2.14 amd64
  MBSTRING module for PHP

注意:上面显示的包名是 Ubuntu 22.04 的示例。在 Ubuntu 20.04 上,您会看到 php7.4-mbstring,在 Ubuntu 24.04 上,您会看到 php8.3-mbstring。通用的 php-mbstring 包会自动为您的 Ubuntu 版本安装正确的版本。

找到正确的包名后,您可以再次使用 apt 来安装系统依赖项:

1
sudo apt install php-mbstring

安装完成后,您可以再次运行 composer require 命令:

1
composer require cocur/slugify

输出示例

1
2
3
4
5
6
7
8
Using version ^4.0 for cocur/slugify
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing cocur/slugify (v4.0.0): Downloading (100%)         
Writing lock file
Generating autoload files

从输出中可以看出,Composer 自动决定了使用包的哪个版本。如果您现在检查项目的目录,它将包含两个新文件:composer.jsoncomposer.lock,以及一个 vendor 目录:

1
ls -l

输出示例

1
2
3
4
total 12
-rw-rw-r-- 1 sammy sammy   59 May  4 13:56 composer.json
-rw-rw-r-- 1 sammy sammy 3229 May  4 13:56 composer.lock
drwxrwxr-x 4 sammy sammy 4096 May  4 13:56 vendor

composer.lock 文件用于存储有关每个包安装了哪些版本的信息,并确保如果其他人克隆您的项目并安装其依赖项,则使用相同的版本。该文件锁定所有依赖项及其子依赖项的确切版本,在不同环境和团队成员之间提供一致性。vendor 目录是项目依赖项所在的位置。vendor 文件夹不应提交到版本控制中 - 您只需要包含 composer.jsoncomposer.lock 文件。当其他人克隆您的项目时,他们可以运行 composer install 来基于锁文件重新创建确切的依赖关系树。

当安装一个已经包含 composer.json 文件的项目时,请运行 composer install 以下载项目的依赖项。

让我们快速浏览一下版本约束。如果您检查 composer.json 文件的内容,您会看到类似这样的内容:

1
cat composer.json

输出示例

1
2
3
4
5
{
    "require": {
        "cocur/slugify": "^4.0"
    }
}

您可能会注意到 composer.json 文件中版本号前的特殊字符 ^。Composer 支持几种不同的约束和格式来定义所需的包版本,以便在保持项目稳定的同时提供灵活性。自动生成的 composer.json 文件使用的插入符号 (^) 运算符是遵循语义版本控制以实现最大互操作性的推荐运算符。在这种情况下,它将 4.0 定义为最小兼容版本,并允许更新到 5.0 以下的任何未来版本。

一般来说,您不需要修改 composer.json 文件中的版本约束。但是,某些情况可能需要您手动编辑约束,例如,当您所需的库发布了重要的新版本并且您想要升级时,或者当您想要使用的库不遵循语义版本控制时。

以下是一些示例,让您更好地理解 Composer 版本约束的工作原理:

约束 含义 允许的示例版本
^1.0 >= 1.0 < 2.0 1.0, 1.2.3, 1.9.9
^1.1.0 >= 1.1.0 < 2.0 1.1.0, 1.5.6, 1.9.9
~1.0 >= 1.0 < 2.0.0 1.0, 1.4.1, 1.9.9
~1.0.0 >= 1.0.0 < 1.1 1.0.0, 1.0.4, 1.0.9
1.2.1 1.2.1 1.2.1
1.* >= 1.0 < 2.0 1.0.0, 1.4.5, 1.9.9
1.2.* >= 1.2 < 1.3 1.2.0, 1.2.3, 1.2.9

有关 Composer 版本约束的更深入介绍,请参阅官方文档。

接下来,让我们看看如何使用 Composer 自动加载依赖项。

步骤 4 — 包含自动加载脚本

由于 PHP 本身不会自动加载类,因此 Composer 提供了一个自动加载脚本,您可以将其包含在项目中以实现自动加载。当您添加第一个依赖项时,此文件由 Composer 自动生成。

您唯一需要做的就是在 PHP 脚本中的任何类实例化之前包含 vendor/autoload.php 文件。

让我们在演示应用程序中试一试。在文本编辑器中打开一个名为 test.php 的新文件:

1
nano test.php

添加以下代码,该代码引入 vendor/autoload.php 文件,加载 cocur/slugify 依赖项,并使用它创建 slug:

test.php

1
2
3
4
5
6
7
8
<?php
require __DIR__ . '/vendor/autoload.php';

use Cocur\Slugify\Slugify;

$slugify = new Slugify();

echo $slugify->slugify('Hello World, this is a long sentence and I need to make a slug from it!');

保存文件并退出编辑器。 现在运行脚本:

1
php test.php

这将产生输出 hello-world-this-is-a-long-sentence-and-i-need-to-make-a-slug-from-it

当新版本发布时,依赖项需要更新,接下来让我们看看如何处理。

步骤 5 — 更新项目依赖项

每当您想将项目依赖项更新到更新版本时,请运行 update 命令:

1
composer update

这将检查您在项目中所需的库是否有较新版本。如果找到较新版本并且它与 composer.json 文件中定义的版本约束兼容,Composer 将替换之前安装的版本。composer.lock 文件将更新以反映这些更改。

您还可以通过指定一个或多个特定库来更新它们,如下所示:

1
composer update vendor/package vendor2/package2

更新依赖项后,请务必将您的 composer.jsoncomposer.lock 文件签入版本控制系统,以便其他人也可以安装这些较新版本。

常见问题解答

  1. Composer 在 PHP 中用于什么? Composer 是 PHP 的依赖项管理器,可自动执行 PHP 项目所依赖的库和包的查找、安装和更新过程。Composer 读取列出项目需求的 composer.json 文件并自动处理所有事务,而无需手动下载和管理依赖项。这确保您获得正确的包版本及其依赖项,使 PHP 开发更高效、更可靠。

  2. 如何在 Ubuntu 上全局安装 Composer? 要在 Ubuntu 上全局安装 Composer,请下载安装程序脚本,使用 SHA-384 哈希验证其完整性,然后使用指向 /usr/local/bin--install-dir--filename 标志运行安装程序。这使得 Composer 作为 composer 命令在系统范围内可用。Ubuntu 20.04、22.04 和 24.04 上的安装过程完全相同。本教程的步骤 2 涵盖了详细步骤。

  3. 如何验证 Composer 安装程序是安全的? 您可以通过将其 SHA-384 哈希值与 Composer 公钥/签名页面上发布的官方哈希值进行比较来验证 Composer 安装程序的安全性。使用命令 php -r "if (hash_file('SHA384', '/tmp/composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; }",其中 $HASH 包含来自 Composer 官方页面的最新哈希值。此验证步骤对于安全至关重要,并在步骤 2 中进行了演示。

  4. 全局安装和本地安装 Composer 有什么区别? 全局安装将 Composer 放置在系统目录(如 /usr/local/bin)中,使其可以从系统上的任何目录访问。这对于管理多个项目很方便。本地安装在特定项目目录中创建一个 composer.phar 文件,当您没有系统范围安装权限或需要项目特定的 Composer 版本时,这很有用。您可以在项目目录中使用 php /tmp/composer-setup.php 运行本地安装。

  5. 如何将 Composer 更新到最新版本? 要将 Composer 更新到最新版本,请运行 composer self-update。此命令将下载并安装最新版本的 Composer,替换您当前的安装。对于全局安装,根据您的权限,您可能需要使用 sudo composer self-update

  6. 为什么 Composer 在 Ubuntu 上会出现内存限制错误? 当 Composer 尝试处理大型依赖关系树或您的 PHP 内存限制设置过低时,通常会发生内存限制错误。您可以通过为 Composer 命令临时增加 PHP 的内存限制来解决此问题,使用 php -d memory_limit=512M /usr/local/bin/composer install,或者编辑您的 php.ini 文件以增加 memory_limit 设置。对于大多数项目,512MB 或 1GB 应该足够了。

  7. 如何在 Ubuntu 上卸载 Composer? 要卸载全局安装的 Composer,只需删除可执行文件:sudo rm /usr/local/bin/composer。对于本地安装,请从项目目录中删除 composer.phar 文件。请注意,这不会删除项目中的 vendor 目录或 composer.json 文件,如果需要,您可以单独删除它们。

  8. 运行 Composer 需要 sudo 吗? 您不需要 sudo 来运行管理项目依赖项的 Composer 命令。但是,当全局安装或更新 Composer 本身时,您可能需要 sudo,因为这需要写入 /usr/local/bin 等系统目录。安装后,常规的 Composer 操作(如 composer installcomposer requirecomposer update)无需提升权限即可工作。

结论

Composer 是一个功能强大的工具,可以极大地促进 PHP 项目中依赖项的管理工作。它提供了一种可靠的方法来发现、安装和更新项目所依赖的 PHP 包。在本指南中,我们了解了如何安装 Composer、如何在项目中包含新的依赖项以及如何在新版本可用时更新这些依赖项。

后续步骤

现在您已经在 Ubuntu 系统上安装并配置了 Composer,您可以开始构建具有托管依赖项的 PHP 应用程序。以下是一些推荐的后续步骤:

  • 部署带有 Composer 的 PHP 应用程序:学习如何使用 DigitalOcean App Platform 部署基于 Composer 的项目,该平台会在部署期间自动检测并安装 Composer 依赖项。
  • 使用 Docker 设置 Laravel:如果您正在使用 Laravel,请探索我们关于如何在 Ubuntu 上安装和设置带 Docker Compose 的 Laravel 的指南,以便对您的开发环境进行容器化。
  • 学习 Docker Compose:要管理多容器应用程序,请查看我们关于如何在 Ubuntu 上安装和使用 Docker Compose 的教程。
  • 探索 PHP 开发:浏览我们的 PHP 教程集合,了解更多关于 PHP 开发最佳实践、框架设置和部署策略的信息。

准备好部署您的 PHP 应用程序了吗?立即开始使用 DigitalOcean App Platform,在几分钟内部署您基于 Composer 的项目,并享受自动依赖项管理和扩展功能。

其他资源

  • 快速参考:有关本指南的浓缩版本,请参阅我们在 Ubuntu 20.04 上安装 Composer 的快速入门指南。
  • Composer 教程:探索我们完整的 Composer 教程集合,了解更多高级使用模式和最佳实践。
  • Docker 集成:学习如何使用我们关于如何在 Ubuntu 20.04(或适用于您的 Ubuntu 版本的相应指南)上安装和使用 Docker Compose 的指南来容器化您的 PHP 应用程序。
  • PHP 开发:浏览我们全面的 PHP 教程集合,涵盖框架、部署策略和性能优化。
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计