회사에서 일할 때 php를 사용하는데, 현재 버전은 php7.x 이고 EOS 도래로 인해 php8.1 로 버전업을 해야 하는 상황이다. php eol
퇴사자 분이, 과거 패킷압축을 위해 c로 개발해둔 모듈이 있는데, php8.1 로 올리려면 새로 빌드를 해야하는 상황이다.
5.x -> 7.x 로 버전업을 할 때도 한 번 새로 빌드를 했었는데, 7.x -> 8.1 로 올리기위해서 이번에 다시 빌드를 해야한다.
이럴 때마다, 과연 자체적으로 모듈들을 (유지보수 하기 쉽지 않은 것) 개발 하는 것이 옳은 일일까? 라는 고민을 하게된다.
우선 빌드 테스트를 위해서 Docker로 centos를 설치하고, php8을 설치해서 테스트를 해봐야할 것 같다. (php8 도커 이미지를 쓸까 생각도 했는데, 회사 환경과 맞춰서 하는게 좋을 것 같단 생각이 들어서 이렇게 하기로 마음 먹었다.
docker pull centos:centos7.9.2009
docker run --privileged --name centos79 -d centos:centos7.9.2009 /sbin/init
docker exec -it centos79 /bin/bash
[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
[root@05d8d5660933 ~]# yum install vim
# 한글깨짐 수정
set encoding=utf-8
set fileencodings=utf-8,cp949
# 컬러스킴 바꾸기
colo desert
syntax on
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