BACK-END

php


SESSION의 동작방식과 사용법 (feat. PHP)


오늘은 세션의 동작원리들과 주의할점! 그리고 사용법에 관해 포스팅하도록 하겠습니다.


시작하기 전에 먼저 세션에 대해 간단히 설명하자면 세션은 컴퓨터 시스템의 관리자(또는 OS 또는 서버)가 자신의 자산을 이용하는것을 허락한 사용자 (컴퓨팅)를 인식한 일정한 기간을 가리키는것으로 광범위하게 이해될 수 있습니다. 위키백과;세션


쿠키와의 차이점은 쿠키는 정보를 사용자의 컴퓨터에 저장하는 반면, 세션은 정보를 서버에 저장한다는 점에서 비교적 보안성이 더 우수합니다.

또한, 세션은 쿠키에 비해 큰 용량의 데이터를 저장할 수 있습니다.

하지만 세션의 동작방식을 알아보면 세션도 고유식별자를 확인하는데 있어, 쿠키를 이용하긴 합니다.

그러나, 쿠키를 이용하긴하지만 오로지 쿠키에만 의존적이진 않습니다.

뭐, 쿠키없이 사용할 순 있지만, 쿠키를 이용하면 더 편하게 세션을 이용할 수 있다는 뜻입니다.!


그럼 이제! 세션사용법을 간단하게 알아보도록 하겠습니다.

세션위주로만 설명하므로 자세한 소스는 생략합니다! PHP 세션 로그인 예제 보러가기






SESSION 설정 보기



세션을 사용해보기 전에 기본적인 session 설정부터 알아보겠습니다.

php.ini 파일을 보면 세션에 관한 내용들이 정의되어 있습니다.

나는 ini 파일을 수정하지 않겠다! 혹은 파일을 볼 수 없다! 의 경우 phpinfo() 함수를 이용하여 session 으로 찾아보면 설정된 내용을 볼 수 있습니다.

ini 파일 위치를 모르겠다! 싶을 때도 phpinfo() 함수를 사용해서, Loaded Configuration File 로 검색하면 위치를 찾을 수 있습니다.

아래는 phpinfo() 로 확인한 세션정보입니다.


설정정보들 중 몇가지만 알아보자면,

session.name : 세션ID를 저장할 쿠키의 이름입니다. 보통 PHPSESSID 로 사용하며, php의 세션함수 session_name()로 가져올 수 있습니다.

session.cookie_path : 세션ID를 저장할 쿠키의 경로입니다. 가끔 쿠키삭제가 안될 경우에 setcookie() 마지막 파라미터에 이 경로를 직접 지정해주면 삭제가 잘됩니다!

session.save_path : 세션이 저장되는 경로입니다. 따로 지정해 주지 않을경우, 이 경로 하위에 세션파일들이 쌓입니다.

session.use_cookies : 세션ID를 저장하는데 쿠키를 사용할지 하지 않을지를 정합니다. 1은 사용함을 나타내며 사용하지 않을경우 아래옵션을1로 설정해주어야합니다.

session.use_trans_id : 세션ID를 저장하는데 쿠키를 사용하지 않을경우, 이 옵션을 1로 변경해주어야 합니다.

session.gc_maxlifetime : 지정된 시간(초) 이 지난 세션은 폐기 대상으로 간주합니다.



위의 설정 값을 바꾸고싶은데 특정 프로젝트에서만 동적으로 변경하고자 하는 경우나, php.ini 파일에 접근 할 수 없는 경우에는 php의 ini_set() 함수를 사용하시면 됩니다

ex) ini_set("session.save_path" , "./sessions/")





SESSION 사용하기



그럼이제 사용법을 알아보도록 하겠습니다.


1. 세션 시작


세션 혹은 세션변수를 사용하기 위해서는 사용전에 반드시 session_start() 로 세션을 시작해줘야합니다.


PHP

<?php session_start(); ?>


이 함수와 함께 세션이 시작되는 순간 우리 브라우저에는 PHPSESSID 란 이름의 쿠키가 생성됩니다.

세션 설정 정보의 session.name 값을 변경하지 않으면 기본적으로 쿠키명은 PHPSESSID 입니다.

이 때 생성되는 쿠키의 값은 세션이 시작될 때 내부적으로 생성된 유일한 식별자입니다. ID라고 칭하겠습니다.

세션은 쿠키로 저장된 이 ID 값을 통해 세션을 찾습니다. 쿠키가 생성됨과 동시에 우리 서버에는 sess_ID값 이름으로 된 session 파일이 생성됩니다.

따로 지정해 주지 않을 경우 상단의 설정 정보 설명의 session.save_path 에서 지정된 경로 하위에 생성됩니다.


주의사항: session_start() 함수는 헤더데이터를 전송하기 때문에 함수를 사용하기 이전에 화면에 출력되는 어떠한 코드도 있어서는 안됩니다.


