CentOS7 + PHP7.2 + gRPC 環境

- タイトルの環境構築をしようと思って、Google Cloud 公式のドキュメントの通りにやってみたけどハマった。
- 公式ドキュメント（[Install gRPC for PHP](https://cloud.google.com/php/grpc?hl=en)）

# PHP
- remiリポジトリからインストール  
  ※以降、実際には dockerfile に書いているので `sudo` がついてませんがご了承ください。

```bash
$ yum -y install epel-release
$ rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
$ yum install -y --enablerepo=remi-php72 php php-common php-opcache php-mbstring php-xdebug php-mysql php-mysqlnd php-zip php-pdo php-cli
```

と、必要そうなものを入れてみたが、最終的に足りなくてエラーになった。
足りなかったのは、 `php-devel make gcc-c++ autoconf automake libtool`

ということで３行目のインストール文の最終形はこう。

```bash
$ yum install -y --enablerepo=remi-php72 php php-common php-opcache php-mbstring php-xdebug php-mysql php-mysqlnd php-zip php-pdo php-cli php-devel make gcc-c++ autoconf automake libtool
```

# PECL
- 公式ドキュメントにはインストール手順があるが、不要だった。

# Composer
- 公式通り、以下でOK

```bash
$ curl -sS https://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/local/bin/composer
```

# gRPC extension
- どうやってもPECLで入れれなかったので、ソースからビルドした。

```bash
$ git clone -b $(curl -L https://grpc.io/release) https://github.com/grpc/grpc
$ cd grpc
$ git submodule update --init
$ make
$ sudo make install
```

- ここまでは公式通りにいけたが、gRPC PHP 拡張機能をコンパイルがうまくいかない。
- gcc のバージョンが 4.8 だったが、これを 7 に上げる必要がある。

```bash
$ yum install -y centos-release-scl
$ yum install -y devtoolset-7-gcc*
```

- 有効化。

```bash
$ scl enable devtoolset-7 bash
```

- Dockerの場合は、以下で有効化する。

```dockerfile

SHELL [ "/usr/bin/scl", "enable", "devtoolset-7"]
```

- gRPC PHP 拡張機能をコンパイル

```bash
$ cd src/php/ext/grpc
$ phpize
$ ./configure
$ make
$ sudo make install
```

- 元々のbashに戻す。

```bash
$ exit
```

- Dockerの場合、以下で戻す。

```dockerfile

SHELL ["/bin/bash", "-c"]
```

# php.ini
- gRPC 拡張機能を有効にする

```bash
$ echo extension=grpc.so  >> /etc/php.ini
```

# ライブラリインストール
- 公式の通り、以下を実行

```bash
$ composer require "grpc/grpc:^v1.1.0"
$ composer require "google/protobuf:^v3.3.0"
```

# dockerfile 全貌
- 以下に載せておくので、エラーで詰まってしまったら参考にしてください。

```dockerfile
FROM centos:7

# system update
RUN yum -y update && yum clean all

# editor
RUN yum install -y vim

# git
RUN yum install -y git

# prj create
RUN mkdir -p /prj \
    && mkdir -p /prj/docker-env

COPY docker-env /prj/docker-env

# php
RUN yum -y install epel-release
RUN rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
RUN cp /prj/docker-env/remi-php72.repo /etc/yum.repos.d/ && \
    yum install -y --enablerepo=remi-php72 php php-common php-opcache php-mbstring php-xdebug php-mysql php-mysqlnd php-zip php-pdo php-cli \
        php-devel make gcc-c++ autoconf automake libtool

# composer
RUN curl -sS https://getcomposer.org/installer | php && \
    mv composer.phar /usr/local/bin/composer

# gRPC - core lib
WORKDIR /prj
RUN git clone -b $(curl -L https://grpc.io/release) https://github.com/grpc/grpc
WORKDIR /prj/grpc
RUN git submodule update --init && \
    make && \
    make install

# change gcc version 4.8 -> 7
RUN yum install -y centos-release-scl && \
    yum install -y devtoolset-7-gcc*
SHELL [ "/usr/bin/scl", "enable", "devtoolset-7"]

# gRPC - php ext
WORKDIR /prj/grpc/src/php/ext/grpc
RUN phpize && \
    ./configure && \
    make && \
    make install

SHELL ["/bin/bash", "-c"]

# Enable the gRPC extension in php.ini
RUN echo extension=grpc.so  >> /etc/php.ini

WORKDIR /prj

# Add gRPC as a Composer dependency
RUN composer global require "grpc/grpc:^v1.1.0"

# Installing the protobuf runtime library
RUN composer global require "google/protobuf:^v3.3.0"

ENTRYPOINT /bin/bash
```

- ちなみに、ローカルには `docker-env` というディレクトリを掘ってて、その中に以下のようにremiのリポジトリファイルを作成しています。
- Dockerのビルド時にコピーして使ってるつもりですが、実際いらないかもしれません。（検証が足りていない、、）

```
[remi-php72]
name=Remi's PHP 7.2 RPM repository for Enterprise Linux 7 - $basearch
#baseurl=http://rpms.remirepo.net/enterprise/7/php72/$basearch/
#mirrorlist=https://rpms.remirepo.net/enterprise/7/php72/httpsmirror
mirrorlist=http://cdn.remirepo.net/enterprise/7/php72/mirror
priority=1
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
```