[기록] 22/08/01 ~ 22/08/07

김포크레인·2022년 8월 8일
0

기록

목록 보기
1/1

08/04 - CentOS 7.9 + php8.1 셋팅

회사에서 일할 때 php를 사용하는데, 현재 버전은 php7.x 이고 EOS 도래로 인해 php8.1 로 버전업을 해야 하는 상황이다. php eol

퇴사자 분이, 과거 패킷압축을 위해 c로 개발해둔 모듈이 있는데, php8.1 로 올리려면 새로 빌드를 해야하는 상황이다.
5.x -> 7.x 로 버전업을 할 때도 한 번 새로 빌드를 했었는데, 7.x -> 8.1 로 올리기위해서 이번에 다시 빌드를 해야한다.
이럴 때마다, 과연 자체적으로 모듈들을 (유지보수 하기 쉽지 않은 것) 개발 하는 것이 옳은 일일까? 라는 고민을 하게된다.

우선 빌드 테스트를 위해서 Docker로 centos를 설치하고, php8을 설치해서 테스트를 해봐야할 것 같다. (php8 도커 이미지를 쓸까 생각도 했는데, 회사 환경과 맞춰서 하는게 좋을 것 같단 생각이 들어서 이렇게 하기로 마음 먹었다.

Docker - CentOS 7.9 설치

docker pull centos:centos7.9.2009
docker run --privileged --name centos79 -d centos:centos7.9.2009 /sbin/init
docker exec -it centos79 /bin/bash
  • 참고
    • Failed to get D-Bus connection: Operation not permitted
    • 처음 --privileged 옵션 없이 셋팅했다가, 위의 에러메시지를 만났는데, 이 경우 systemctl 이 동작하지 않음.
    • 아래의 링크 글에서 도움을 받아서 해결함.
      도움받은 글

Repository 확인

[root@05d8d5660933 /]# yum repolist
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: mirror.kakao.com
 * extras: mirror.kakao.com
 * updates: mirror.kakao.com
repo id                                        repo name                                         status
base/7/x86_64                                  CentOS-7 - Base                                   10072
extras/7/x86_64                                CentOS-7 - Extras                                   512
updates/7/x86_64                               CentOS-7 - Updates                                 4088
repolist: 14672

설치하기

참고한 링크

yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install https://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum -y install yum-utils
yum-config-manager --disable 'remi-php*'
yum-config-manager --enable remi-php81
yum repolist
yum -y install php php-{cli,fpm,mysqlnd,zip,devel,gd,mbstring,curl,xml,pear,bcmath,json,opcache,redis,memcache}

설치확인

[root@05d8d5660933 /]# php -version
PHP 8.1.9 (cli) (built: Aug  2 2022 13:02:24) (NTS gcc x86_64)
Copyright (c) The PHP Group
Zend Engine v4.1.9, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.9, Copyright (c), by Zend Technologies

08/05 - 기존 코드로 zend module 빌드테스트

vim 설치

  • 코드 보기가 불편해서 vim 도 설치함
[root@05d8d5660933 ~]# yum install vim
  • vim 설정 바꾸기
    • 내 계정만 - ~/.vimrc
    • 서버의 모든 계정 - /etc/vimrc
# 한글깨짐 수정
set encoding=utf-8
set fileencodings=utf-8,cp949

# 컬러스킴 바꾸기
colo desert
syntax on

config.m4

dnl php-test extension
PHP_ARG_ENABLE(php-test, for php-test support,
[  --enable-php-test   Include php-test support], yes)

if test "$PHP_TEST" != "no"; then
    PHP_NEW_EXTENSION(php_test, php_test.c, $ext_shared)
fi

해당 파일이 있는 경로에서 각각 아래 명령어를 실행한다.
(게시글을 쓰기위해 회사에서 쓰는 파일을 좀 수정한것.)

[root@05d8d5660933 php-test]# phpize
Configuring for:
PHP Api Version:         20210902
Zend Module Api No:      20210902
Zend Extension Api No:   420210902
[root@05d8d5660933 php-test]# ./configure
[root@05d8d5660933 php-test]# ls
Makefile            autom4te.cache  config.h.in  config.nice    configure.ac  modules
Makefile.fragments  build           config.log   config.status  include       run-tests.php
Makefile.objects    config.h        config.m4    configure      libtool
[root@05d8d5660933 php-test]# make
[root@05d8d5660933 php-test]# make test
Build complete.
Don't forget to run 'make test'.
=====================================================================
PHP         : /usr/bin/php
Warning: Missing arginfo for test_encode() in Unknown on line 0

PHP_SAPI    : cli
PHP_VERSION : 8.1.9
ZEND_VERSION: 4.1.9
PHP_OS      : Linux - Linux 05d8d5660933 5.4.0-40-generic #44-Ubuntu SMP Tue Jun 23 00:01:04 UTC 2020 x86_64
INI actual  : /test/php-test/tmp-php.ini
More .INIs  :
---------------------------------------------------------------------
PHP         : /usr/bin/php-cgi
PHP_SAPI    : cgi-fcgi
PHP_VERSION : 8.1.9
ZEND_VERSION: 4.1.9
PHP_OS      : Linux - Linux 05d8d5660933 5.4.0-40-generic #44-Ubuntu SMP Tue Jun 23 00:01:04 UTC 2020 x86_64
INI actual  : /test/php-test/tmp-php.ini
More .INIs  :
Warning: Missing arginfo for test_encode() in Unknown on line 0

---------------------------------------------------------------------
CWD         : /test/php-test
Extra dirs  :
VALGRIND    : Not used
=====================================================================
TIME START 2022-08-05 04:33:27
=====================================================================
No tests were run.

테스트 과정 중 발생한 아래의 에러 메시지에 대해, 구글링을 하면 그런 문제가 생긴다 라는 말은 많이 있는데 어떻게 수정하면 되는지 나온 글은 잘 없었다. 특히 한글로 된 문서.

  • 아래는 8.x로 php가 업그레이드 되면서, 변경된 내역이 정리된 곳
    https://raw.githubusercontent.com/php/php-src/PHP-8.0/UPGRADING.INTERNALS

  • TSRM 관련해서는 제거되었다고하여, 내부 코드에서도 제거해줌으로서 오류 해결함.

  • 아래의 Warning 메시지는 위 링크 내용 중 1-m 에 해당하는 내용이다.

    Warning: Missing arginfo for test_encode() in Unknown on line 0
    👉 m. All internal functions and methods are now required to specify arginfo information, otherwise warnings will be thrown on startup.

// 수정 전 코드
//...
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &fname) == FAILURE) {
    return;
}
//...
static const zend_function_entry php_test_functions[] = {
//  PHP_FE(test_howdy, arginfo_php_test)
    PHP_FE(test_encode_c, NULL)
    PHP_FE_END
};
//...

