Move

  • Go to : Ctrl + T
  • Go to line : Ctrl + G
  • Peek/Go to Definision : Alt + F12
  • Go To Definision : F12
  • Go To Declaration : Ctrl + F12
  • Find : Ctrl + F
  • Find in Files : Ctrl + Shift + F

Navigating

  • Quick Launch : Ctrl + Q
  • Scroll Bar Map Mode : Ctrl + Q, searching 'map'
  • Class View : Ctrl + Shift + C
  • Open Document : Ctrl + Shift + G
  • Toggle Header/Code File : Ctrl + K, Ctrl + O

Refactoring Code

  • Function Rename : Ctrl + R, Ctrl + R
  • Code up and down : Alt + Up/Down
  • Save : Ctrl + S
  • Save All : Ctrl + Shift + S
  • IntelliSense refresh suggestion : Ctrl + J

Debugging

  • Start : F5
  • Step Over : F10
  • Step Into : F11
  • Step Out : Shift + F11
  • Stop : Shift + F5

Visual Studio with CMake

https://devblogs.microsoft.com/cppblog/cmake-support-in-visual-studio/

 

C++ Refactoring

https://devblogs.microsoft.com/cppblog/all-about-c-refactoring-in-visual-studio-2015-preview/

 

참고

https://devblogs.microsoft.com/cppblog/c-debugging-and-diagnostics/

https://devblogs.microsoft.com/cppblog/c-code-editing-and-navigation-in-visual-studio/

https://devblogs.microsoft.com/cppblog/getting-started-with-visual-studio-for-c-and-cpp-development/

'개발 > C,C++' 카테고리의 다른 글

.dll과 .lib의 차이  (0) 2023.02.23
[C++] invalid new-expression of abstract class type 에러  (0) 2022.04.10

.dll과 .lib의 차이

dll은 동적 공유 라이브러리이고, lib는 dll에 저장된 함수와 데이터에 대한 정보를 담고 있는 파일이다.

(빌드할때 필요함)

.dll (Dynamic Link Library) 

윈도우 운영체제에서 동작하는 동적 공유 라이브러리.

재사용 가능한 코드, 데이터, 리소스를 담고 있는 컴파일된 파일로, 실행 시점에 로딩되고, 여러 프로세스에서 공유하여 사용할 수 있다.

1. 함수를 실행파일에 포함시켜 배포하는 것이 아니라, 별도의 dll 파일로 배포

2. 어플리케이션이 실행 중에 dll에 포함된 함수가 필요하면, dll을 로드하고 해당 함수를 호출함

 

라이브러리란

미리 만들어놓은 함수, 클래스, 자료형, 데이터 등을 모아놓은 것으로, 여러 프로그램에서 재사용될 수 있다.

라이브러리가 생긴 이유

  • 코드의 재사용 및 부품화 실현 : 자주 사용하는 함수들은, 한번 만들어 놓고 다시 사용(라이브러리가 소프트웨어 개발의 부품 같은 역할을 함)
  • 기술 유출 방지 : 소스를 제공하지 않음으로서 중요 기술 유출 방지
  • 개발 시간 단축 : 새로 개발하지 않고 라이브러리의 함수들을 가져다 씀으로서 개발 기간 단축 가능, 새로 개발하는 코드 양이 적어지므로 디버깅도 용이해짐

라이브러리의 종류

  • 정적 라이브러리 (Static library) : 빌드 타임에 정적 링킹을 위해 필요한 라이브러리. 프로그램 빌드 시, 링커가 필요한 함수를 정적 라이브러리에서 찾은 후 복사하여 실행파일에 포함시킨다.
  • 동적 라이브러리 (Dynamic library) : 런타임에 로딩되는 라이브러리. 프로그램 실행 중(런타임)에 해당 함수가 필요할 때 로딩되는 라이브러리이다. 윈도우에서는 주로 DLL 확장자를 가지며, 리눅스에서는 주로 SO 확장자를 가진다.
  • 공유 라이브러리(Shared library) : 여러 어플리케이션이나 프로세스에서 공유되어 사용될 목적으로 만들어진 라이브러리. 예를 들어, 3개의 프로그램에서 A라는 공유 라이브러리를 사용한다고 하면, A는 메모리에 한번만 로드되고 각 프로그램은 로드된 A를 같이 사용한다.

즉, DLL이란 동적 라이브러리공유 라이브러리의 특징을 지닌 라이브러리이다.

 

DLL 구조

