如何部署 PHP 应用程序?

Back4app PHP 封面

本文将讨论 PHP,这是支持全球网络的最流行脚本语言之一。我们将探讨它的优点、缺点和部署选项。

本文结束时,你将能够引导一个简单的 PHP 应用程序,将其坞化并部署到Back4app Containers 中。

PHP 概述

PHP(”PHP: HyperText Processor “的缩写)是一种流行的免费通用脚本语言。它于 1993 年由 Rasmus Lerdorf 创建,后于 1995 年发布。

PHP 最初是为网页开发而设计的,但现在也用于服务器端脚本、命令行脚本和桌面应用程序的编写。

PHP 的最大优点是可以直接嵌入 HTML。无需使用冗长的命令来输出 HTML(如在 C 或 Perl 中所见)。下面是一个快速示例:

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>My first PHP website</title>
    </head>
    <body>
        <?php
            $cool_scripting_language = "PHP";
            echo "$cool_scripting_language is a cool scripting language!";
        ?>
    </body>
</html>

当用户请求访问该网站时,PHP 将被执行,并且只返回经过处理的 HTML 输出。在我们的例子中,返回的信息是 “PHP 是一种很酷的脚本语言!”。PHP 在服务器端执行,而不是在浏览器中执行(如 JavaScript)。

PHP 是否是一种完全面向对象的语言还有待商榷。不过它确实支持标准的面向对象特性,如命名空间、类和对象。

在撰写本文时,PHP 的最新稳定版本是 8.2,但许多 PHP 应用程序仍在使用旧版本。

一些开发人员声称 PHP 正在消亡,但事实并非如此。根据W3Techs 的调查,在所有已知服务器端编程语言的网站中,PHP 目前占 77.4%。

该脚本语言也被 Facebook、Wikipedia、Mailchimp 等高流量网站、各种 CMS 软件使用,甚至过去也被 YouTube 使用过。

PHP 的优势

性能良好

与其他服务器端脚本语言(如ASP.NETJSPPython)相比,PHP 的性能更高。一些基准测试表明,PHP 比 Python 快三倍。

PHP 最擅长处理与网络相关的任务,如生成 HTML 页面、处理表单提交和与数据库交互。

相反,对于繁重的计算任务或复杂的算法,有比 PHP 更优的选择。

跨平台

PHP 与平台无关。它可以在各种平台上运行,包括 Windows、Linux、Unix 和 Mac。此外,它还兼容几乎所有流行的网络服务器,如Apache HTTPCaddyNginxLiteSpeed 等。

由于 Czarek Tomczak 的phpdesktop,这种流行的脚本语言也可用于开发桌面应用程序。你可以把这个库想象成 PHP 的Electron。Phpdesktop 应用程序可以在 Windows 和 Linux 上运行,但不能在Mac OS X 上运行。

数据库支持

该脚本语言支持各种数据库,包括 SQL 和 NoSQL 数据库。最常用的 PHP 数据库是 MySQL(LAMP 堆栈),但也可以使用 PostgreSQL 或任何其他类型的数据库。

您可以在其官方网站上查看所有 PHP 抽象层和特定供应商的数据库扩展。

生机勃勃的生态系统

PHP 之所以如此流行,得益于其充满活力的生态系统。许多优秀的 PHP 框架大大加快了开发进程,简化了代码库,并指导您编写更简洁/更标准化的代码。

目前最流行的 PHP 框架有

如需了解更多出色的框架和资源,请访问 GitHub 上的awesome-php

还有很多使用 PHP 的内容管理系统,如WordPressJoomlaDrupalMagento

简单易学

PHP 是一种适合初学者的语言,语法简单。如果熟悉万维网 (WWW)、HTML、CSS 和 JavaScript 的基础知识,学习 PHP 就相对容易。许多开发人员都会编写 PHP,但只有少数人能编写出可维护的、遵循简洁代码规范的 PHP。

PHP 的局限性

有限的调试工具

与其他流行的编程语言相比,PHP 不善于处理错误,也缺乏调试工具。如果您的项目需要高级调试,您很可能需要使用第三方软件,如XdebugKrumoKint

一些流行的集成开发环境,如PhpStormVisual Studio,也有内置的 PHP 调试工具。

松散字体

如上所述,PHP 是一种脚本语言,而不是编程语言。脚本语言最常见的特点之一就是松散类型。

这意味着在使用变量之前,无需明确声明变量类型。此外,它还可以在运行时随时更改。

这导致 PHP 应用程序更容易出错,也更难调试。