이렇게, 파일과 쿠키가 생성되면 우리는 세션을 사용할 수 있습니다.


2. 세션 저장


로그인이라고 가정하고 사용자의 이름과 아이디를 세션변수에 저장해봅시다.


PHP

<?php session_start(); $_SESSION["user_id"] = $user_id; $_SESSION["user_name"] = $user_name; ?>



이렇게 저장된 세션변수는 session_start() 되는 곳 어디서든 사용이 가능하게 됩니다! (쿠키와 서버의 파일이 둘다 삭제되지 않는 다는 가정하에)


3. 세션 삭제


마지막으로 세션을 삭제 하는 부분입니다.

사실 세션을 확실히 삭제 하고자하면, 세가지 절차가 필요합니다.


PHP

<?php $_SESSION = array(); //1. 세션변수초기화 if(isset($_COOKIE[session_name()]) ) { setcookie(session_name(), '', time() -3600, "/"); } //2. 쿠키삭제 session_destroy(); //3. 세션데이터삭제 ?>


먼저, 세션변수를 초기화 합니다.

session_destroy() 함수는 서버의 세션파일을 삭제해주지만, $_SESSION 변수까지 초기화 시켜주지는 못합니다.

예를들어 아래와같이, 세션을 $_SESSION 변수에 저장한 후, session_destroy() 한 후, 세션변수를 출력해보면, 저장된 내용이 초기화 되지 않고 그대로 나오는 것을 볼 수 있습니다.


PHP

<?php session_start(); $_SESSION["user_id"] = $user_id; $_SESSION["user_name"] = $user_name; session_destroy(); //3. 세션데이터삭제 print_r($_SESSION); ?>


물론, 다른페이지에서 session_start() 로 다시 세션을 시작해 사용할 경우, 식별자(ID) 쿠키 값이 남아있어도 서버의 파일데이터가 삭제 되었기 때문에 해당 값을 찾을 수 없습니다.

하지만 세션을 시작한 페이지와 현재 페이지가 같다면 $_SESSION 변수 안에 값이 그대로 남아있겠죠!!

그러므로 초기화 시켜주도록 합시다!


두번째로, 쿠키를 삭제합니다.

session_name() 함수로 쿠키의 ID를 가져와서 쿠키를 삭제하도록 합니다.

쿠키를 삭제 하지 않는 경우, session_start() 하는 경우 PHPSESSID로 저장된 쿠키 식별자를 읽어와 파일을 찾으려 시도합니다.

불필요한 행위는 하지않도록 해주는게 좋겠지요!


마지막으로 세션데이터를 파괴합니다.(sess_xxxx 파일 삭제)

session_destroy() 함수로 session_start() 되는 시점에 등록된 식별자 값에 대한 세션데이터를 서버에서 모두 삭제합니다.

session_destory() 로 세션을 폐기해주지 않으면, 세션정보 파일이 서버에 계속 쌓이게 됩니다.

물론 일정 시간이 지난 세션은 서버가 데이터를 폐기하기도 하지만, 이 시간을 짧게 설정할 수록 서버의 부하가 늘어납니다.

session_destroy() 함수를 사용해 명시적으로 폐기시켜주도록 합시다!




php


[PHP] PHP 에서 move_uploaded_file 실패하는 경우


PHP 에서 move_uploaded_file 을 사용해서 서버에 파일업로드를 하려고 할 때, 기존에 이미 설정한 폴더가 아닌 새로운 폴더에 업로드 하고자하면 파일 업로드가 안되곤 합니다.

이 경우, 파일용량 제한때문이 아니라면 주로 리눅스 서버에서 해당 폴더의 권한이 제대로 설정되어 있지 않을 확률이 높습니다.


FTP 등이 아닌 웹 환경에서 파일업로드를 해야하는 경우, 사용자 본인이 아닌 아파치에게 쓰기 권한이 설정되어있어야 합니다.




서버에서 원하는 폴더에 권한을 757 (rwxr-xrwx) 로 설정해주거나,


Bash(CentOS)

[root@ upload_dir]# chmod 757 mingcho[디렉토리경로]


사용하는 툴에서 CHMOD 기능이 있는 경우 변경해주면 됩니다.



물론 변경 후에는 기타사용자에게 쓰기 권한이 주어지기 때문에, 무분별한 파일이 업로드 되지 않도록 확장자검사, 특수문자검사 등의 방어조치를 취해야합니다.


마지막으로 변경된 폴더로 업로드 해봅시다아.

사실은 move_uploaded_file 함수는 업로드개념보다는 함수명그대로 서버의 tmp 폴더 내부에 임시로 저장된 파일을 내가 원하는 경로로 이동시키는 함수입니다.


PHP

