를 인스톨 해 사용.png)
【PHP8】Docker로 PECL의 YAML 함수(YAML 파서)를 인스톨 해 사용
PHP YAML 함수는 표준으로 PHP에 번들되지 않습니다.
YAML 함수에서 YAML 데이터를 PHP 배열로 구문 분석 (파싱하여 변환)하거나 PHP 배열에서 YAML 데이터로 구문 분석하려면 PECL 확장 줄을 설치해야합니다.
그러나 최신 (2020/08/28 현재)
PECL 을 소스로부터 빌드할 필요가 있습니다만, 그것도 번거롭기 때문에
이미지: keinos/php8-jit @ DockerHub Dockerfile: keinos/php8-jit @ GitHub
또한 PECL 리포지토리의 빌드된 패키지로 동작하지 않는 것이 많기 때문에, PECL 패키지도 소스로부터 인스톨 할 수 있도록 하고 있습니다.
요 yaml-dev
Dockerfile
sample.php
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 공식 매뉴얼
YAML 함수에서 YAML 데이터를 PHP 배열로 구문 분석 (파싱하여 변환)하거나 PHP 배열에서 YAML 데이터로 구문 분석하려면 PECL 확장 줄을 설치해야합니다.
그러나 최신 (2020/08/28 현재)
php:8.0.0beta2
및 php: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
$ 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;
참고문헌
YAML @ PECL
설치 절차 | YAML @ PHP 공식 매뉴얼
yaml_parse | YAML 함수 | YAML @ PHP 공식 매뉴얼