본문 바로가기
IT, Software/Web

맥북 - php 7.4 + SNMP 사용하기(라이브러리 수동빌드)

by 기타마을이장 2024. 12. 4.

 

뭔가를 조금씩 하다 보니 이번에 새롭게 개발을 해볼 것이 생겼다.

그런데 그냥 php 웹페이지 개발이 아니라, 외부 Device와 SNMP 통신을 해서 그 값을 표시하는 웹페이지 개발이 필요했다.

구글링을 해보니 php 에 있는 SNMP 기능을 활용하는 게 일반적인 것 같아 바로 시도해 봤다.

하지만... 웹페이지를 실행해 보니 'SNMP 라이브러리 없음' 에러가 떡하니 뜬다.

역시 이번에도 한번에 되지 않고 속을 좀 썩이려나 싶었다.

 

[Mon Dec 02 15:18:51.032174 2024] [php7:error] [pid 4565] [client ::1:56008] PHP Fatal error:  Uncaught Error: Class 'SNMP' not found in /Users/fidelislee/api/portal/api-sensor.php:30\nStack trace:\n#0 /Users/fidelislee/api/portal/api-sensor.php(15)

 

SNMP(Simple Network Management Protocol) 란?

먼저 SNMP가 뭐였는지 다시 한번 공부를 해본다. 어렴풋이 기억이 난 것은 시스템 모니터링 용도로 주로 쓰는 프로토콜로 알고 있었다.

예전에 회사 서버장비들을 중앙에서 모니터링 해주는 프로젝트를 진행하면서 해당 프로토콜을 사용했던 기억이 났다.

그리고 위키 백과에 자세한 설명이 되어있어서 한번 읽어보니 내가 알고 있던 그 프로토콜이 맞았다.

모니터링이 주 목적으로 도입된 프로토콜이라서 인지 UDP 방식이고 포트는 161을 사용한다고 한다.

 

간이 망 관리 프로토콜 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 간이 망 관리 프로토콜(Simple Network Management Protocol, SNMP)은 IP 네트워크상의 장치로부터 정보를 수집 및 관리하며, 또한 정보를 수정하여 장치의 동작을 변경하는

ko.wikipedia.org

 

PHP SNMP 라이브러리 설치하기

구글링을 열심히 해보니, 설치하는 방법이 있다고 했다. 그래서 따라 해 봤지만 예상과 다르게 잘 안된다;;;

# brew install php@7.4-snmp

Warning: No available formula with the name "php@7.4-snmp". Did you mean php@7.4-zts?
==> Searching for similarly named formulae and casks...
==> Formulae
shivammathur/php/php@7.4-zts

To install shivammathur/php/php@7.4-zts, run:
  brew install shivammathur/php/php@7.4-zts

 

그래서 이번엔 요즘 대세 GPT에게 도움을 한번 청해봤다.

물론 GPT가 말해주는 대로 따라해도 한 번에 되지는 않았지만, 그래도 결국은 성공을 했다.

방법을 정리해보면,

php@7.4용 snmp 라이브러리를 설치해야 하는 데, brew 혹은 pecl 로는 설치가 안되기 때문에 수동으로 빌드를 해야 한다고 한다.

  1. 그래서 1. brew로 net-snmp, autoconf를 설치해 주고,
  2. php 7.4 소스를 직접 다운받아, snmp extension 폴더로 들어가서 소스를 빌드해 주는 방식으로 진행했다.
    소스를 빌드하면서 만나게 되는 openssl 참조오류를 해결하기 위해 환경변수 작업도 해준다.
  3. 설치가 마무리되면 php.ini 파일을 수정해 주고,
  4. 마지막으로 아파치, php를 재실행해주면 된다.

 

1. brew 로 net-snmp, autoconf 설치

# brew install autoconf net-snmp

...(설치완료)...

For compilers to find net-snmp you may need to set:
  export LDFLAGS="-L/opt/homebrew/opt/net-snmp/lib"
  export CPPFLAGS="-I/opt/homebrew/opt/net-snmp/include"
==> Summary
🍺  /opt/homebrew/Cellar/net-snmp/5.9.4: 554 files, 15.0MB
==> Running `brew cleanup net-snmp`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).

 

2. php 7.4 소스 다운받아 빌드하기

먼저 소스를 다운받고 압축을 푼 다음 빌드 사전준비를 진행한다.(configure 파일 생성)