실행파일 포맷과 유사하다. 주요 구성요소는 아래와 같다.

  • Export table : 다른 프로그램에서 접근 가능한 함수와 데이터의 리스트를 담고 있는 테이블. DLL의 public interface이다.
  • Import table : DLL이 다른 라이브러리에서 사용하는 함수와 데이터의 리스트를 담고 있는 테이블. DLL의 private interface이다.
  • Code & Data 섹션 : DLL 안에 있는 함수의 구현체와, 그 함수에서 사용되는 데이터이다.
  • 리소스 : DLL에는 여러 프로그램에서 공유할 수 있는 아이콘, 비트맵, 문자열 테이블과 같은 리소스도 포함될 수 있다.

프로그램이 DLL을 로드할 때 먼저 import 테이블을 읽어 DLL이 다른 라이브러리에서 필요로 하는 기능과 데이터를 결정한다. 그런 다음 필요한 라이브러리를 로드한다. import 테이블에서 필요로하는 모든 라이브러리가 로딩되고 나면, 프로그램은 export 테이블을 통해 DLL의 기능과 데이터에 액세스할 수 있다.

전반적으로 DLL의 구조는 여러 프로그램이 동일한 코드와 리소스를 공유할 수 있도록 설계되어 성능이 향상되고 메모리 사용량이 감소할 수 있다.

 

컴파일러가 DLL에 영향을 미치는가?

컴파일러 선택은 특히 DLL이 C++ API를 노출하는 경우 DLL에 영향을 미칠 수 있다. 컴파일러마다 C++ 기호에 대한 이름 맹글링 규칙이 약간 다를 수 있기 때문에 DLL과 이를 사용하는 응용 프로그램 간에 호환성 문제가 발생할 수 있다.

예를 들어 DLL이 특정 버전의 MSVC 컴파일러로 컴파일된 경우 해당 DLL을 사용하는 응용 프로그램도 동일한 버전의 MSVC 컴파일러로 컴파일해야 호환성 문제를 방지할 수 있다.

그러나 DLL이 일반적으로 동적 연결에 사용되는 C API를 노출하는 경우 컴파일러 선택이 덜 중요하다. C API에는 일반적으로 DLL을 빌드하는 데 사용되는 컴파일러와 독립적인 고정 호출 규칙이 있기 때문이다.

 

Name mangling(이름 맹글링)이란?

소스 코드에 선언된 함수 또는 변수의 이름을 컴파일 단계에서 컴파일러가 일정한 규칙을 가지고 변형하는 것

 

Name mangling을 사용하는 이유

  • 객체 지향 언어에서 오버로딩(Overloading) 하는 동일한 이름의 함수를 구별하여 호출하기 위함
  • 다른 Namespace에 있는 동일한 이름의 함수와 변수를 에러 없이 구별하여 호출하기 위함

 

.lib (Library)

DLL에 저장된 함수와 데이터에 대한 정보를 담고 있는 파일.

빌드 타임에 링커가 어플리케이션을 링킹하는데 lib 안의 정보들을 사용한다.

 

 

참고

https://sens.tistory.com/33

https://atmkofw.tistory.com/26

https://en.wikipedia.org/wiki/Library_(computing) 

https://namu.wiki/w/DLL

https://en.wikipedia.org/wiki/Dynamic-link_library

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=v_lovepooh_v&logNo=220377595136

Chat GPT 답변

What's the difference of .dll and .lib?

.dll and .lib are file extensions commonly used in Windows-based systems.

A .dll (Dynamic Link Library) file is a type of library file that contains code and data that can be used by multiple applications at the same time. DLLs are used to implement reusable functionality and reduce the size of executable files by sharing common code. When an application requires a function that is implemented in a DLL, the application loads the DLL and calls the function.

A .lib (Library) file is a file that contains information about functions and data stored in a DLL. The information stored in a .lib file is used by the linker to link the application with the DLL at build time. The .lib file contains information about the functions and data exported by the DLL, as well as information about any dependencies the DLL may have.

In summary, .dll files contain the actual implementation of reusable functionality, while .lib files provide information about the functions and data exported by the .dll file, allowing applications to link to the .dll at build time.

 

What's the difference of shared library and dynamic library?

The terms "shared library" and "dynamic library" are sometimes used interchangeably, but they do have different meanings.
A shared library is a library that is designed to be shared by multiple applications or processes. It is a compiled file that contains code and data that can be loaded and executed by more than one program at the same time. This is achieved through a mechanism called "linking," which is the process of combining one or more object files and libraries into a single executable file. When a program is linked to a shared library, it only includes a reference to the library, not the actual code. This makes the program smaller in size and allows multiple programs to share the same code, which can result in improved performance and reduced memory usage.

A dynamic library is a type of shared library that is loaded into memory at runtime, rather than at compile time. This means that the library code is not included in the executable file, but is loaded from a separate file when the program is run. This allows the program to load and unload the library as needed, which can reduce memory usage and improve performance. Dynamic libraries can also be updated or replaced without the need to recompile the entire program, which can simplify the software development process.

