Category Archives: 개발

Ubuntu 14.04 에서 PHP로 Daemon 만들기

우분투에서 PHP로 데몬(Daemon)을 만드는 방법은 어렵지 않다.

예제를 통해 직접 데몬을 만들어 보자. 데몬을 만들려면 2개의 파일이 필요한데 데몬을 동작시키는(시작과 종료) 파일과 데몬으로 동작할 파일이다.

 

예제를 위한 디렉토리 준비 및 파일구조 계획

예제 디렉토리를 만든다.

예제를 진행하면서 아래와 같은 파일구조를 가져갈 것이다.

  • 데몬을 동작시키는 파일: /home/my/php_daemon/pug
  • 데몬으로 동작할 파일: /home/my/php_daemon/bin/pug
  • Log 파일: /home/my/php_daemon/log/pug.log
  • PID 파일: /home/my/php_daemon/log/pug/pug.pid

 

데몬을 동작시키는 파일 만들기

데몬을 동작시키는 파일은 우분투에서 뼈대 파일(/etc/init.d/skeleton)을 제공해준다. 단순히 뼈대 파일을 복사해서 환경에 맞게 편집하면 된다.

다른 데몬들과 마찬가지로 service 명령으로 데몬을 실행하기 위해서는 /etc/init.d 디렉토리에 데몬을 동작시키는 파일이 있어야 한다. 소스코드를 관리하기 쉽도록 파일을 복사하는 대신에 심볼릭 링크를 사용하겠다.

여기까지 해서 데몬을 동작시키는 파일은 준비가 되었다.

 

데몬으로 동작할 파일 만들기

파일이 데몬으로써 동작하기 위해서는 프로세스 생성하거나 PID 파일을 만드는 뻔하고 복잡한 일이 요구되는데 다행히 이런 것들이 미리 구현되어 있는 System_Daemon 라이브러리가 있다.

Composer를 이용해 System_Daemon 라이브러리를 설치한다.

이제 System_Daemon 라이브러리를 이용해서 데몬으로 동작할 파일을 만들어보자.

잊지말고 실행 권한도 부여하자.

System_Daemon 옵션중 appPidLocation 의 값이 /home/my/php_daemon/pug 파일의 PIDFILE 값과 동일해야 함에 유의하자.

위 appPidLocation 값은 반드시 …/pug/pug.pid 이어야 한다. …/pug.pid 또는 …/other/pug.pid 로 하면 데몬을 실행할때 아래와 같은 오류가 발생한다.

err: Since version 0.6.3, the pidfile needs to be in it’s own subdirectory like: %s/pug/pug.pid

 

데몬 실행하기

다른 데몬들을 실행하는 것과 동일하게 실행하면 된다.

 

System_Daemon 추가 정보

위의 데몬 예제에서는 System_Daemon::isDying() 메소드를 이용해서 데몬의 무한루프로 동작을 탈출시켰다. 그런데 어떤 상황에서는 System_Daemon::isDying() 메소드만으로는 데몬의 무한루프 동작을 탈출하기 어려울 때가 있다. 이때는 System_Daemon::setSigHandler() 메소드를 활용하면 된다.

PHP 코드 시작 첫줄의 declare(ticks = 1) 가 없으면 무한반복 상태에서 System_Daemon::setSigHandler() 메소드에 등록한 함수가 호출되지 않는다. declare(ticks = 1) 대해서는 PHP 메뉴얼을 살펴보자.

 

문제에 대한 대처

데몬을 만들다가 발생하는 문제는 대부분 아래와 같으므로 알 수 없는 문제가 발생하면 하나씩 체크해보자.

  • 데몬 관련 파일의 실행 권한
  • 로그나 PID 파일의 쓰기 권한
  • 디렉토리나 파일 경로 오류

 

참고자료

 

워드프레스 티스토리/텍스트큐브 이사도구 2.5

Kihwan님이 보내주신 피드백을 바탕으로 섬네일 관련 문제를 해결했습니다.

2.5에서 수정된 사항

  • 미디어 라이브러리 및 대표이미지 선택시 섬네일 관련 문제 해결
  • 첫번째 첨부 이미지를 대표이미지로 선택

WordPress TTXML Impoter 플러그인 페이지에서 최신버전을 확인하고 받으세요. ^^

3종 OS별 XULRunner 배포판을 만들면서

XUL로 개발한 프로그램을 리눅스, 맥, 윈도우 3종 OS별로 XULRunner를 포함시켜 배포판을 만들어봤습니다.

별것 아니지만 몰라서 고생했던 내용을 몇가지 적어보겠습니다.

 

터미널에서 xulrunner 실행시 ‘Mozilla XULRunner <Error> – <Error>’ 메시지가 출력되면 다른 버전의 xulrunner로 교체합니다.
6.0 버전이 안정된 버전이라고 합니다. 저는 6.0에서 정상적으로 실행했습니다.

XULRunner와 직접적인 연관은 없는 내용인데 *.app 폴더의 아이콘을 변경해도 바뀌지 않는다면 .DS_store 파일을 지워봅니다.

터미널에서 실행시 키입력을 터미널이 가로채는 등의 문제가 있었습니다. 근본적인 해결방법은 찾지 못해서 터미널을 이용하지 않고 직접 실행시켰습니다. 이 경우 터미널에서 실행하는 것 처럼 -jsconsole 옵션으로 자바스크립트 콘솔창을 띄우지 못합니다. 그래서 스크립트로 직접 띄웠습니다.

* 출처: http://aadima.com/xulrunner/xrdebug.html

 

윈도우

XULRunner 실행 후 오류가 나서 아무런 윈도우가 뜨지 않았어도 프로세스가 종료되지 않고 동작을 하고 있을 가능성이 높습니다. 다시 실행하기전에 프로세스가 완전하게 종료되었는지 확인해야 합니다.

 