<?php define("UPLOAD_PATH", "/images/"); $tmp_name = $_FILES["name_attr"]["tmp_name"]; //임시저장된 파일을 $target = UPLOAD_PATH.time().$_FILES["name_attr"]["name"]; // /images/1210123112upload_file.jpg move_uploaded_file($tmp_name, $target); //저장 찰칵찰칵 ?>




php


[PHP] PHP 문자열 큰따옴표(") 와 작은따옴표(') 의 차이점



PHP 에서 문자열 작성시에는 아래와 같이 큰따옴표("") 나, 작은따옴표('')를 사용하여 표현합니다.


<?php $a = "double quote"; $b = 'single quote'; ?>


무분별하게 사용하기도 하지만 문자열사용시 큰따옴표("") 와 작은따옴표('')를 사용하는 것은 PHP 내부적으로 차이가 있습니다.





PHP는 문자열을 다룰 때 큰따옴표 안의 문자열의 경우 변수를 찾아내는 과정을 거칩니다.

반면, 작은 따옴표 안의 문자열의 경우 순수 문자열로 인식하여 그대로 보여주게 됩니다.


<?php $text = " 입니다"; echo "double quote $text"; //실행결과 : double quote 입니다. echo 'single quote $text'; //실행결과 : single quote $text ?>


위 예제의 경우 큰따옴표("") 안의 문자열에 사용한 변수는 변수의 값이 제대로 적용 된 데 반해, 작은따옴표('') 안의 변수는 그대로가 문자로 표현되었습니다.


큰따옴표("") 와 작은따옴표('') 의 차이는 변수의 처리 뿐만아니라 확장문자 의 처리에서도 존재합니다.

줄을 개행시켜주는 개행문자 \n 의 경우 큰따옴표안에서는 개행문자로 인식하지만, 작은 따옴표안해서는 일반 문자열로 인식됩니다.


<?php echo "double quote \n"; //실행결과 : double quote echo 'single quote \n'; //실행결과 : single quote \n ?>


위와 같이 작은따옴표 안에서는 대부분의 확장문자가 문자열로 인식되기때문에, 확장문자를 써야하는 경우 큰따옴표("")를 써야합니다.

단, 예외적으로 \' 나 \\ 의 경우 작은따옴표('') 안에서도 사용가능합니다.


<?php echo "사용가능 확장문자 \'"; //실행결과 : 사용가능 확장문자 \' echo '사용가능 확장문자 \''; //실행결과 : 사용가능 확장문자 ' ?>


위의 경우 큰따옴표("") 안에서는 \' 가 문자열로 처리된 반면, 작은따옴표('') 안에서는 확장문자로 처리되었습니다.

상황에 맞게 잘 사용하도록합시다!





[CentOS] Apache MIME TYPE 설정하기!



웹페이지에서 비디오나 오디오 , 이미지 등 멀티미디어 파일을 출력하려고 하거나, 그 외 기타 다른 파일들을 웹상에서 활용하려고 할 때,

클라이언트의 브라우저나, 웹 서버 상에 해당 파일 포맷(확장자)에 대한 MIME TYPE 이 등록되어 있지 않으면, 보여주고자 하는 컨텐츠를 웹상에서 제대로 확인 할 수 없습니다.


기존에 없던 파일 포맷이 새로 생겼다고 가정했을 때, 이 포맷을 웹서버에 MIME TYPE에 등록해 주지 않으면 웹서버는 이 확장자들을 인식하지 못합니다.


예를들어, 로컬에서는 문제없이 잘 재생되던 미디어 파일이 웹서버에 업로드 후 재생되지 않는 다면 이 문제일 수 있습니다.




웹서버(Apache) 에 MIME TYPE 설정하기




OS의 배포판에 따라 설정파일의 위치는 조금씩 다를 수 있습니다.

아파치의 경우 주로, /etc/mime.types 에 위치하지만 해당 위치에 파일이 없는 경우 httpd.conf 파일을 확인합니다.


Bash(Linux)

[root@ /]# vi /etc/httpd/conf/httpd.conf


해당파일에서 <IfModule mime_module> 하위에 TypesConfig 를 보면 mime.types 파일의 위치를 확인 할 수 있습니다.


Bash(Linux)

<IfModule mime_module> # # TypesConfig points to the file containing the list of mappings from # filename extension to MIME-type. # TypesConfig /etc/mime.types


파일의 위치를 찾았으면, 해당 파일을 vi로 연 후,


Bash(Linux)

[root@ /]# vi /etc/mime.types


MIME TYPE 종류보기

추가하고자 하는 MIME TYPE 을 추가한 후, 아파치를 재시작 해주면 끝!





PHP 의존성 관리도구 - Composer 사용법



Composer 영문 메뉴얼 바로가기

Composer 한글 메뉴얼 바로가기


컴포저는 node.js 의 npm ruby의 bundler 와 같이 PHP 환경에서 사용하는 의존성 관리 도구입니다.

컴포저의 역할은 아래와 같습니다


a) 여러 라이브러리에 의존하는 프로젝트를 가지고 있습니다.