In summary, shared libraries are libraries that can be shared by multiple applications, while dynamic libraries are a type of shared library that is loaded into memory at runtime, rather than at compile time. Dynamic libraries can offer some advantages over shared libraries, such as improved performance and flexibility.

 

What are the compiler effects on dlls?

The choice of compiler can have an effect on the DLL, especially if the DLL exposes a C++ API. This is because different compilers can have slightly different name mangling conventions for C++ symbols, which can lead to compatibility issues between the DLL and the application using it.

For example, if a DLL is compiled with a particular version of the MSVC compiler, an application that uses that DLL must also be compiled with the same version of the MSVC compiler in order to avoid compatibility issues.

However, if a DLL exposes a C API, which is typically used for dynamic linking, the choice of compiler is less important. This is because C APIs typically have a fixed calling convention that is independent of the compiler used to build the DLL.

'개발 > C,C++' 카테고리의 다른 글

[Visual Studio] 단축키  (0) 2023.02.28
[C++] invalid new-expression of abstract class type 에러  (0) 2022.04.10

OPcache란

미리 컴파일된 바이트코드를 공유 메모리에 저장함으로써, 매 요청마다 PHP가 스크립트를 로딩하고 파싱하는 부분을 제거하여 PHP의 성능을 향상시키는 모듈이다.

OPcache improves PHP performance by storing precompiled script bytecode in shared memory, thereby removing the need for PHP to load and parse scripts on each request.

 

OPcache 설치하기

yum install php-opcache

 

OPcache 설정하기

/etc/php.d/10-opcache.ini 설정파일 내용을 아래와 같이 변경해준다.

(각 성능에 관련된 값은 디폴트를 쓰려면 주석 해제하지 않으면 되고, 아니면 서버에 맞게 조정하면 된다.)

- opcache.enable = 1 // 0 이면 비활성화

- opcache.validate_timestamps = 1 // 0이면 변경사항을 반영할 때 수동으로 opcache를 reset 하거나 웹서버를 재부팅 해야 한다.

; Enable Zend OPcache extension module
zend_extension=opcache

; Determines if Zend OPCache is enabled
opcache.enable=1

; Determines if Zend OPCache is enabled for the CLI version of PHP
;opcache.enable_cli=0

; The OPcache shared memory storage size.
opcache.memory_consumption=512

; The amount of memory for interned strings in Mbytes.
opcache.interned_strings_buffer=32

; The maximum number of keys (scripts) in the OPcache hash table.
; Only numbers between 200 and 1000000 are allowed.
opcache.max_accelerated_files=1000000

; The maximum percentage of "wasted" memory until a restart is scheduled.
;opcache.max_wasted_percentage=5

; When this directive is enabled, the OPcache appends the current working
; directory to the script key, thus eliminating possible collisions between
; files with the same name (basename). Disabling the directive improves
; performance, but may break existing applications.
;opcache.use_cwd=1

; When disabled, you must reset the OPcache manually or restart the
; webserver for changes to the filesystem to take effect.
opcache.validate_timestamps=1

; How often (in seconds) to check file timestamps for changes to the shared
; memory storage allocation. ("1" means validate once per second, but only
; once per request. "0" means always validate)
opcache.revalidate_freq=1

 

php-fpm 재시작하기

php-fpm을 사용중이라면, 재시작한다. (사용 안하면 패스)

systemctl restart php-fpm

 

웹서버 재시작하기

systemctl restart httpd

 

동작 확인

phpinfo를 통해, opcache가 제대로 동작하고 있는지 확인한다.

PHP-FPM (FastCGI Process Manager) 이란?

PHP 스크립트를 실행하는 데 사용되는 PHP용 대체 FastCGI 구현입니다. 이를 통해 PHP 프로세스를 보다 잘 관리할 수 있으며 높은 트래픽 부하를 보다 효율적으로 처리할 수 있도록 하여 PHP 애플리케이션의 성능을 향상시킬 수 있습니다. PHP-FPM은 일반적으로 Nginx 및 Apache와 같은 웹 서버와 함께 사용되어 동적 웹 페이지를 제공하고 보다 빠르고 안정적이며 효율적인 PHP 환경을 제공합니다.

 

웹서버는 정적인 HTML 웹문서 파일만을 처리하며, 동적인 페이지 구현을 위해서는 외부 프로그램을 이용해야 합니다.

이를 위해 CGI 방식을 사용할 수 있는데, 이는 요청할 때마다 새로운 프로세스를 생성하여 구동하기에 부하가 많아지면 처리 속도가 느려질 수 있습니다.

이를 해결하기 위해 나온 것이 FastCGI 방식으로, 이미 생성한 프로세스를 재활용하여 처리속도가 빠릅니다.

