关于docker:Docker-PHP-入门实践三

45次阅读

共计 8625 个字符,预计需要花费 22 分钟才能阅读完成。

第三章。创立一个 ThinkPHP 应用程序

在本教程的其余部分,咱们将基于 ThinkPHP 框架实现一个天气查问的利用。应用 高德开放平台 - 天气查问 的接口来实现咱们的性能。把查问数据缓存到 MySql 中,这样就不必每次频繁的申请第三方的接口了(有申请次数限度)

抉择高德开放平台 - 天气查问 API 次要是因为它是收费的。当然你也能够应用其余的第三方天气查问接口,看集体爱好。
该利用是一个非常简单的 REST API 利用,次要实现两个接口。

  • GET /weather/:location_id – 从数据库中获取天气(如果存在的话),如果不存在,则从 第三方接口获取。
  • DELETE /weather/:location_id – 从数据库中删除已缓存的天气信息。再次查问该地点的天气时,将从高德的天气接口获取。
在咱们进行利用编码之前,首先应用 Docker 装置并运行 [ThinkPHP](https://www.kancloud.cn/manual/thinkphp6_0/1037479)

装置 ThinkPHP Framework

ThinkPHP 是一个收费开源的,疾速、简略的面向对象的 轻量级 PHP 开发框架 ,是为了麻利 WEB 利用开发和简化企业应用开发而诞生的。ThinkPHP 从诞生以来始终秉承简洁实用的设计准则,在放弃杰出的性能和至简代码的同时,更重视易用性。遵循 Apache2 开源许可协定公布,意味着你能够收费应用 ThinkPHP,甚至容许把你基于 ThinkPHP 开发的利用开源或商业产品公布 / 销售。
这就是为什么我抉择它作为本教程的教学框架。我不想让你因为一个框架而放弃,但我也不想从头开始建设所有的货色,因为该教程的重点是 Docker,而不是咱们的 PHP 利用。

用 Docker 创立 ThinkPHP 利用实际上比用本地配置 PHP 环境所需的操作少。并且为咱们还须要应用 Composer,多亏了 Docker,咱们甚至不须要在主机上安装它。

首先关上你的终端,创立一个我的项目目录。

$ mkdir docker-app

并进入到该目录中

$ cd docker-app

当初应用[官网 Composer Docker 镜像](https://hub.docker.com/_/comp…)装置 ThinkPHP。

$ docker run --rm --interactive --tty -v E:/workplace/docker-app/:/app composer:latest create-project topthink/think weather-app

如果你查看 weather-app/ 目录,你会看到 ThinkPHP 6 的我的项目目录,如下所示:

dir

E:\workplace\docker-app\weather-app 的目录

2022/02/11  16:31    <DIR>          .
2022/02/11  16:30    <DIR>          ..
2021/12/16  21:06               231 .example.env
2021/12/16  21:06                34 .gitignore
2021/12/16  21:06             2,038 .travis.yml
2021/12/16  21:06    <DIR>          app
2021/12/16  21:06             1,094 composer.json
2022/02/11  16:31            36,134 composer.lock
2021/12/16  21:06    <DIR>          config
2021/12/16  21:06    <DIR>          extend
2021/12/16  21:06             1,822 LICENSE.txt
2021/12/16  21:06    <DIR>          public
2021/12/16  21:06             1,459 README.md
2021/12/16  21:06    <DIR>          route
2021/12/16  21:06    <DIR>          runtime
2021/12/16  21:06               180 think
2022/02/11  16:31    <DIR>          vendor
2021/12/16  21:06    <DIR>          view

创立 ThinkPHP 利用的过程中的命令梳理

咱们的 docker 运行命令与第二章中的命令类似,但咱们应用了不同的镜像。咱们没有应用运行 hello.php 脚本的 PHP 镜像,而是应用了一个 Composer 镜像。让咱们来看看有什么变动。

  • composer:latest – 这表明咱们在这个容器中应用的镜像。如果须要,你能够指定 Composer 的特定版本;只有查看 Docker Hub 上反对的镜像标签列表。
  • create-project topthink/think weather-app – 这是理论将 ThinkPHP 6 装置到容器工作目录中的命令。因为该工作目录是咱们主机目录的一个卷,所以 composer 装置的文件当初在主机和容器中都存在。在这一点上,你的应用程序实际上没有做任何事件,但 ThinkPHP 6 曾经被装置了,咱们当初对 composer 在 Docker 中如何与 PHP 一起工作有了一些理解。

新建路由与 Controller(逻辑解决)文件

我的项目创立实现后,咱们须要增加几个路由 URL 和 Controller 文件。让咱们关上 weather-app 目录下的 app/controller , 而后新建 Weather.php 文件,内容如下:

<?php

namespace app\controller;

use app\BaseController;

class Weather extends BaseController
{public function get()
    {
        // todo
        echo "location_id is".$this->request->param('location_id');
    }

    public function delete()
    {
        // todo
        echo "location_id is".$this->request->param('location_id');
    }
}

而后关上 weather-app 目录下的 app/route , 在 app.php 文件中追加如下内容:

Route::get('/weather/:location_id','weather/get');
Route::delete('/weather/:location_id','weather/delete');

运行咱们的应用程序

当初咱们能够在 Docker 容器中运行咱们的应用程序,只是为了验证咱们的程序是否运行失常,因为咱们只增加了两个路由 URL。关上命令行,运行。

$ docker run --privileged=true --rm -p 38000:80 -v E:/workplace/docker-app/:/var/www/html php:apache

当初,在浏览器中关上 http://localhost:38000/weather-app/public/index.php/weather/1,你应该看到一个空页面,下面有以下文字:

location_id is 1

那么祝贺你,你刚刚曾经胜利地在 Docker 中运行了你的第一个 ThinkPHP 应用程序。

运行 ThinkPHP 利用的命令梳理

这次咱们应用的 docker run 命令与咱们用来运行 hello.php 脚本 和 composer create-project ... 的两个命令不同。起因是这次咱们想取得蕴含 Apache 的最新版本的 PHP,这样咱们就能够为咱们的 Web 利用提供服务。让咱们更具体地理解新增的命令局部。

  • -p 38000:80 – 这里咱们在容器和主机零碎之间定义了端口映射。这个命令说 Docker 应该把容器上的 80 号端口映射到咱们主机上的 38000 号端口。你能够在你的主机上抉择任何无效的端口,但应用一个高的端口(10000 以上)可能是一个好主见,因为许多低的端口被保留给大多数规范机器上的内置过程。对于容器,你必须 * 应用 80 端口,因为那是 Docker 镜像裸露的端口,Apache 在下面运行。
  • –privileged=true – 容器内是否应用 root 权限
  • -v E:/workplace/docker-app/:/var/www/html – 这一次,咱们将代码从主机挂载到容器的 /var/www/html 目录。起因是,PHP 的 Apache 镜像是从这个目录中提供代码的。这是咱们之前运行的 PHP 脚本之间的一个奥妙但要害的区别。请务必仔细阅读官网 PHP Docker 镜像文档以防止脱漏这样的事件。
  • php:apache – 该镜像是官网的 PHP Apache 容器。它蕴含 PHP 和 Apache(一种风行的 Web 服务器)在同一个容器中,容许你疾速提供代码用于本地开发。当然你也能够抉择是应用 php:fpm 镜像 链接一个 nginx 的镜像,这些我不会在本书中介绍,须要你本人去理解。
  • 最初,你会留神到,这次在镜像名称前面没有命令。这可能会让新的 Docker 用户感到困惑,但在默认状况下,即便你没有指定命令,大多数镜像也会运行一些命令。在 PHP Apache 镜像的例子中,默认的命令是运行一个 shell 脚本来启动 Apache。这个脚本正是咱们想要的,所以没有理由去扭转它。
    在这一点上,你的终端将显示任何进来的 Apache 申请,所以当你加载第一个 URL 时,你可能看到相似的货色。
172.17.0.1 - - [11/Feb/2022:09:14:02 +0000] "GET /weather-app/public/index.php/weather/1 HTTP/1.1" 200 245 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36 Edg/98.0.1108.43"

你能够通过向终端发送一个 “ 中断 “ 信号来进行和退出终端。在 windows 上,这能够通过按 Ctrl 和按 c 来实现。

更多 Docker 运行选项

在 Detached 模式下运行

运行你的新网络应用程序的另一个抉择是在 “Detached” 模式中运行容器。这意味着你在终端将不会看到来自你的容器的输入。这能够通过在咱们之前的命令中增加 -d 标记来实现。

$ docker run --privileged=true -d --rm -p 38000:80 -v E:/workplace/docker-app/:/var/www/html php:apache

进行一个容器

在拆散模式下启动容器后,你的终端将显示新容器的残缺 ID– 相似于 a70d25c2a7cedae673f8ab... 如果你想进行这个容器,你能够应用 docker stop 命令,用容器的 ID 通知 Docker。比如说

$ docker stop a70d25c2a7cedae673f8ab

因为输出整个 ID 是很麻烦的,如果你违心,Docker 容许你只输出前三个或更多的字符。

$ docker stop a70

命名容器

最初,我倡议为你的容器命名。咱们在本书前面的许多例子中都会这样做,因为用名字来记住一个容器比用随机调配的 ID 要容易得多,再加上 ID 是随机的,所以每次你运行一个新版本的容器时,它都会失去一个新的 ID。只有不是曾经有一个同名的容器,名字就能够屡次收回来。为了给咱们的新利用容器命名,咱们能够用传入的 --name 标记从新创立它。

$ docker run --privileged=true -d --rm --name=weather-app -p 38000:80 -v E:/workplace/docker-app/:/var/www/html php:apache

在应用 docker run 命令时,还有许多可用的选项,所以你可能想更具体地浏览文档。在咱们开发其余的应用程序时,咱们会波及其中的一些选项。

增加高德天气 SDK

当初咱们要引入高德的天气 SDK,在应用该 SDK 之前你须要浏览高德开放平台 - 天气查问的技术文档,再增加 SDK 之前咱们首先要确保所有现有的容器都进行了。

$ docker ps   // 之后在运行 下面的命令进行容器
docker stop 容器 ID

这个命令将列出所有正在运行的容器。你也能够通过增加 -a 标记来查看进行的容器。
如果有任何容器正在运行,那么在咱们继续前进之前,应用 docker stop <ID> 来进行它们。

添天气 SDK

执行命令增加高德天气 SDK,欢送点赞 + 星。这是作者之前封装的 SDK,当然你也能够本人从新封装或者用其余的天气 SDK,当初在你的终端运行:

 docker run --rm --interactive --tty -v E:/workplace/docker-app/weather-app:/app composer:latest require clydecn/php-amap-weather

该命令将在你的我的项目中装新的软件包。在这个过程中,你应该在终端看到一些相似这样的输入。

Using version ^1.0 for clydecn/php-amap-weather
./composer.json has been updated
Running composer update clydecn/php-amap-weather
Loading composer repositories with package information
Updating dependencies
Lock file operations: 7 installs, 0 updates, 0 removals
  - Locking clydecn/php-amap-weather (v1.0.0)
  - Locking guzzlehttp/guzzle (6.5.5)
  - Locking guzzlehttp/promises (1.5.1)
  - Locking guzzlehttp/psr7 (1.8.3)
  - Locking ralouphie/getallheaders (3.0.3)
  - Locking symfony/polyfill-intl-idn (v1.24.0)
  - Locking symfony/polyfill-intl-normalizer (v1.24.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 7 installs, 0 updates, 0 removals
  - Downloading symfony/polyfill-intl-normalizer (v1.24.0)
  - Downloading symfony/polyfill-intl-idn (v1.24.0)
  - Downloading ralouphie/getallheaders (3.0.3)
  - Downloading guzzlehttp/psr7 (1.8.3)
  - Downloading guzzlehttp/promises (1.5.1)
  - Downloading guzzlehttp/guzzle (6.5.5)
  - Downloading clydecn/php-amap-weather (v1.0.0)
 0/7 [>---------------------------]   0%  - Downloading symfony/polyfill-intl-idn (v1.24.0)
  - Downloading ralouphie/getallheaders (3.0.3)
  - Downloading guzzlehttp/psr7 (1.8.3)
  - Downloading clydecn/php-amap-weather (v1.0.0)
  - Downloading symfony/polyfill-intl-normalizer (v1.24.0)
  - Downloading guzzlehttp/promises (1.5.1)
  - Downloading guzzlehttp/guzzle (6.5.5)
  - Installing symfony/polyfill-intl-normalizer (v1.24.0): Extracting archive
  - Installing symfony/polyfill-intl-idn (v1.24.0): Extracting archive
  - Installing ralouphie/getallheaders (3.0.3): Extracting archive
  - Installing guzzlehttp/psr7 (1.8.3): Extracting archive
  - Installing guzzlehttp/promises (1.5.1): Extracting archive
  - Installing guzzlehttp/guzzle (6.5.5): Extracting archive
  - Installing clydecn/php-amap-weather (v1.0.0): Extracting archive
3 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
> @php think service:discover
Succeed!
> @php think vendor:publish
File /app/config/trace.php exist!
Succeed!
10 packages you are using are looking for funding.
Use the `composer fund` command to find out more!

当初 SDK 曾经装置结束,能够应用了。

调用 SDK API

咱们将应用刚刚增加的高德天气 SDK 来欠缺咱们的业务逻辑,关上 controller 目录下的 Weather.php 增加以下内容:

<?php

namespace app\controller;

use app\BaseController;
use Clydecn\Amap\Weather as AmapWeather;

class Weather extends BaseController
{
    public $key;
    public $weather;
     // 初始化
     protected function initialize()
     {
         $this->key = "KEY"; // 高德 KEY
         $this->weather = new AmapWeather($this->key);
     }
 
    public function get()
    {$rid = $this->request->param('location_id','310000');
        // 查问当天天气
        $res = $this->weather->getLiveWeather($rid);

        return json($res,200);
    }

    public function delete()
    {
        // todo
        echo "location_id is".$this->request->param('location_id');
    }
}

解疑

咱们做了一些更新 – 次要是对引入天气 API 初始化天气类

  • $this->weather=new AmapWeather($this->key); – 实例化天气 API 类
  • $res=$this->weather->getLiveWeather('310000'); – 获取天气信息。
  • return json($res,200); – 最初,返回 Json 数据

    测试

咱们的应用程序曾经初步实现了向 API 传递一个实在的地位 ID 并返回一些数据。首先,应用这个高德地位查问找到一个地位 ID。我应用的是上海的 ID 进行测试。310000,当然你间接传 上海 也是能够的。ok,让咱们再次运行 Docker 容器。

docker run -d --privileged=true --rm --name=weather-app -p 38000:80 -v E:/workplace/docker-app/:/var/www/html php:apache

并在你的浏览器中拜访正在运行的应用程序,地址是 http://localhost:38000/weather-app/public/index.php/weather/310000。你应该能够看到一个 JSON 数据,看起来像这样。

{"status":"1","count":"1","info":"OK","infocode":"10000","lives":[{"province":"上海","city":"上海市","adcode":"310000","weather":"晴","temperature":"11","winddirection":"东","windpower":"≤3","humidity":"38","reporttime":"2022-02-14 14:01:45"}]}

你的 Docker 化的 PHP 应用程序当初正从内部数据源返回实在数据,并在 Apache 中提供服务,但你可能会留神到,它的速度并不快(我的页面加载工夫为 1.92 秒!)。
高德天气 API 是一个收费的服务,其余国家可能无法访问。为了解决这个问题,咱们将把查问的数据保留在咱们本人的 MySQL 数据库中,能够再下次访问的时候能够疾速地响应。这将极大地提高性能,下个章节咱们将学习如何用 Docker 将 MySql 与 PHP 应用程序相结合。

正文完
 0