b) 이러한 라이브러리들은 또다른 라이브러리들을 필요로 합니다.

c) 이때 여러분이 필요로 하는 의존 관계의 라이브러리들을 지정해 줄 수 있습니다.

d) 컴포저는 패키지가 설치되어야 하는 버전을 찾아, 알맞은 버전의 패키지들과 의존 패키지들을 설치합니다. (프로젝트 디렉토리로 다운로드 한다는 의미입니다.)





시스템 요구사항


컴포저는 PHP 5.3.2+ 이상에서 동작합니다. 몇가지 민감한 PHP 설정을 필요로 하지만 인스톨러를 사용하면 이러한 비호환성을 체크하고 경고를 확인할 수 있습니다.




Composer 설치(*nix 환경)


Windows 환경의 경우 상단 링크의 메뉴얼을 참고해주세요.


1. 지역 설치(Locally)

특징: 프로젝트 안에 Composer를 포함하는 방식

장점: Composer가 프로젝트 안에 직접 설치 되기 때문에, 프로젝트를 다른 곳에 배포 할 경우 배포받은 곳에서 특별히 컴포저를 설치 하지 않고도 응용프로그램 안에 포함된 Composer를 이용하여 패키지 관리가 가능하다.



2. 전역 설치(Globally)

특징: 자신의 운영체제 전체에 Composer를 포함하는 방식

장점: 같은 OS 안에 여러개의 프로젝트를 운영하고 있을 경우, 전역 설치를 하면 각각의 프로젝트에 설치하지 않고도 Composer를 사용가능!



저는 전역설치를 하기로 했습니다. 방식은 거의 비슷하므로 매뉴얼을 참고해주세요.!

메뉴얼에는 아래와 같이 cURL 을 이용한 설치 방법이 나와있습니다.


Bash(Linux)

[root@ lib]# curl -sS https://getcomposer.org/installer | grep


나의 경우 위의 방식으로 설치하자 아래와 같이 에러가 나며 설치실패! (설치환경 : CentOS7)


Bash(Linux)

[root@ lib]# curl: (48) An unknown option was passed in to libcurl


왜 인지는 모르겠지만 다른 방식을 사용하기로 했다.


Bash(Linux)

//PHP 인터랙티브 모드 진입 [root@ lib]# php -a //원격지 설치 파일 카피 php > copy('https://getcomposer.org/installer', 'composer-setup.php'); //인터랙티브 모드 종료 (Ctrl+c) 후 파일 확인 //PHP로 파일실행 [root@ lib]# php composer-setup.php All settings correct for using Composer Downloading... //설치완료 Composer (version 1.6.3) successfully installed to: /usr/local/lib/composer.phar Use it: php composer.phar //글로벌로 실행을 위해 파일 이동 [root@ lib]# mv composer.phar /usr/locl/bin/composer





Composer 사용법


저는 라이브러리 들 중 카카오 알림톡을 사용하기 위한 unirest 모듈을 다운받아 보기로 했습니다. Unirest PHP



1. Composer.json 파일 생성


Composer의 메인 저장소 (Composer의 npm)

먼저 Composer를 처음 사용하는 경우, 라이브러리를 설치 하고자 하는 프로젝트 하위에 composer.json 파일을 생성합니다. 이미 사용 중에 라이브러리를 추가 하는 경우에는 만들어져있는 파일을 사용하면 됩니다.


