使用 Composer 时的 PHP 部署最佳实践
概述
Composer 是 PHP 应用程序事实上的依赖管理器,最初于 2012 年 3 月发布,距今已有 8 年。
在 PHP 中使用 Composer 可以提高代码的可重用性,并使您的项目能够轻松集成来自Packagist(PHP Composer 主仓库)的 PHP 库。今天我们将重点介绍一些部署最佳实践。
Composer 可能会变慢
这篇文章将重点介绍如何使 Composer 运行得更快,并且无需在每次部署应用程序时安装新的 Composer 软件包。
Magento 是一个需要大量内存的 Composer 项目的例子。你能想象如果每次部署都需要安装 Composer,会需要多少内存吗?Composer 可能会因内存不足错误而失败,详情请见这篇Stack Overflow 文章。
虽然将包添加到您的项目很容易,但在 Amezmo 我们采取保守的方式添加新的项目依赖项,原因如下。
- 减慢初始 Composer 的安装速度
- 每个 Composer 软件包都会增加出现新安全问题的可能性
最佳实践
这个很简单。检查一下我们的 composer.json 文件,当然,删除所有不需要的包引用。
第二个,也是我发表这篇文章的原因是为了确保您使用以下标志运行作曲家。
composer \
--no-ansi \
--no-interaction \
--optimize-autoloader \
--no-progress \
--no-dev \
--profile \
install
此命令记录在 Amezmo 关于使用部署钩子安装 Composer 软件包的文档中。让我们逐一介绍这些标志
--no-ansi
此标志禁用 ANSI 输出,这意味着将禁用彩色输出。彩色输出指的是使用绿色和红色字体以及令人赏心悦目的背景颜色。这对于手动运行 Composer 非常有用,但对于自动化部署,我们不希望日志文件中充斥着奇怪的字符。
--无交互
再次强调,在自动化部署中,我们不希望部署因等待用户输入而停滞。此标志可防止 Composer 请求用户输入。
--优化自动加载器
此标志指示 Composer自动执行生成的自动加载器代码。当您的入口点确实需要“vendor/autoload.php”时,就会调用自动加载器;
--无进展
由于进度报告使用特殊的终端 ANSI 代码,我们不想报告进度,因为这会使我们的日志文件变得混乱。在进行非交互式部署和 Composer 安装时,这完全没有必要。
--no-dev
这一点至关重要。我们永远不想把开发包安装到生产服务器上。像 phpunit 这样的包,以及其他不应该在生产环境中使用的包,都被视为“dev”包。它们在 composer.json 文件的“require-dev”属性下有一个特殊的条目。
- 轮廓
这个是可选的,但我总是喜欢把它包括在内,因为它显示了 Composer 用来安装单个依赖项的内存量。
如何在部署时缓存 Composer 包
现在我们已经定义了生产级 composer install 命令,让我们通过一种简单的方法让 Composer 在部署时更快。
步骤 1.
在完全位于您的 webroot 之外的某个地方创建一个全局 Composer 供应商目录,当然该目录是不可公开访问的。
注意:Amezmo 使用如下所示的根目录布局,因此我们将在下面的 bash 命令中使用它。当然,您可以用自己的目录替换这些目录,这样也能达到预期的效果。
/webroot
|----logs
|----vendor
|----storage
|----current -> /webroot/release/${TIMESTAMP}.${COMMIT_ID}
|----release
|-------${TIMESTAMP}.${COMMIT_ID}
|-------${TIMESTAMP}.${COMMIT_ID
/webroot/vendor
是我们全球范围的软件包目录,每个版本都会从中创建一个链接。
运行以下命令,创建从发布目录到全局 vendor 目录的链接 vendor 目录。每次部署时都必须执行此操作,并且在从发布目录运行 composer install 之前执行此操作。
ln -sT /webroot/vendor webroot/release/${TIMESTAMP}.${COMMIT_ID}/vendor
请注意,在从发布目录运行 composer install 之前,务必先运行上述命令。具体步骤如下:
- 应该创建发布目录
- 运行 Git 获取源代码
- 执行上述命令,
- 最后运行 composer install
按照上述顺序完成所有操作后,您的软件包将被“缓存”到/webroot/vendor
目录中,并且您不需要在每次部署应用程序时重新安装软件包。
结论
- 定义了一个 Composer 命令来消除任何不必要的功能。
- 强调了在部署时缓存 Composer 包的最佳实践部署模式
Amezmo 的使命是消除PHP安全托管和部署的障碍,并为像我这样的 PHP 开发者提供最佳平台。如果您喜欢这篇文章,请将您的代码托管在我们这里,以支持我们的平台。
鏂囩珷鏉ユ簮锛�https://dev.to/ryan1/php-deployment-best-practices-when-using-composer-92j