PHP FastCGI Process Manager인 php-fpm은 이 FastCGI 방식을 구현한 것으로, CGI와 비교해 보다 빠른 성능을 보여줍니다.

 

PHP-FPM 적용방법

Apache에서 PHP-FPM을 사용하려면 PHP와 PHP-FPM을 모두 설치한 다음 Apache가 PHP-FPM과 함께 작동하도록 구성해야 합니다. 

1. PHP, PHP-FPM 설치

apt-get 또는 yum과 같은 운영 체제의 패키지 관리자를 사용하여 PHP를 설치하거나 소스에서 컴파일할 수 있습니다.

yum install php php-fpm -y


2. PHP-FPM 구성

php-fpm.conf 파일을 편집하여 PHP-FPM을 구성해야 합니다. 이 파일에는 수신 주소, 수신 포트 및 기타 PHP-FPM 옵션과 같은 설정이 포함되어 있습니다.

- www.conf의 내용을 아래와 같이 변경 (socket 방식 연동)

# vi /etc/php-fpm.d/www.conf

listen = /var/run/php-fpm/default.sock

listen.owner = apache
listen.group = apache

※ 참고
php-fpm 연동은 1) 소켓 방식과 2) tcp port 방식이 있는데, socket 방식이 더 빠르다고 함.
같은 서버 내에서 연동하는 경우는 socket 방식을,
다른 서버와 연동해야 하는 경우는 tcp port 방식을 사용하면 될 듯.

 

- 폴더 생성

/var/fun/php-fpm 폴더가 없다면 생성합니다.

mkdir /var/run/php-fpm


3. Apache 구성

mod_fastcgi 또는 mod_fcgid Apache 모듈을 설치한 후 Apache conf 파일을 수정해야 합니다.

- mod_fcgid 설치

yum install mod_fcgid -y

- php.conf 에 아래 내용 추가

# vi /etc/httpd/conf.d/php.conf

<Proxy "unix:/var/run/php-fpm/default.sock|fcgi://php-fpm">
    	ProxySet disablereuse=off
</Proxy>
 
<FilesMatch \.php$>
	SetHandler proxy:fcgi://php-fpm
</FilesMatch>
 
AddType text/html .php
 
DirectoryIndex index.php
 
<FilesMatch \.phps$>
	SetHandler application/x-httpd-php-source
</FilesMatch>

 

4. SSL 구성

SSL 보안접속을 사용하고 있다면, SSL conf 파일도 수정해주어야 합니다.

- ssl.conf 파일도 아래 내용 반영 (파일 마지막에, VirtualHost 태그 닫히기 전에 php-fpm 설정 내용 추가)

# vi /etc/httpd/ssl.conf

# [...]
#   Per-Server Logging: 
#   The home of a custom SSL log file. Use this when you want a 
#   compact non-error SSL logfile on a virtual host basis. 
CustomLog logs/ssl_request_log \ 
         "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" 
         
# configuration for php-fpm start
<Proxy "unix:/var/run/php-fpm/default.sock|fcgi://php-fpm"> 
  ProxySet disablereuse=off 
</Proxy> 
<FilesMatch \.php$> 
  SetHandler proxy:fcgi://php-fpm 
</FilesMatch>
# configuration for php-fpm end

</VirtualHost>

 

5. php-fpm 서비스 등록 및 실행

systemctl enable php-fpm
systemctl start php-fpm

 

6. apache 재시작

systemctl restart httpd

 

7. 사이트 접속하여 정상 동작하는지 확인

 

참고

https://docs.rockylinux.org/ko/guides/web/php/

https://wallydev.com/posts/4602d549-ecbd-11ed-a8d7-06aa2d67633f

https://www.baragi.net/bbs/board.php?bo_table=dev&wr_id=8771

https://serverok.in/centos-7-apache-use-php-fpm

https://webhostinghero.org/centos-apache-php-fpm/

 

인코딩 (Encoding)

인코딩 이란

사람이 인지할 수 있는 문자(언어)를 약속된 규칙에 따라 컴퓨터가 이해하는 언어(0과 1)로 이루어진 코드로 바꾸는 것을 통틀어 일컫는다.

즉, encoding이란 정해진 규칙에 따라 코드화, 암호화, 부호화 하는 것을 말한다.

 

문자 셋 (Character Set) = 코드표

인코딩과 디코딩을 위해 미리 정해놓은 규칙으로, 초기 표준 문자열 셋은 ASCII 등이 있었음.

그러나 인터넷이 전 세계로 보급되면서 이로 표현할 수 없는 문자들이 등장하여 이들을 포함한 새로운 문자 셋이 등장하게 됨 (유니코드 등)

 