만든 파일에 아래와 같이 작성합니다. ( //로 표기한 주석은 지워주세요 )

Bash(Linux)

{ "require-dev": { //mashape vendor의 unirest-php 패키지의 3.대 버전중 가장 최신버전을 사용 "mashape/unirest-php": "3.*" } }


저는 unirest 의 홈페이지에 나와있는 composer 사용방법에 있는 대로 require-dev 로 작성했습니다.



2. 설치


require 와 require-dev 는 약간의 차이가 있는데, require-dev 에는 디버깅, 테스트 등 개발시 필요한 해키지 정의를 위해서 필요한 라이브러리 들을 정의한 후 , 실제 서비스 환경에는 설치를 하지 않을 수 있습니다. 반대로 require 에는 서비스 환경에 꼭 필요한 라이브러리 들을 정의합니다.


Bash(Linux)

//require, require-dev에 열거된 모든 패키지 설치 [root@ www]# composer install //require, require-dev에 열거된 모든 패키지 업데이트 [root@ www]# composer update //require에 열거된 패키지만 설치 [root@ www]# composer install --no-dev //require 열거된 패키지 업데이트 [root@ www]# composer updatel --no-dev



위의 설치 방법은 Composer를 글로벌 설치 했을 경우의 설치 방법입니다. 로컬 설치를 했을 경우에는 아래 방식을 사용합니다


Bash(Linux)

//require, require-dev에 열거된 모든 패키지 설치 [root@ www]# php composer.phar install



3. composer.lock ( composer update 와 composer install )


composer의 install 과 update 명령은 의미상 차이가 존재합니다.

위와 같이 composer 를 install 하면 composer.lock 파일이 생성됩니다.

이 파일은 내가 install 한 시점에 설치 된 라이브러리 들의 버전 정보들을 담고 있습니다.

그래서 다른사람이 해당 파일들을 이용해 composer 를 install을 한 경우, 이전에 설치 되어있던 라이브러리들은 업데이트 된 최신 버전이 아닌 composer.lock 파일에 명시되어 있는 버전이 설치 되게 됩니다.

그래서 이 파일을 이용해 composer가 install될 때마다 라이브러리가 최신 버전으로 업데이트 되는 상황을 막을 수 있습니다.

만약, 라이브러리를 최신버전으로 갱신하고 싶을 경우 update 명령을 사용하면 됩니다.

새로운 패키지가 추가됐을 경우에도 update 명령을 사용합니다.

프로젝트 참여자 의존성 일치시키기



4. composer 적용


위와 같이 composer 설치를 마치면, 프로젝트 하위에 vendor 라는 디렉토리가 생성됩니다.

이 디렉토리 안에는 내가 설치 한 라이브러리 들이 존재합니다.

적용은 라이브러리 들의 디렉토리 경로와 상관없이 내가 적용하고자 하는 파일에 아래와 같이 작성해 주면 됩니다.


PHP

<?php require("vendor/autoload.php"); ?>



[네크워크] 소켓(Socket) 통신이란?


노드를 사용한 소켓통신 을 구현해 보기전에 개념적인 부분을 짚고 넘어가고싶어서 검색을 해보다가 

말그대로 개념에 대해서 쉽게 정리된 글을 찾아서 가져왔다.

원본링크는  http://jonnung.blogspot.kr/2013/05/soket.html



소켓통신


네트워크를 통하여 서로 다른 컴퓨터에서 수행되는 프로세스간의 통신 채널이다.

소켓통신에는 신뢰성 프로토콜인 TCP(Transfer Control Protocol)와 

비신뢰성 프로토콜인 UDP(User Datagram Protocol)가 있다.


TCP 통신의 개념


TCP 통신은 쉽게 전화 통화하는 방식으로 동작한다. 상대방의 전화번호를 알고 있어야 전화를 걸 수 있듯이 상대방의 IP 주소와 포트를 알고 있어야 연결을 할 수 있다.

서버가 응답을 받아주지 않으면 계속적으로 요청을 하게 된다. 어느 시점에서 요청을 포기하게 될 수도 있다.

이처럼 TCP 통신은 계속적으로 소켓을 통해 데이터를 주고 받을 수 있는 양방향 통신이 가능하다. 

또한 데이터를 받지 못했을 때 다시 요청하는 메커니즘을 가지고 있다.


UDP 통신의 개념


UDP 통신은 상대방과 연결되어 있는 개념이 아니다. 소켓을 개설하고 그냥 데이터를 흘려 보내는 개념이다.

이는 편지를 보내는 방식과 유사하다. 편지를 보냈더라도 편지를 받는 사람은 편지함을 열어보기 전까지는 편지가 왔는지 안왔는지 알 수 없다. 

따라서 UDP 통신은 UDP 소켓을 통해서 자신의 포트를 열어보기 전에는 데이터가 왔는지 오지 않았는지 알 수 없다.


TCP 와 UDP 비교


TCP 통신은 데이터를 주고 받을 때 데이터가 도착했는지 여부를 내부적으로 확인한다.

만약 데이터가 오지 않았다면 재요청을 하는 메커니즘을 가지고 있어 양방향으로 연결 되어 있지만 이러한 확인 절차로 인해 속도면에서 느리다.

하지만 UDP는 이러한 확인 절차를 거치지 않고 계속적으로 데이터를 전송하기만 하기 때문에 속도면에서 훨씬 빠르다.

속도면에서는 UDP가 빠르지만 UDP는 데이터가 도착했는지 알 수 없는 비신뢰성 프로토콜이다.


'BACK-END > .etc' 카테고리의 다른 글

[네트워크] 소켓(Socket) 통신이란?  (0) 2017.08.24


[Node] forever 모듈로 죽은 앱 살리기 (프로세스 관리)




Forever 는 node가 예기치 못한 상황에서 앱이 종료될 경우 자동으로 재시작 하도록 해주는 모듈입니다.


또한, 매번 콘솔창에서 node app.js 등의 node 명령어로 앱을 실행시키지 않아도, 백그라운드로 노드 앱을 계속 띄워놓을 수 있도록 해줍니다.


forever 를 사용하면, 간단한 명령들로 쉽게 프로세스들을 관리할 수 있습니다.

PM2 등의 모듈들과 마찬가지로 Forever가 프로세스를 관리해주는 부모 프로세스가 되는 것입니다.

PM2 사용법에 관해서는 기회가 되면 다음번에 포스팅 하도록 하겠습니다.


Forever(NPM) 바로가기 Forever(GitHub) 바로가기




Forever 모듈 설치(npm)



먼저 설치는 npm으로 간단하게 설치가 가능합니다. 앱단위가 아닌 전역으로 프로세스를 관리 할 수 있도록 글로벌 설치를 합시다. (-g)


Bash(Linux)

[root@ /]# npm install -g forever


설치가 완료됐으면, 간단한 forever 명령어를 사용해봅시다!

아래는 실행중인 프로세스 목록을 조회하는 forever 명령어입니다


Bash(Linux)

[root@ /]# forever list info: Forever processes running data: uid command script forever pid logfile uptime data: [0] UH9Q /usr/local/bin/node app.js 8931 10160 /root/.forever/UH9Q.log 223:1:48:38.155 data: [1] f2mq /usr/local/bin/node app2.js 9022 10172 /root/.forever/f2mq.log 223:1:48:35.995


설치가 제대로 되었다면, 명령어를 사용했을 때 위와 같이 Forever processes running 메세지가 나올 것입니다.

이미 띄워놓은 프로세스가 있을 경우 위와 같이 프로세스 목록이 나옵니다.





간단한 사용법



1. 프로세스 시작


Bash(Linux)

[root@ /]# forever start app.js info: Forever processing file: app.js


2. 실행중인 프로세스 종료


Bash(Linux)

[root@ /]# forever stop info: Forever stopped process: uid command script forever pid logfile uptime [0] cH9d /usr/local/bin/node app.js 16079 16085 /root/.forever/cH9d.log 0:0:0:41.402


3. 프로세스 목록조회


Bash(Linux)

[root@ /]# forever list info: Forever processes running data: uid command script forever pid logfile uptime data: [0] UH9Q /usr/local/bin/node app.js 8931 10160 /root/.forever/UH9Q.log 223:1:48:38.155 data: [1] f2mq /usr/local/bin/node app2.js 9022 10172 /root/.forever/f2mq.log 223:1:48:35.995


4. 프로세스 재시작


Bash(Linux)

[root@ /]# forever restart app.js info: Forever restarted process(es): data: uid command script forever pid logfile uptime data: [0] UH9Q /usr/local/bin/node app.js 8931 10160 /root/.forever/UH9Q.log 223:1:48:38.155



옵션(Options)



help 명령을 사용하면 forever 의 간단한 사용법들을 조회할 수 있습니다.


Bash(Linux)

[root@ /]# forever --help


다양한 옵션들 중 유용한 옵션 몇개만 알아보도록 하겠습니다.


1. 로그파일 지정 (-l, -e, -o, -a)


옵션중 -l 옵션을 사용하면 log 파일 위치를 따로 지정할 수 있습니다.

따로 지정하지 않을경우 위리스트 목록에서처럼 /root/.forever 하위에 로그파일이 쌓입니다. 따로 관리해주는 편이 좋을듯합니다!


Bash(Linux)

[root@ /]# forever start -l /var/log/app.log app.js


위와 같이 로그 위치를 지정해 주었는데, 해당 로그파일이 이미 존재하며, 새로운 로그파일이 아닌 기존에 있던 파일에 로그를 추가로 등록하고자 하는 경우 -a (append) 옵션을 사용합니다.


Bash(Linux)

[root@ /]# forever start -l /var/log/app.log -a app.js



또한 -o, -e 옵션 등을 사용하여 out Log 와 error Log 를 따로 관리할 수도 있습니다.


2. 소스변경감지 (-w)


-w(watch) 옵션을 사용하면, 앱의 소스코드 변경이 감지될때 자동으로 프로세스를 재시작 시켜줍니다.


Bash(Linux)

[root@ /]# forever start -l /var/log/app.log -a -w app.js




php

PHPExcel 로 엑셀파일 읽기



웹페이지를 개발하다 보면, 엑셀형식의 파일을 읽어 DB에 저장해야 하는 경우나 DB에 저장된 데이터를

엑셀파일로 다운받아야 하는 경우가 생긴다.

이럴 경우, 데이터를 읽어들이는 라이브러리로 PHP-ExcelReaderPHPExcel 등이 있다.


각자의 장단점이 있는데, 

PHP-ExcelReader 의 경우 PHPExcel 보다 가볍다는 장점이 있지만, xlsx 형식의 파일은 지원하지 않는다. (xls 파일이 아닌 경우, 다른 방식을 사용해야한다.)

또한, PHPExcel의 경우 PHP 5.2.0 이상의 버전에서만 가능하다. 


나는 PHPExcel을 사용하기로 했다.



PHPExcel 을 사용하기 위해서는 다음 조건이 요구된다.

1.  PHP 버전이 5.2.0 이상 버전이여야 한다.

2.  php-zip , php-xml , php-gd2 가 enabled 되어야한다.


나같은 경우는 php-zip 이 설치되있지 않아서, Uncaught Error: Class 'ZipArchive' not found 에러가 났다.

위의 경우 아래 링크를 참고.!

바로가기 





준비가 다되었으면

먼저, GitHub의 PHPExcel에 접속하여 PHPExcel 라이브러리를 다운받는다.   PHPExcel 다운로드



다운로드 한 파일을 압축을 풀면 Classes , Documentation, Examples 등의 폴더가 있는데, 

이 중 Classes 폴더를 사용하고자 하는 프로젝트에서 원하는 경로 안에 복사해주면 준비가 완료된다.


다운로드받은 PHPExcel 하위에 문서들을 보면 다양한 사용방법이 나와있지만, 

편의를 위해서 쉽게 작성해 놓은 예제소스를 참고했다!

http://spac.tistory.com/176 


잘돌아간다면 위 예제소스의 /*데이터 처리*/ 부분에 원하는 데이터 처리를 하면 된다!




* 이 포스트는 "생활코딩 egoing님의 node강좌" 를 보고 정리하는 개인적인 포스트입니다.


[참고/출처]

https://opentutorials.org/course/2136/11854


NPM 모듈 Express 기본 사용법


익스프레스를 사용해면 http 모듈 없이도 간단한 웹서버를 구성할 수 있습니다.

익스프레스의 자세한 사용법은 express 공식 홈페이지에서 한국어 번역판을 볼 수 있습니다. http://expressjs.com/ko/ 

(번역해 주신분들 감사합니당ㅎ.ㅎ!!!)


1. 설치와 기본사용법


익스프레스를 사용하기 전에 먼저 설치를 합니다.

package.json파일이 없으신분들은 npm의존성모듈 관리하기 참고!


  

[user@server home/mingcho/node] # npm install express --save



express의 기본 사용법.!


 

const express =  require("express");  // express 모듈을 require 한후 

const app =  express() // app변수에 express함수를 담습니다!

  

app.get('/', function(req, res){

  res.send('Hello home page');

});  // '/' 경로로 들어오는 사용자에게 Hello home page라는 문자열을 리턴해줍니다.


app.get('/login'function(req, res){

  res.send('Login please');

});  // '/login' 경로로 들어오는 사용자에게 Login please라는 문자열을 리턴해줍니다.


app.listen(3886function(){

  console.log('Connected 3886 port');

});  // 우리의 서버는 3886번 port의 요청을 들을 준비가 되었습니당.! 준비가되면 콘솔창에 Connected 3886 port를 띄워줍시당.




2. 정적파일 엑세스하기 


우리가 주로 프로그램을 처리하고 동적으로 데이터가 처리되는 부분이 아닌 한번 작성을 하면 

수정하기 전까지 변하지 않는 html 파일이나 css 파일등을 정적파일이라고 부릅니다.


express로 이런 정적파일들을 엑세스 하려면 아래와 같은 소스를 추가해주면됩니다.


app.use(expressstatic('폴더경로'));

// '폴더경로'에는 엑세스 하고자 하는 파일이 들어있는 폴더의 상대경로나 절대경로를 입력해주면 됩니다.


ex)

app.js

 

const express  require("express");  

const app =  express() 


app.use(expressstatic('public'));

// app.js 가 있는 프로젝트 안에 public이란 폴더를 만들고 그 안에있는 


app.get('/'function(req, res){

  res.send('Hello home page');

}); 


app.get('/route'function(req, res){

  res.send('<img src ="/flag.jpg"');

});  

// flag.jpg 이미지 파일을 /route 로 들어오는 사용자들에게 보여주도록 했습니다.


app.listen(3886function(){

  console.log('Connected 3886 port');

});  



호스트주소:포트번호/route 로 접속시 이미지가 잘 나온다면 성공! 


public안에 간단한 html 파일을 만든후 호스트주소:포트번호/파일명 으로도 접근해봅시당.


static.html

 

<!DOCTYPE html>

<html>

  <head>

    <meta charset="utf-8">

    <title></title>

  </head>

  <body>

      <ul>

         <li>mingcho</li>

         <li>mingcho</li>

         <li>mingcho</li>

      </ul>

  </body>

</html>



위와 같은 정적파일들은 수정한 후 node를 껐다가 다시키지 않아도 바로 적용이 됩니다.










* 이 포스트는 "생활코딩 egoing님의 node강좌" 를 보고 정리하는 개인적인 포스트입니다.



[참고/출처]

https://opentutorials.org/course/2136/11854


강의를 보던 중 잠깐 패키지를 다운받기 전 npm으로 의존성을 관리할 수 있는 package.json 파일을 생성하는 부분이 나왔다.

내용이 조금 부족하여 구글링을 추가하여 ㅎㅎ 정리해 보도록 한다.


요즘같은 경우는 npm없이 node를 사용하기란 상상할 수 없는 일이기도하고 , 

npm에 있는 수많은 모듈들을 가져다 사용하고 있기때문에 npm모듈들의 의존성관리를 해줄 필요가 있다.


npm은 프로젝트에 대한 설정을 package.json이라는 파일에 의존하고 있기 때문에 이 파일에 JSON형식으로 작성해서 

프로젝트에 대한 관리를 할 수도 있지만 , npm 에는 손수 json파일을 작성하지 않아도 package.json 파일을 생성해 주는 

명령어가 있다.


그럼 npm 명령어로 package.json 파일을 만들어보자. 명령어는 아래와같다.


  

[user@server home/mingcho/node_test] # npm init



위와 같이 명령어를 입력하면..



[user@server home/mingcho/node_test] # npm init


This utility will walk you through creating a package.json file.

It only covers the most common items, and tries to guess sensible defaults.


See `npm help json` for definitive documentation on these fields

and exactly what they do.


Use `npm install <pkg> --save` afterwards to install a package and

save it as a dependency in the package.json file.  


Press ^C at any time to quit.

name: (node)      //패키지명. 엔터를 치면 괄호안의 이름으로 등록된다.

version: (1.0.0)            //엔터

description: node test     

//해당 프로젝트에 대한 설명. 안써도 상관은 없지만 안쓰면 우리를 귀찮게 하는일이 발생한다고..!

entry point: (hellow.js)  //우리의 패키지를 구동시키는 자바스크립트이다.

생략가능하지만 없지만 추후에 프로젝트가 복잡해진다면 이 항목을 정의하도록하자!

test command:              //추가로 실행할 스크립트 명령어를 정의하는거라는데 아직잘모르겟으니 Pass

git repository:              //git 저장소 URL. 이것도 Pass

keywords:                     //npm search 명령으로 패키지를 찾을 수 있도록 도와주는 키워드. Pass

author:                         //프로젝트 작성자이름.Pass

license: (ISC)               //프로젝트 라이센스.Pass

Is this ok? (yes)          //엔터!



이렇게 만들면 현재 경로 아래 package.json 이라는 파일이 하나 생겼다.

이제 폴더에 package.json 파일만 넣고 npm install 명령어를 치면 package.json 파일에 있는 dependencies와 

devDependencies에 있는 모듈을 자동으로 탐색하여 설치해 줄 것이다.


다른 임의의 프로젝트를 하나 더 생성한 후 package.json 파일을 옮겨보자.


  

[user@server home/mingcho] # cp ./node_test/package.json ./node_test2/package.json



새로생성한 프로젝트에 package.json 파일이 생성되었다면 package.json 파일이 생성된 폴더에서 

npm install 명령어를 치면 내가 dependencies에 등록했던 모듈들이 자동으로 설치되는 것을 볼 수 있다.


이렇게 package.json 파일을 만들었으면 이제 내가 사용할 모듈들의 의존성 관리를 할 수 있다.

그런데 모듈들을 설치할 때마다 package.json 에 따로 등록해주는 일은 귀찮은 일이다.

이때 모듈을 설치할 때 마다 package.json에 자동으로 등록해 주는 옵션이 있다.


먼저, 옵션을 쓰지 않고 모듈을 설치 해보자.


  

[user@server home/mingcho/node_test] #  npm install uglifyjs

├── uglifyjs@2.4.10  extraneous



그럼 아래와같이 extraneous 라고 뜬다. (extraneous: 이물질, 외부의, 부가적인)

이 경우에는 모듈이 설치는 되지만, package.json 에는 등록이 되지 않는다. 

일시적으로 현재 프로젝트에서만 단발성으로 사용할 모듈은 이렇게 설치해 주면 될 것 같다.


그럼 --save 옵션을 사용하여 설치해보자.


  

[user@server home/mingcho/node_test] #  npm install uglifyjs --save



이 경우 extraneous 가 뜨지않는다. 이후 package.json 파일을 확인해보면

아래와 같이 등록이 된 것을 확인 할 수 있다.



  "dependencies": {

    "uglifyjs": "^2.4.10",

    "underscore": "^1.8.3"

  }




[참고] npm update 로 모듈의 버전들을 업데이트 할 때 package.json 에 내가 업데이트 하고싶은 버전의 범위를 지정해 놓을 수도있다. 



+ Recent posts

티스토리 툴바