# mkdir php-src
# cd php-src 
# curl -O https://www.php.net/distributions/php-7.4.33.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 16.0M  100 16.0M    0     0  8797k      0  0:00:01  0:00:01 --:--:-- 8795k
# tar -zxf php-7.4.33.tar.gz 
# cd php-7.4.33/ext/snmp 
# phpize

...(빌드사전준비 완료)...
build/libtool.m4:1917: _LT_AC_TAGCONFIG is expanded from...
build/libtool.m4:70: AC_LIBTOOL_SETUP is expanded from...
build/libtool.m4:52: _AC_PROG_LIBTOOL is expanded from...
build/libtool.m4:39: AC_PROG_LIBTOOL is expanded from...
configure.ac:161: the top level

 

이제 생성된 configure 파일을 실행해 준다.

# ./configure --with-snmp=$(brew --prefix net-snmp)

...(configure 완료)...
checking whether the cc linker (/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld) supports shared libraries... yes
checking dynamic linker characteristics... darwin23.5.0 dyld
checking how to hardcode library paths into programs... immediate
checking whether stripping libraries is possible... yes
checking if libtool supports shared libraries... yes
checking whether to build shared libraries... yes
checking whether to build static libraries... no

creating libtool
appending configuration tag "CXX" to libtool
configure: patching config.h.in
configure: creating ./config.status
config.status: creating config.h

 

이제 make 빌드를 할 차례다.

하지만 openssl 라이브러리 include 오류가 발생되기 때문에 먼저 환경변수 설정부터 해준다.

/opt/homebrew/Cellar/net-snmp/5.9.4/include/net-snmp/library/scapi.h:14:10: fatal error: 'openssl/ossl_typ.h' file not found
   14 | #include <openssl/ossl_typ.h> /* EVP_MD */
      |          ^~~~~~~~~~~~~~~~~~~~
1 error generated.
make: *** [snmp.lo] Error 1

 

# export LDFLAGS="-L$(brew --prefix openssl)/lib"
# export CPPFLAGS="-I$(brew --prefix openssl)/include"
# export PKG_CONFIG_PATH="$(brew --prefix openssl)/lib/pkgconfig"

 

환경변수 설정도 다 마무리됐으니 make & make install을 해준다.

그렇게 성공적으로 설치를 완료할 수 있었다.

# make

...(빌드완료)...
cp ./.libs/snmp.lai /Users/fidelislee/php/php-src/php-7.4.33/ext/snmp/modules/snmp.la
----------------------------------------------------------------------
Libraries have been installed in:
   /Users/fidelislee/php/php-src/php-7.4.33/ext/snmp/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `DYLD_LIBRARY_PATH' environment variable
     during execution

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

Build complete.
Don't forget to run 'make test'.

 

# sudo make install
Password:
Installing shared extensions:     /opt/homebrew/Cellar/php@7.4/7.4.33_7/pecl/20190902/

 

make install을 하고 난 뒤 로그를 보니 정상적인 경로에 라이브러리가 잘 설치된 것 같다.

 

3. php.ini 설정변경(주석제거) & httpd 재기동하기

" /opt/homebrew/etc/php/7.4/php.ini " 파일을 열어 수정해 준다.

- 943라인 주석 제거

 

마지막으로 httpd 를 재기동해 준다. 혹시나 싶어서 그냥 php도 같이 재기동해 줬다.(크게 의미는 없는 듯)

# brew services restart php@7.4
# brew services restart httpd

 

그래도 나름 너무 오래 삽질하지 않고 바로 해결할 수 있어서 다행이었다.

라테는... Stackoverflow에 의지해야 했기에 개개인의 검색능력이 삽질의 시간을 줄여 줬었다.

대신 그런 삽질의 시간 속에서도 당장은 아니더라도 다양한 정보들을 미리 취득하거나 간접체험정도 해볼 수 있었던 것 같다.(물론 쓸데없는 정보가 많았던 것도 사실이다.)

그랬던 추억(?)때문인지 자꾸 꼰대 같은 생각일지 모르겠지만, 가급적이면 GPT에 의지 하지 않고 검색을 스스로 해보려고 노력 중이다.

하지만, 이번에 녀석이 큰 도움을 줘서 나름 고맙게 생각하는 중이다ㅎㅎㅎㅎㅎ (왠지 앞으로 더 자주 이용할 거 같은 불길함이;;;ㅋ)

 

반응형

댓글