문자 인코딩과 문자 셋

- 문자 인코딩 : 문자를 컴퓨터가 이해할 수 있는 신호로 만드는 것

- 문자 셋 : 인코딩과 디코딩을 위해 미리 정해놓은 규칙 (매핑표)

 

 

인코딩의 종류

문자 인코딩, 사진&오디오&비디오 인코딩 등이 있다.

 

문자 인코딩 (Character Encoding)

"문자"를 "bytes (바이트)"로 변환시킨다.

 

ASCII Encoding

미국에서 정의하고 있는 표준, 영문 알파벳을 위한 대표적인 문자 인코딩

- 7bit 인코딩으로 총 1byte(8bit)에서 7bit을 사용하여 128개의 문자를 표현할 수 있음 (0~127)

- 나머지 1bit은 에러 검출을 위한 Parity bit으로 비워두어, 총 1 byte로 문자를 표현

(7개의 비트 중 1의 개수가 홀수면 1, 짝수면 0으로 설정된 Parity bit를 함께 전송함.)

 

확장아스키코드(Extended ASCII) = ANSI 코드

기존 아스키 코드의 7bit이 아닌 8bit을 문자를 표현하는데 사용하여 총 256개의 문자 표현이 가능함

 

멀티바이트 인코딩(Multibyte Encoding)

처음 멀티바이트 인코딩이 사용된 것은 CJK(Chinese-Japanese-Korean) 멀티바이트 인코딩으로

한국어, 중국어, 일본어는 문자의 수가 매우 많기 때문에 확장아스키코드 영역의 128개로도 부족했기 때문에 등장

따라서 1byte가 아닌 여러 byte를 통해 문자를 표현한 것이 멀티바이트 인코딩이다.

한국의 인코딩 방식은 여러 인코딩 방식을 거쳐왔다.

  • 조합형 한글 인코딩
    • 한글의 자음과 모음을 조합해서 표현 
    • 2byte 조합, 3byte 조합, N byte 조합과 같은 여러 방식을 사용
  • 완성형 한글 인코딩
    • 자음과 모음을 합쳐서 완성된 문자로 표현 
    • EUC-KR : 2350자 / CP949(MS949) : 11172자 를 사용

UNICODE Encoding

멀티바이트 인코딩 문제는 한국에 국한된 문제가 아니라, 중국어 일본어 등에도 발생한 문제

각자의 언어를 표현할 수 있는 인코딩 방식과 다른 문자열 셋을 사용하기에, 모든 언어를 동시에 표현할 수가 없었음

결국 전 세계의 모든 문자를 하나의 문자 셋으로 표현할 수 없을까? 라는 문제가 등장

이에 전 세계의 모든 문자 집합을 하나로 모아 탄생시킨 것이 유니코드

 

- 모든 문자를 2bytes로 표현하려 했으며, 이론적으로 65536개의 문자를 표현 가능

- 2bytes로 모두 담지 못하는 문자들이 있어(한글의 조합, 한자, 히라가나 등), 1byte로 평면을 나누어 총 2~3bytes를 통해 유니코드로 표현

- 유니코드 나타내는 U+와 16진수를 합쳐 U+0000 ~ U+FFFF 까지 문자 표현 가능

- 앞에 평면을 위한 1byte인 U+00에서 U+FF를 추가 가능 (총 256개의 평면 가능)

 

구현 방법에 따라 여러가지로 나뉨

* UTF-8 Encoding

유니코드 인코딩 중 가장 기본. 8bit을 기본으로 사용하며, ASCII 코드와 직접 호환 가능

하지만 가변 인코딩 방식이라 각 글자마다 1~4bytes로 상이한 바이트 수를 가지게 되어 string 조작이 힘듦

 

* UTF-32 Encoding

UTF-8과 반대로 최대 메모리를 사용. 각 글자는 고정된 4bytes의 넓이를 가지고 있어 string 조작이 간편해짐.

 

* UTF-16 Encoding

UTF-8과 UTF-32를 반반 섞은 인코딩

대부분의 글자를 고정된 너비(fixed width) 2bytes 를 가지고, 특수한 경우 이를 넘어가는 가변 너비를 가짐

 

Base64 Encoding

Binary Data를 Text로 바꾸는 Encoding(Binary-to-text encoding)의 하나로써,

Binary Data를 Character set에 영향 받지 않는 공통 ASCII 영역의 문자로만 이루어진 문자열로 바꾸는 인코딩

* 사용하는 이유

- 문자를 전송하기 위해 설계된 Media(Email, HTML) 등을 이용해 플랫폼 독립적으로 Binary Data(이미지나 오디오)를 전송할 필요가 있을 때, ASCII로 전송하게 되면 나오는 문제를 해결하기 위해 등장