安全漏洞

多年来,PHP 应用程序一直是各种黑客攻击的目标。这主要是由于 PHP 的开源性和新开发人员的低门槛成本。

最著名的 PHP 漏洞包括 SQL 注入、跨站脚本 (XSS)、跨站请求伪造 (CSRF) 和远程代码执行 (RCE)。

请记住,这些漏洞是可以通过遵循安全编码实践来预防的。确保始终对输入进行消毒,绝不执行用户提供的输入。

香草 PHP 已过时

对于构建现代应用程序来说,Vanilla PHP(即不含任何库或框架的 PHP)可能已经过时。要想快速构建安全的应用程序,就必须使用框架。

PHP 部署选项

PHP 应用程序可以部署到不同的平台。部署 PHP 应用程序最常见的云模式有

  1. 基础设施即服务(IaaS)、
  2. 平台即服务(PaaS)、
  3. 容器即服务(CaaS)。

部署 PHP 应用程序的最佳云模式并不存在。最终,选择取决于您的项目要求、预算和想要的抽象程度。

通常情况下,开发团队会选择 PaaS 或 CaaS,因为它们更易于管理,价格也不比 IaaS 贵多少。让我们来看看一些最好的 PHP 托管供应商。

Back4app Containers

Back4app Containers是 Back4app 推出的一款出色的容器即服务(CaaS)产品。该平台允许开发人员构建、扩展和快速部署 docker 化应用程序。

将应用程序部署到 Back4app Containers 就像导入 GitHub 仓库和点击按钮一样简单。该平台拥有强大的持续集成和部署系统,支持无停机部署、实时部署跟踪等功能!

Back4app Containers 的另一个优势是它的免费层,非常适合托管小型应用程序。随着应用程序规模的扩大,您可以按照简单、可预测的定价计划升级到高级层。

Google Cloud Run

Google Cloud Run 是一个全自动的容器即服务(CaaS)平台,用于部署和扩展容器化应用程序。它于 2019 年公开发布,自此广受欢迎。

Cloud Run 的使用相对简单,尤其是在熟悉其他 GCP 产品的情况下。Cloud Run 的一些优势包括免费 SSL 证书、与其他 GCP 解决方案的良好集成以及可扩展至零。

在撰写本报告时,谷歌为新用户提供了 300 美元的免费点数。

Heroku

Heroku是平台即服务(PaaS)解决方案的先驱之一。它成立于 2007 年,至今仍广受欢迎。

它广泛支持各种编程语言,包括 PHP、Java、Node.js、Go、Scala 和 Python。该平台拥有流畅、用户友好的用户界面,具有很强的可扩展性,并提供大量附加组件供用户选择。

Heroku 曾经提供免费计划以及免费 PostgreSQL 和 Redis 实例,但由于担心欺诈和机器人问题,他们决定在 2022 年取消这些计划。尽管如此,Heroku 仍然是部署应用程序的绝佳平台。

AWS Elastic Beanstalk

AWS Elastic Beanstalk(EB)是一个优秀的平台即服务(PaaS)解决方案。它是一个成熟且久经考验的平台,成立于 2011 年。EB 本机支持 Go、Java、Node.js、PHP、Python 和 Ruby,并允许部署 docker 化应用程序。

Elastic Beanstalk 的最大优点是可以与其他 AWS 解决方案相结合,如AWS S3AWS RDSAWS CloudFront 等。AWS 为新客户提供免费层。

PHP 部署流程

在本节中,我们将了解如何引导和部署一个简单的LaravelWeb 应用程序到Back4app 容器

先决条件

  • 对 PHP 有基本了解。
  • 对 Docker 和容器技术有基本了解。
  • 在本地计算机上安装Composer以及Node.jsDocker

如果您对容器化技术不熟悉,请查看什么是容器?

什么是 Laravel?

Laravel 徽标

Laravel 是一个优秀的 PHP 框架,它能让你使用表现力强且优雅的语法快速构建应用程序。因此,你最终会得到简洁明了的代码。

该框架基于模型-视图-控制器(MVC)架构模式。最重要的是,Laravel 完全免费且开源。

它最初发布于 2011 年,是目前最流行的 PHP 框架之一。由于其灵活性,它可用于构建任何类型的网络应用程序。

Laravel 的优势

  • 性能优越,操作灵活。
  • 简化数据库工作(通过Eloquent ORM)。
  • 内置认证和授权。
  • 综合安全措施(CSRF、XSS)。

一些 Laravel 替代品包括SymfonyCodeIgniterCakePHPLaminas Project

