【PHP8】Docker로 PECL의 YAML 함수(YAML 파서)를 인스톨 해 사용

【PHP8】Docker로 PECL의 YAML 함수(YAML 파서)를 인스톨 해 사용

2022-10-03 last update

5 minutes reading PHP8 PECL YAML PHP 도커
PHP YAML 함수는 표준으로 PHP에 번들되지 않습니다.

YAML 함수에서 YAML 데이터를 PHP 배열로 구문 분석 (파싱하여 변환)하거나 PHP 배열에서 YAML 데이터로 구문 분석하려면 PECL 확장 줄을 설치해야합니다.

그러나 최신 (2020/08/28 현재) php:8.0.0beta2php:8.0.0beta2-alpine 이미지에는 PECL이 설치되어 있지 않습니다. PHP 7.4 이상부터 PEAR / PECL 설치 프로그램이 제거되었습니다. 같습니다.

TL; DR



PECL 을 소스로부터 빌드할 필요가 있습니다만, 그것도 번거롭기 때문에 pecl 커멘드들이의 이미지를 작성했습니다. Intel/AMD 뿐만 아니라 라즈파이 등의 ARMv5, v7, ARM64 에서도 동작합니다.
docker pull keinos/php8-jit:latest
  • 이미지: keinos/php8-jit @ DockerHub
  • Dockerfile: keinos/php8-jit @ GitHub
  • $ docker run --rm keinos/php8-jit pecl version
    PEAR Version: 1.10.12
    PHP Version: 8.0.0-dev
    Zend Engine Version: 4.0.0-dev
    Running on: Linux 3fc54c34122a 4.19.76-linuxkit #1 SMP Tue May 26 11:42:35 UTC 2020 x86_64
    

    또한 PECL 리포지토리의 빌드된 패키지로 동작하지 않는 것이 많기 때문에, PECL 패키지도 소스로부터 인스톨 할 수 있도록 하고 있습니다.

    요 yaml-dev
    docker-php-ext-pecl install yaml
    

    TS; DR



    Dockerfile
    FROM keinos/php8-jit:latest
    
    USER root
    
    COPY sample.php /app/sample.php
    
    RUN \
        apk --no-cache add yaml-dev && \
        docker-php-ext-pecl install yaml
    
    ENTRYPOINT [ "php", "/app/sample.php" ]
    

    sample.php
    <?php
    
    // YAML のサンプル文字列
    $yaml = <<<EOD
    ---
    invoice: 34843
    date: "2001-01-23"
    bill-to: &id001
      given: Chris
      family: Dumars
      address:
        lines: |-
          458 Walkman Dr.
                  Suite #292
        city: Royal Oak
        state: MI
        postal: 48046
    ship-to: *id001
    product:
    - sku: BL394D
      quantity: 4
      description: Basketball
      price: 450
    - sku: BL4438H
      quantity: 1
      description: Super Hoop
      price: 2392
    tax: 251.420000
    total: 4443.520000
    comments: Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.
    ...
    EOD;
    
    // YAML 文字列を PHP 配列にパース
    $parsed = yaml_parse($yaml);
    
    // 比較テスト
    $actual = json_encode($parsed);
    $expect = '{"invoice":34843,"date":"2001-01-23","bill-to":{"given":"Chris","family":"Dumars","address":{"lines":"458 Walkman Dr.\n        Suite #292","city":"Royal Oak","state":"MI","postal":48046}},"ship-to":{"given":"Chris","family":"Dumars","address":{"lines":"458 Walkman Dr.\n        Suite #292","city":"Royal Oak","state":"MI","postal":48046}},"product":[{"sku":"BL394D","quantity":4,"description":"Basketball","price":450},{"sku":"BL4438H","quantity":1,"description":"Super Hoop","price":2392}],"tax":251.42,"total":4443.52,"comments":"Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338."}';
    
    echo '- Function test ... ', ($expect === $actual) ? 'OK' : 'NG', PHP_EOL;
    
    

    참고문헌


  • Issue #846 PECL not working on php:7.4-rc-fpm-alpine3.9 | PHP @ docker-library @ GitHub

  • YAML @ PECL

  • 설치 절차 | YAML @ PHP 공식 매뉴얼

  • yaml_parse | YAML 함수 | YAML @ PHP 공식 매뉴얼