- 문제 1. ASCII는 7bit encoding인데 나머지 1bit을 처리하는 방식이 시스템별로 상이함

- 문제 2. 일부 제어문자의 경우, 시스템별로 다른 코드값을 가짐

이에 ASCII는 시스템간 데이터 전달에 안전하지가 않기에, Base64는 ASCII 중 제어문자와 일부 특수문자를 제외한 64개의 안전한 출력 문자만 사용하여 인코딩함

 

URL Encoding

인터넷을 통해 전송될 수 있는 포맷으로 문자를 변환시키는 인코딩 방식 

* 사용하는 이유

- URL은 ASCII 셋 문자 집합만을 사용하기에, 그 외의 문자는 유효한 ASCII 형식으로 변환되어야 함 ('%XX' 의 형식)

- ASCII 문자라도 예약된 의미를 가지는 경우, 예약된 의미가 아닌 문자 자체의 의미를 전달하고 싶은 경우 이스케이프 처리가 필요하기 때문

* 형식

- 기존 문자열의 HEX값 앞에 '%' tkdyd

- 한글 : UTF-8 사용

 

HTML Encoding

HTML 문서 안에 있는 특정한 문자들을 안전하게 브라우저에 표시하기 위해 사용되는 인코딩

* 사용하는 이유

- HTML 내에서 스크립트와 같이 특수한 기능을 하는 문자들을 안전하게 표현하여 보안성을 높이기 위해 사용함

- XSS(크로스 사이트 스크립트) 의 방어 대책으로 사용됨

* 형식

- ASCII 코드값을 기준으로 인코딩 됨

- 코드의 앞에 %# 문자가 포함됨

 

디코딩(Decoding)

인코딩의 반대되는 개념으로 복호화, 역코드화의 의미를 가짐

컴퓨터가 이해하는 언어를 사람이 이해할 수 있는 언어로 바꾸는 것

 

참고

https://simyj.tistory.com/14

https://effectivesquid.tistory.com/entry/Base64-%EC%9D%B8%EC%BD%94%EB%94%A9%EC%9D%B4%EB%9E%80

https://limvo.tistory.com/7

윈도우 운영체제에서 php 7.4를 설치하고, VScode 디버깅 설정하는 방법을 정리한다.

 

PHP 7.4 설치

1. 아래 사이트에서 windows용 php를 다운받는다. (설치할 버전)

https://windows.php.net/download/

 

2. 적절한 폴더에 압축을 해제한다.

예) C:/APM/php-7.4.33-Win32-vc15-x64

 

3. httpd.conf 파일 설정에서, php 경로를 변경해준다.

PHPIniDir "C:/APM/php-7.4.33-Win32-vc15-x64"
LoadModule php7_module "C:/APM/php-7.4.33-Win32-vc15-x64/php7apache2_4.dll"
AddType application/x-httpd-php .html .php
AddHandler application/x-httpd-php .php

 

4. 고급 시스템 설정에 php 경로를 등록해준다. (어디서든 php.exe 실행 가능하게 하려면)

예) C:/APM/php-7.4.33-Win32-vc15-x64 추가

 

5. 아파치를 재시작한다.

서비스 > Apache2.4 다시시작

 

VScode 에 php 디버깅 설정

1. cmd 창에 "php -i" 입력하면 phpinfo 내용이 쭉 나온다. 전부 복사한다.

 

2. https://xdebug.org/wizard 사이트에 가서 해당 내용을 붙여넣는다.

 

3. Analyse my phpinfo() output 버튼을 클릭한다.

 

4. 내 정보가 나오고, 해당 내용에 맞는 dll을 다운받을 수 있는 녹색 링크가 나온다. 클릭해서 다운받는다.

5. php 압축 푼 폴더 하위에 해당 dll을 복사한다.

예) C:\APM\php-7.2.34-Win32-VC15-x64\ext\php_xdebug-3.0.0-7.2-vc15-x86_64.dll

 

6. cmd 창에 php -m 입력해서 [PHP Modules]와 [Zend Modules]에 Xdebug가 있는지 확인한다.

 

7. php.ini 파일 설정을 변경한다.

- 기존 설정이 있는 경우, 동일하게 맞춤

- 디버깅을 위해, 아래와 같이 xDebug 설정을 추가한다.

예) C:/PHP/php-7.4.33-Win32-vc15-x64/php.ini 

[xDebug]
zend_extension = C:/APM/php-7.4.33-Win32-vc15-x64/ext/php_xdebug-3.1.6-7.4-vc15-x86_64.dll
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host = localhost
xdebug.client_port = 9003
xdebug.output_dir = C:/APM/php-7.4.33-Win32-vc15-x64/tmp

 

8. 아파치를 재시작한다.

 