/test/php-test/php_test.c:58:47: error: expected ')' before 'TSRMLS_CC'
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &fname) == FAILURE) {
/test/php-test/php_test.c:58:47: error: too few arguments to function 'zend_parse_parameters'

// 수정 후 코드
// arginfo가 필수가 되었기 때문에 추가함
ZEND_BEGIN_ARG_INFO(arginfo_test_encode_c, 0, 0, 1)
    ZEND_ARG_INFO(0, input)
ZEND_END_ARG_INFO()
//...
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &fname) == FAILURE) {
    return;
}
//...
static const zend_function_entry php_test_functions[] = {
//  PHP_FE(test_howdy, arginfo_php_test)
    PHP_FE(test_encode_c, NULL)
    PHP_FE_END
};

코드 수정에 참고한 글

수정 후, 아래 내용 다시 실행

[root@05d8d5660933 php-test]# make
[root@05d8d5660933 php-test]# make test
[root@05d8d5660933 php-test]# make install

설정 추가

[root@05d8d5660933 php-test]# touch /etc/php.d/php_test.ini

php_test.ini

[php_test]
extension=php_test.so

설치가 잘 됐다면,

[root@05d8d5660933 php-test]# php -m | grep php-test
php-test

테스트까지 완료되면, so파일을 container 밖으로 꺼내와서 실제 회사 서버에 적용하기

docker cp [컨테이너명]:[파일경로] [호스트경로]
docker cp centos79:/test/php_test/php_test.so ~/php_test.so
profile
프로그래머

0개의 댓글