리눅스

별다른 문제없이 쉽게 성공했습니다.

 

공통

XULRunner 버전별로 XUL 프로그램 파일 구조가 다를 수 있습니다.

chrome.manifest 파일의 위치가 다르면 chrome.manifest 내의 경로도 달라집니다.

chrome.manifest가 chrome 폴더랑 경로가 같다면
- content myapp chrome/content/

chrome.manifest가 chrome 폴더내에 있다면
- content myapp content/

 

XULRunner로 XUL 프로그램을 실행시 -jsconsole 옵션을 추가하면 디버깅 및 문제를 해결하는데 도움이 됩니다.

$ xulrunner application.ini -jsconsole

 

-jsconsole 옵션을 추가하고 xulrunner를 실행하면 프로그램의 코드를 수정하고 재시작 하여도 캐쉬로 인해 수정하기 이전의 코드로 동작하는 문제가 있습니다.
이때는 prefs.js 파일에 아래의 코드를 추가하여 캐쉬가 되지 않도록 하면 됩니다.

pref(“nglayout.debug.disable_xul_cache”, true);
pref(“nglayout.debug.disable_xul_fastload”, true);

 

XUL이 제공하는 콘솔창에 메시지를 출력하는 방법

* 참고: https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIConsoleService?redirectlocale=en-US&redirectslug=nsIConsoleService#Logging_a_simple_message

 

기타 참고 자료

  • https://developer.mozilla.org/en-US/docs/XULRunner/Deploying_XULRunner_1.8

Apache에서 SSL 적용 후 재시작시 암호 요구 문제

Apache에서 SSL 적용 후 재시작을 하면 .key 파일 생성시 사용한 암호를 요구합니다.

이럴경우 서버 재부팅과 같은 상황에 매번 암호를 입력해야 하는 문제가 발생합니다.

이 문제는 아래와 같은 방법으로 해결이 가능합니다.

안전을 위해 기존 키 파일은 반드시 복사 해두세요.

$ cp www.example.com.key www.example.com.key.BAK
$ openssl rsa -in www.example.com.key -out www.example.com.key

이제 Apache를 재시작 하면 암호를 요구하지 않습니다.

출처: http://hellosystemadmin.com/blog/httpd-asking-password-when-starting-apache-service/

워드프레스 티스토리/텍스트큐브 이사도구 2.4

버전 2.4부터 워드프레스 플러그인 방식으로 제공됩니다.
워드프레스 플러그인으로 등록하기 위한 작업을 진행하고 있습니다.
워드프레스에 플러그인 등록을 마쳤습니다.
http://wordpress.org/extend/plugins/ttxml-importer/

2.4에서 수정된 사항

  • 워드프레스 플러그인 방식으로 변경

WordPress TTXML Impoter 다운로드 페이지에서 최신버전을 확인하고 받으세요. ^^

워드프레스 TTXML 이사도구 2.4 개발 계획

워드프레스 2.x에서는 이사도구가 플러그인 방식이 아니었습니다.
그동안 제가 개발한 이사도구의 설치 방식이 과거의 방식이었습니다.
그런데 워드프레스 3.3부터는 이사도구 설치가 플러그인 방식으로만 제공됩니다.

그래서 플러그인 방식으로 전환한 이사도구 2.4 버전을 개발하겠습니다.
마침 회사에서 12월30일을 휴일로 지정했습니다.
이날 개발을 마치고 워드프레스 공식 플러그인에 등록하겠습니다.

워드프레스 3.3에서 이사도구 문제

워드프레스 3.3부터 기존의 방식으로는 이사도구가 동작하지를 않는 것을 확인하였습니다.

다른 이사도구들 처럼 플러그인 설치 방식으로 새롭게 개발하여야 할 것 같습니다.

개발 착수 및 완료를 기약드릴 수는 없습니다.

급한대로 워드프레스 3.2에서 이사를 하시고 3.3으로 업데이트 하는 방법을 쓰셔도 될 것 같습니다.

워드프레스 티스토리/텍스트큐브 이사도구 2.3

로키님이 제공해주신 코드로 기존 블로그의 ‘http://블로그/글제목’와 같은 주소를 워드프레스에서도 같은 값으로 유지할 수 있게 되었습니다.
워드프레스의 기본 글 주소 형식은 ‘/?p=글ID’ 이지만 ‘관리 페이지 > 설정 > 퍼머링크’에서 글 주소 형식을 바꿀 수 있습니다.

2.3에서 수정된 사항

  • ttxml의 <post slogan=””>에서 slogan의 값을 워드프레스 post_name으로 매칭

WordPress TTXML Impoter 다운로드 페이지에서 최신버전을 확인하고 받으세요. ^^

워드프레스 티스토리/텍스트큐브 이사도구 2.2

gsong님이 제공해주신 정보로 http://tt_attach_path 치환자에 대한 처리를 추가했습니다.

2.2에서 수정된 사항

  • http://tt_attach_path 치환자 처리

WordPress TTXML Impoter 다운로드 페이지에서 최신버전을 확인하고 받으세요. ^^

워드프레스 티스토리/텍스트큐브 이사도구 2.1

EM님의 의견으로 비밀댓글이 공개된다는 문구를 넣었습니다.
daljoo님이 제공해주신 정보로 [##_ATTACH_PATH_##] 치환자에 대한 처리를 추가했습니다.

2.1에서 수정된 사항

  • 첫화면 내용 및 모양 개선
  • [##_ATTACH_PATH_##] 치환자 처리

WordPress TTXML Impoter 다운로드 페이지에서 최신버전을 확인하고 받으세요. ^^