9. VScode를 열어, launch.json 파일 내용을 아래와 같이 수정한다.

(위 php.ini 에서 설정한 port 가 일치하도록 하고, php가 설치된 경로를 넣어준다.)

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "runtimeExecutable": "C:/APM/php-7.4.33-Win32-vc15-x64/php.exe",
            "request": "launch",
            "port": 9003
        },
        {
            "name": "Launch currently open script",
            "type": "php",
            "runtimeExecutable": "C:/APM/php-7.4.33-Win32-vc15-x64/php.exe",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "port": 9003
        },
        {
            "name": "Launch Index",
            "type": "php",
            "runtimeExecutable": "C:/APM/php-7.4.33-Win32-vc15-x64/php.exe",
            "request": "launch",
            "program": "${workspaceRoot}/index.php",
            "cwd": "${workspaceRoot}",
            "port": 9003
        }
    ]
}

 

10. VScode에서 settings.json을 열어 php path를 아래와 같이 바꾸어준다.

    "php.validate.executablePath": "C:/APM/php-7.4.33-Win32-vc15-x64/php.exe",
    "php.validate.enable": false,
    "php.executablePath": "C:/APM/php-7.4.33-Win32-vc15-x64/php.exe",

 

11. 테스트용 index.php 파일 만들고, VScode에서 F5 눌러 디버깅 모드 실행한다.

 

12. 웹 브라우저에서 index.php를 실행해본다. 디버깅이 걸리면 성공!

현재 워드프레스 6.1.1에서 지원하는 안정적인 최신버전은 php 7.4이다.

(php 8.x 는 beta support 중이라.. 바로 쓰기는 불안하다)

 

이에 기존 php 7.2 버전을 php7.4로 업그레이드 하는 작업을 했다.

(운영체제 : CentOS 7)

 

1. 기존 PHP 삭제 

- 현재 설치된 php 리스트 확인

yum list installed | grep php

- php 삭제

yum remove php-*
위 명령어로 삭제가 안될때, 
yum remove --setopt=clean_requirements_on_remove=1 php php-common php-cli php-devel php-fpm php-gd php-json php-ldap php-mbstring php-mysqlnd php-odbc php-pdo php-imagick php-snmp php-soap php-xml php-xmlrpc php-opcache

 

2. EPEL 설치

 - EPEL(Extra Packages for Enterprise Linux) 각종 패키지의 최신 버전을 제공하는 저장소

yum install epel-release yum-utils -y

 

3. 기존 php7.2 remi 저장소 비활성화

yum-config-manager --disable remi-php72

 

4. php7.4 저장소 활성화

yum-config-manager --enable remi-php74

 

5. yum install 로 php7.4 버전 및 모듈들 설치

yum install php php-common php-cli php-devel php-fpm php-gd php-json php-ldap php-mbstring php-mysqlnd php-odbc php-pdo php-imagick php-snmp php-soap php-xml php-xmlrpc php-opcache -y

 

6. 설치된 php 버전 확인

php -v

 

7. php.ini 수정

기존 설정이 있다면, 그대로 변경해줌

 

8. 아파치 재시작

systemctl restart httpd

9. 사이트 정상 동작하는지 확인

 

참고

https://www.ezeelogin.com/kb/article/how-to-upgrade-php-to-7-4-on-centos-7-393.html

https://sailer.tistory.com/entry/Cent-OS-7-PHP-%EB%B2%84%EC%A0%84-%EC%98%AC%EB%A6%AC%EA%B8%B054-74

데브옵스에서 사용되는 툴들 모음 & 간략한 요약

Jira (지라)

Atlassian 사에서 개발한 이슈 추적 제품이며 버그 추적, 이슈 추적, 프로젝트 관리 기능을 제공하는 소프트웨어이다.

https://en.wikipedia.org/wiki/Jira_(software) 

Git (깃)

분산형 버전 관리 시스템(Version Control System)이다. 소스코드를 효과적으로 관리할 수 있게 해주는 무료, 공개 소프트웨어이다.

https://git-scm.com/book/ko/v2

GitHub (깃허브)

깃허브(Github)는 분산 버전 관리 툴인 깃(Git)를 사용하는 프로젝트를 지원하는 웹호스팅 서비스이다

https://ko.wikipedia.org/wiki/%EA%B9%83%ED%97%88%EB%B8%8C

Docker (도커)

도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이다. Docker는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있다. Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며 코드가 문제없이 실행될 것임을 확신할 수 있다.

https://aws.amazon.com/ko/docker/

https://en.wikipedia.org/wiki/Docker_(software) 

https://khj93.tistory.com/entry/Docker-Docker-%EA%B0%9C%EB%85%90https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html

Ansible (앤서블)

