在运行PHP 7(.4)的Docker容器(fpm-alpine)中安装php-mecab,以便在PHP中使用MeCab

介绍如何在Docker的PHP镜像中安装MeCab和mecab-ipadic-NEologd,并进行相应配置以使其可在PHP中使用?。

不需要安装PHP框架或Web服务器,只需通过PHP确认是否可以使用MeCab。如果可以使用,请添加所需的内容✨。

在使用下述PHP的示例进行确认。

FROM php:7.4.12-fpm-alpine

Docker Compose配置

为了方便启动和关闭,我们将使用docker-compose。请在项目的根目录下创建以下docker-compose.yml文件。

    • PHPコンテナにMeCabをインストールしてカスタムでコンテナを作るため、新規作成するDockerfileの場所をbuildのdockerfileで指定します

volumes にはPHPでMeCabを使うサンプルスクリプトを配置するホスト側のディレクトリとコンテナ側のディレクトリをマウントします
PHPのコンテナを起動させ続けるために tty をtrueにしておきます

version: '3'

services:
  php-mecab:
    build:
      context: ./
      dockerfile: Dockerfile
    volumes:
      - ./src:/app
    tty: true

安装MeCab和mecab-ipadic-NEologd。

我們將在同一專案的根目錄下創建一個Dockerfile,並在PHP容器中引入MeCab和mecab-ipadic-NEologd。

这是一篇旧文章,但是依然可以用与这篇文章相同的方法构建 PHP7.4.12。 参见链接:https://qiita.com/nownabe/items/4171776aec1f05de9f28

FROM php:7.4.12-fpm-alpine

## ここから
# https://qiita.com/nownabe/items/4171776aec1f05de9f28#dockerfile
RUN apk add --update --no-cache build-base

ENV MECAB_VERSION 0.996
ENV IPADIC_VERSION 2.7.0-20070801
ENV mecab_url https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE
ENV ipadic_url https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM
ENV build_deps 'curl git bash file sudo openssh'
ENV dependencies 'openssl'

RUN apk add --update --no-cache ${build_deps} \
  # Install dependencies
  && apk add --update --no-cache ${dependencies} \
  # Install MeCab
  && curl -SL -o mecab-${MECAB_VERSION}.tar.gz ${mecab_url} \
  && tar zxf mecab-${MECAB_VERSION}.tar.gz \
  && cd mecab-${MECAB_VERSION} \
  && ./configure --enable-utf8-only --with-charset=utf8 \
  && make \
  && make install \
  && cd \
  # Install IPA dic
  && curl -SL -o mecab-ipadic-${IPADIC_VERSION}.tar.gz ${ipadic_url} \
  && tar zxf mecab-ipadic-${IPADIC_VERSION}.tar.gz \
  && cd mecab-ipadic-${IPADIC_VERSION} \
  && ./configure --with-charset=utf8 \
  && make \
  && make install \
  && cd \
  # Install Neologd
  && git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git \
  && mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n -y \
  # Clean up
  && apk del ${build_deps} \
  && rm -rf \
    mecab-${MECAB_VERSION}* \
    mecab-${IPADIC_VERSION}* \
    mecab-ipadic-neologd

## ここまで

安装php-mecab。

如果想要在PHP中使用MeCab,则需要安装php-mecab模块。以下是创建Dockerfile的关键点。

autoconf を導入しないとphp-mecabのビルドに必要な configure が生成されない

php-config, mecab-config は /usr/local/bin/ 以下に配置されている

根据这一点,在Dockerfile中添加php-mecab,如下所示。

# ...
## ここまで

## ここから追記する
ENV build_deps_phpmecab 'git autoconf'
COPY php.mecab.ini /usr/local/etc/php/conf.d/
RUN apk add --update --no-cache ${build_deps_phpmecab} \ 
  && git clone https://github.com/rsky/php-mecab.git \
  && cd ./php-mecab/mecab \
  && phpize \
  && ./configure --with-php-config=/usr/local/bin/php-config --with-mecab=/usr/local/bin/mecab-config \
  && make \
  && make test \
  && make install \
  # Clean up
  && cd  \
  && rm -rf php-mecab \
  && apk del ${build_deps_phpmecab}

# ▼▼このコマンドが最後に来るようにしてください
RUN docker-php-ext-install pdo pdo_mysql

正在复制 php.mecab.ini 文件,但是可以按照以下步骤创建此文件。

加载MeCab模块从PHP

为了启用在PHP中导入的php-mecab模块,请创建PHP的配置文件(php.mecab.ini),并指定mecab.so。

extension=mecab.so

最终的情况是下面的文件结构。

$ tree
.
├── Dockerfile
├── docker-compose.yml
└── php.mecab.ini

使用PHP调用MeCab

PHP7已经将MeCab_Tagger更改为\MeCab\Tagger。反斜杠也将保持不变。

<?php
        $str     = 'センテンススプリングでも文春でもどっちでもいいだろ';
        $options = array('-d', '/usr/local/lib/mecab/dic/mecab-ipadic-neologd');
        $mecab = new \MeCab\Tagger($options);
        $nodes = $mecab->parseToNode($str);
        echo $str . "\n";
        foreach ($nodes as $n) {
            $stat = $n->getStat();
            // 単語かどうか
            if ($stat != 0) {
                continue;
            }
            $features = explode(',', $n->getFeature());
            if ($features[0] !== '名詞') {
                continue;
            }
            // 単語
            echo "Surface: " . $n->getSurface() . "\n";
        }
docker-compose up --build -d php-mecab
docker-compose exec php-mecab /bin/sh
php /app/sample_php_mecab.php

你可以通过这种方式创建一个可以使用MeCab的PHP容器。
由于这种配置无法在Web浏览器中显示和确认,

    • Laravelなどのフレームワークを導入して開発用サーバーを立ち上げる

 

    別途NginxなどのWebサーバーのコンテナを導入して、このPHPコンテナで動作しているFPMと接続させる

这些工作是必要的。

以下是一个中文的例子:

回顾

Alpine Linux上使用MeCab with NEologd – Qiita

用php调用mecab进行分词 – Qiita

使用phpize时出现错误:`てるてる坊主`
请参考以下链接了解更多信息:http://teru2-bo2.blogspot.com/2012/05/phpize.html

PHP7.0+mecab在使用过程中遇到的问题 – Qiita

广告
将在 10 秒后关闭
bannerAds