创建应用程序

以下步骤需要安装Composer。如果没有,请从官方网站下载。

首先,通过 Composer 命令行界面创建一个新的 Laravel 项目:

$ composer create-project laravel/laravel sample-app

请随意将sample-app替换为自定义名称。

该命令将创建一个新的 Laravel 项目和默认目录结构。此外,它还会通过composer install 安装所有依赖项。该命令最多耗时三分钟。

完成后,您会看到以下目录结构:

sample-app/
├── app/                   contains the core code of your application
│   ├── Console
│   ├── Exceptions
│   ├── Http
│   ├── Models
│   └── Providers
├── bootstrap              is used to bootstrap the framework
├── config                 contains all your configuration files
├── database               contains database factories, migrations, seeders
├── public                 contains your index.php and static assets (JS, images, CSS)
├── resources              contains all your views and templates (along with raw assets)
├── routes                 is used to define all your application endpoints
├── storage                contains logs and other auto-generated stuff
├── tests                  can be utilized for automatic testing
└── vendor                 contains your Composer dependencies

接下来,通过以下命令运行开发服务器:

$ php artisan serve

INFO  Server running on [http://127.0.0.1:8000].
Press Ctrl+C to stop the server.

最后,打开你喜欢的网页浏览器,导航到http://localhost:8000/。你应该会看到默认的 Laravel 索引页面。

Laravel 索引页

修改应用程序

在本节中,我们将注册一个新的 API 端点,对应用程序稍作修改。

如上一节所述,所有路由都在routes文件夹中定义。路由文件夹包含以下文件:

routes/
├── api
├── channels
├── console
└── web

网络目录定义最终用户路由,api用于 API 路由,console用于定义控制台命令,最后是channels用于事件广播通道。

在 Laravel 5.3 之前,只有一个 routes 文件,位于app/Http/routes.php

导航至routes/api.php,然后像这样注册一个新的 API 端点:

<?php

// routes/api.php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});

// new endpoint
Route::get('/', function () {
    return response()->json([
        'detail' => 'Back4app Containers rocks!',
    ]);
});

很好,就是这样。

再次启动开发服务器(如果尚未运行),并导航至http://localhost:8000/。你应该仍能看到默认的 Laravel 页面,但如果导航到/api/,应该会看到如下信息:

{
    "detail": "Back4app Containers rocks!"
}

Dockerize 应用程序

在本节中,我们将使用Dockerfile 对 Laravel 应用程序进行对接。

Dockerfile

Dockerfile是一个纯文本文件,其中包含 Docker 引擎为构建和运行 Docker 镜像而必须执行的所有指令。这些指令通常以大写字母书写,后面跟着自定义数量的参数。例如

INSTRUCTION arg1 arg2 ... argn

在项目根目录下创建一个Dockerfile,内容如下:

FROM php:8.1-apache

# Set the working directory
WORKDIR /var/www/html

# Install the necessary libraries
RUN apt-get update && apt-get install -y \
    libonig-dev \
    libzip-dev

# Install PHP extensions
RUN docker-php-ext-install \
    mbstring \
    zip

# Copy over the Laravel project
COPY . .

# Install Composer along with the dependencies
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
RUN composer install

# Change ownership of our applications
RUN chown -R www-data:www-data /var/www/html

# Copy over the .env file and generate the app key
COPY .env .env
RUN php artisan key:generate

# Expose port 80
EXPOSE 80

# Adjusting Apache configurations
RUN a2enmod rewrite
COPY apache/apache-config.conf /etc/apache2/sites-available/000-default.conf

这个Dockerfile使用php:8.1-apache作为基础镜像,安装了所需的操作系统依赖项,并拷贝了项目。然后通过 Composer 安装 PHP 依赖项,生成 Laravel 密钥,公开 80 端口,最后拷贝 Apache 配置。

要了解有关Dockerfile 的更多信息,请查看Dockerfile 参考资料

.dockerignore

我们可以使用.dockerignore文件来减少镜像的大小。该文件的作用与.gitignore文件类似。它允许我们省略不希望包含在镜像中的特定文件和目录。

在项目根目录下创建一个.dockerignore文件,内容如下:

/.phpunit.cache
/node_modules
/public/build
/public/hot
/public/storage
/storage/*.key
/vendor
.phpunit.result.cache
auth.json
npm-debug.log
yarn-error.log
/.fleet
/.idea
/.vscode

你可以根据自己的需要修改.dockerignore文件。

构建、运行和测试

在尝试构建镜像之前,请确保已安装 Docker:

$ docker --version

Docker version 20.10.22, build 3a2c30b

确认无误后,就可以创建图像了:

$ docker build -t laravel-sample:1.0 .

指挥部简介

  1. docker build用于构建镜像。
  2. -t laravel-sample:1.0标记图像(图像名称通常具有name:version结构)。
  3. .指定了构建上下文。在我们的例子中就是项目根目录。

接下来,使用新创建的镜像启动一个容器:

$ docker run -p 80:80 --name laravel-sample-container -d laravel-sample:1.0

指挥部简介

  1. docker run用于启动容器。
  2. -p 80:80将主机上的端口80与容器中的80绑定。
  3. --name laravel-sample-container指定容器名称。
  4. -d以分离模式运行图像,即不占用终端。
  5. laravel-sample:1.0告诉 Docker 引擎应该使用什么镜像。

如果现在检查正在运行的容器,应该会看到laravel-sample-container

$ docker ps

CONTAINER  IMAGE               COMMAND          CREATED  PORTS              
b0bfbd     laravel-sample:1.0  "docker-php..."  2s ago   0.0.0.0:80->80/tcp  laravel

最后,在您最喜欢的网络浏览器中访问http://localhost/,检查是否能看到该应用程序。

推送到 GitHub

要将应用程序部署到 Back4app Containers,您必须先将源代码上传到 GitHub。Back4app Containers 使用 CI/CD 系统,当您将代码提交到特定分支时,系统会自动进行部署。

以下步骤需要您有一个GitHub 账户(并安装了Git)。

首先,导航至https://github.com并创建一个新的存储库:

GitHub 创建仓库

接下来,选择一个合适的名称,其他一切均保持默认。然后点击 “创建版本库 “按钮创建版本库:

GitHub 创建仓库对话框

创建版本库后,抓取远程 URL:

GitHub 远程 URL

现在返回本地项目并打开命令行。要将代码推送到 GitHub,首先要通过以下方式初始化本地 Git 仓库:

$ git init

接下来,VCS 所有文件,并创建一个新的提交:

$ git add .
$ git commit -m "init"

最后,将密码输入遥控器:

$ git push origin master

就是这样!如果刷新 GitHub 仓库页面,就会看到所有文件都已成功推送到远程 Git 仓库。

部署应用程序

要在 Back4app Containers 上部署应用程序,您首先需要登录(如果还没有账户,也可以注册)。登录后,您将被重定向到应用程序仪表板页面。

然后使用 “创建新应用 “按钮开始应用创建过程:

Back4app 创建应用程序

选择 “容器即服务”,因为我们要部署的是容器化应用程序:

Back4app 创建应用程序类型

接下来,将 GitHub 与 Back4app 账户连接,并导入我们在上一步中创建的仓库。

Back4app 容器导入存储库

给你的应用程序起一个自定义名称,其他一切都保持默认。

要创建应用程序,请点击 “创建应用程序”。Back4app 会自动从 GitHub 获取源代码,并在你点击时启动 docker 镜像构建过程。几分钟后,应用程序状态将变为 “就绪”。

完成后,使用左侧的链接在浏览器中打开页面。

Back4app 容器成功部署

就是这样!

结论

总之,您已经了解了 PHP 及其优缺点和部署选项。现在你知道了如何引导 Laravel 应用程序并将其部署到 Back4app。

在本教程中,我们所了解的主题只是 Laravel 框架的皮毛。你可以随时查阅Laravel 文档,了解更多信息。

源代码可从back4app-containers-phpGitHub 代码库中获取。

今后的步骤

常见问题

什么是 PHP?

PHP 是一种流行的免费通用脚本语言。它最初为网页开发而设计,但也可用于服务器端脚本、命令行命令和桌面应用程序。目前,PHP 支持大约 80% 的网站,许多高流量网站(如 Facebook、Wikipedia、Slack 等)都在使用。

PHP 的优点是什么?

– 性能良好
– 跨平台
– 支持数据库
– 生态系统活跃
– 易于学习

PHP 的缺点是什么?

– 调试工具有限
– 弱类型语言
– 存在安全漏洞
– 原生 PHP 已过时

如何部署 PHP 应用程序?

1. 编写你的 PHP 应用程序代码。
2. 使用 Docker 容器化应用并在本地测试。
3. 将源代码推送到 GitHub
4. 创建一个 Back4app Containers 账户。
5. 导入你的 GitHub 仓库并点击部署!


Leave a reply

Your email address will not be published.