앤서블이란, IaC(Infrastructure as a Code)를 가능하게 해주는 소프트웨어 툴의 집합이다. 소프트웨어 프로비저닝, 설정 관리, 배포 기능을 포함하는 파이썬 기반의 오픈소스이다. Ansible의 주요 목적은 IT 장비 관리를 자동화하는 것이다.

https://en.wikipedia.org/wiki/Ansible_(software)

Chef (셰프)

Ruby와 Erlang으로 작성된 구성관리 도구이다. 회사의 서버의 구성 및 유지보수 작업을 간소화하며, 인터냅, 아마존 EC2, 구글 클라우드 플랫폼, 오픈스택, 소프트레이어, 마이크로소프트 애저, 랙스페이스와 같은 클라우드 기반 플랫폼들과 통합하여 자동으로 새로운 머신을 프로비저닝하고 구성할 수 있다.

https://ko.wikipedia.org/wiki/%EC%85%B0%ED%94%84_(%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4)

https://en.wikipedia.org/wiki/Progress_Chef

Puppet (퍼펫)

ruby로 만들어진 시스템 관리 자동화 툴이다. 주로 설정, 관리, 배포, orchestrate와 같은 일을 하기 위해 사용된다. 다수의 서버플랫폼을 코딩을 통해 관리하는 Infrastructure as a code 서비스를 제공하는 구성 관리 도구 (configuration management tool)이다. 

https://en.wikipedia.org/wiki/Puppet_(software) 

https://barram.tistory.com/m/23

Gradle (그래들)

Groovy를 이용한 빌드 자동화 시스템이다.  컴파일, 패키징, 테스팅, 디플로이, 퍼블리싱 과정을 관리한다. Ant Maven과 같은 이전 세대 빌드 도구의 단점을 보완하고 장점을 취합하여 만든 오픈소스로 공개된 빌드 도구이다.  안드로이드 스튜디오의 공식 빌드 도구이기도 하다.

https://en.wikipedia.org/wiki/Gradle

https://github.com/gradle/gradle

https://madplay.github.io/post/what-is-gradle

https://kotlinworld.com/311

Maven (메이븐)

자바 프로젝트를 겨냥한 빌드 자동화 툴이다. Apache Ant의 대안으로 만들어졌다. 프로젝트 객체모델(Project Object Model: POM) 이라는 개념을 바탕으로  프로젝트의 의존성관리, 라이브러리관리, 프로젝트 라이프사이클 관리 기능등을 제공하는 프로젝트 관리도구이다. 

https://en.wikipedia.org/wiki/Apache_Maven

https://cheershennah.tistory.com/151

Jenkins (젠킨스)

오픈 소스 자동화 서버이다. 소프트웨어 배포와 관련된 작업들(빌드, 테스트, 배포)를 자동화하여 지속적 통합(Continuous Integration, CI)과 지속적 배포(Continuous Delivery, CD)를 도와준다. 소스 버전 관리 툴과 연동하여 코드 변경을 감지하고, 자동화 테스트를 포함한 빌드를 수행하여 소프트웨어 품질을 향상시킬 수 있다.

https://en.wikipedia.org/wiki/Jenkins_(software) 

https://narup.tistory.com/179

https://www.itworld.co.kr/news/107527

Kubernetes (쿠버네티스)

쿠버네티스란 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하는 오픈 소스 시스템이다. (컨테이너 오케스트레이션 소프트웨어)

https://en.wikipedia.org/wiki/Kubernetes

https://tech.ktcloud.com/67

OpenShift (오픈시프트)

컨테이너 기반 소프트웨어의 디플로이 및 관리를 위한 레드햇의 컴퓨터 소프트웨어 제품이다. 구체적으로 말해, 가속화된 애플리케이션 개발을 위해 도커 컨테이너와 데브옵스 도구를 사용하는 쿠버네티스의 지원 배포판이라 할 수 있다. (컨테이너 오케스트레이션 소프트웨어)

https://en.wikipedia.org/wiki/OpenShift

https://ko.wikipedia.org/wiki/%EC%98%A4%ED%94%88%EC%8B%9C%ED%94%84%ED%8A%B8

https://www.redhat.com/ko/topics/containers/red-hat-openshift-kubernetes

OpenStack (오픈스택)

풀링된 가상 리소스를 사용하여 프라이빗  퍼블릭 클라우드를 구축하고 관리하는 오픈소스 플랫폼이다. Infrastructure-as-a-service(IaaS) 형태로 제공된다.

https://en.wikipedia.org/wiki/OpenStack

https://www.redhat.com/ko/openstack-35971

 

'개발 > 방법론,디자인패턴' 카테고리의 다른 글

[DevOps] 데브옵스란?  (0) 2022.08.23

+ Recent posts