PHP Best Practices를 읽다가 내친 김에 번역을 했는데, 이걸로 모던PUG에서 "UTF-8 in PHP"라는 주제로 발표까지 하게 되었다. 별 내용은 아니라서 발표할 것까지는 없다고 생각했는데, 발표 준비를 한 덕분에 PHP의 UTF-8 지원에 대해서 정리해볼 수 있었다.

PHP7에서 기본 문자열이 유니코드(UTF-8)로 되는 것으로 알고 있었기때문에 곧 필요없어질 내용이라고 생각했는데, 조사하다보니 PHP7에서도 유니코드 지원 상황은 변함이 없는 것으로 확인되었다. RFC에 UString 클래스 제안이 있던 정도였지만, 이마저도 통과되지 않았다.

가장 흥미로웠던 것은 MySQL의 "utf8mb4" 인코딩이었다. UTF-8에서 4바이트를 사용하는 문자가 있다는 것은 어렴풋이 알고 있었지만, 보통 사용하는 "utf8" 인코딩은 4바이트 문자를 저장하지 못한다는 사실은 모르고 있었다. 이것 때문에 UTF-8의 "Plane"이라는 것에 대해서도 알아보게 되었다.

별 내용은 없지만, 아래는 발표때 사용한 슬라이드이다.


월의 몇 주차를 어떻게 계산해야할지 찾아보았지만, 마땅한 표준은 존재하지 않았다. 하지만, 해당 년도의 첫 주 계산은 ISO 8601 표준에 정해져있다는 것을 알게되었다. ISO 8601 표준의 위키피디아 해당 항목을 보면 매 해의 첫주의 정의는 아래와 같이 설명될 수 있다고 한다,

  • the week with the year's first Thursday in it (the formal ISO definition),
  • the week with 4 January in it,
  • the first week with the majority (four or more) of its days in the starting year, and
  • the week starting with the Monday in the period 29 December – 4 January.

가장 간단한 설명은 1월 4일이 포함된 주가 첫주라고 보면 된다는 것이다. 년에 관한 것만 나와있어서 그다지 도움은 안됐지만, 한가지 또 알게 된 사실은 ISO 8601 표준에서 "주"는 월요일에서 시작해서 일요일로 끝나는 것으로 본다.

하지만, 달력에는 주로 일요일이 시작인 것처럼 나와있는 경우가 많아서 한주의 시작요일을 변경할 수 있도록 해서 한번 만들어봤다.


'Developing' 카테고리의 다른 글

PHP에서의 UTF-8 지원  (0) 2015.06.08
PHP 에러(Error)를 예외(Exception)로 변환하기  (0) 2015.01.30
PHP 에서 IE 구분  (0) 2015.01.19

PHP에서 논란이 많은 것 중에 하나가 Exception 이외에 핸들링하기 어려운 Error가 또 있다는 것이다. 작은 규모의 웹 애플리케이션에서는 별 문제가 되지않고, 오히려 장점도 있을 수 있겠지만, 규모가 조금 큰 웹 애플리케이션에서는 문제가 될 수 있고, 특히 서버 콘솔 프로그램을 만들었다면 치명적일 수 있는 문제이다.

물론 Error도 set_error_handler()를 사용해서 핸들링할 수 있다고는 하지만, Exception 처리와는 별개로 처리하다보면 코드 흐름이 엉망이 되기가 쉽기도 하고 해서 Exception으로 변환해서 처리를 하는게 낫다고 생각이 들때가 있는데, 그럴때는 아래와 같은 코드를 사용하면 된다.

set_error_handler(function ($errno, $errstr, $errfile, $errline) {

    throw new ErrorException($errstr, $errno, $errno, $errfile, $errline);

});

참고 : http://www.sitepoint.com/forums/showthread.php?632913-Converting-native-PHP-errors-to-Exceptions

"개발자 좀 살려주세요!", "굿바이 IE6" 등의 캠페인 등으로 브라우저 업그레이드를 해왔지만, 그때뿐이고 Active-X로 점철된 금융권 사이트와 정부 사이트로 인해서 우리나라에서 IE는 쉽게 버전 업그레이드 할 수 없다. 때문에 최신 버전이 이미 10대를 넘었지만, 아직도 7을 써야만 하는 사이트가 있는 우리나라 현실에서는 아직도 IE 버전 체크가 필요한 경우가 자주 있다.

버전을 구분하는 방법은 여러가지가 있지만, 다음은 간단히 PHP 코드를 사용해서 구분하는 예제 코드이다.

if (preg_match('/(?i)msie [2-7]/',$_SERVER['HTTP_USER_AGENT']))
{
// IE 7 이하
}

elseif (preg_match('/(?i)msie [8-9]/',$_SERVER['HTTP_USER_AGENT']))
{
// IE 8~9
}
else
{
// IE 10 이상
}


PHPFest 2013이 있었다. 국내에서는 많이 사용하면서도 기술 공유는 비교적 적은 PHP 개발자들에게는 가뭄에 단비같은 행사가 아닐 수 없다. 2009년에 PHPFest가 있었고, 최근에는 제작년에 있어서 갔던 기억이 있다. 밑에 있는 올해 행사 공지를 봤을때, 관심있는 발표가 꽤 있어서 꼭 가야겠다고 생각했다. 가보니 생각보다 참석한 사람도 많았고, 발표 내용도 좋았다. 각 세션별로 들은 내용을 한번 정리해 본다.

1. PHP 애플리케이션 성능 향상방법

  • 빠른 코드를 만들기 위해서 연구하느라 리소스(시간, 비용)를 투입하는 것 보다는 PHP 최신 버전을 사용하는 것이 효율이 좋다.
  • OpCache 등의 캐시를 사용하라.
  • 리팩토링을 위한 툴을 활용 : xdebug, Jmeter

2. Elastic Beanstalk

  • 비용만 괜찮았다면 회사에서 사용하고 싶을 정도로 편리하게 해놨다. 이제 시작하는 스타트업의 경우는 괜찮은 선택일 수도 있겠다. 자세한 것은 아마존웹서비스 안내를 참고.

3. MySQL - 5.5 이하 버전을 기준으로

  • FROM절 서브쿼리
  • Stored function에서의 Deterministic : NOT인 경우(Default) 인덱스를 사용하지 않아서 성능 이슈
  • IN (서브쿼리) 형태 : 외부 쿼리 결과의 ROW 수 만큼 서브 쿼리가 수행됨. 해결은 JOIN으로 대체하거나 괄호 안의 서브쿼리를 미리 상수화하는 방법, GROUP BY로 해결하는 방법도 있다고 한다.
  • 트랜젝션시에는 외부 작업을 하지 않아야 한다.(외부 작업이 중단되버리면 Lock이 오래 지속됨) 자원이 IDLE인데 쿼리 처리 속도가 느리면 다음과 같이 Lock을 확인해본다.
    > SHOW ENGINE INNODB STATUS;
    ...
    .... TRANSACTION 3F0B, ACTIVE 23sec .... // 1초 이상이면 문제임
    > pager grep ACTIVE; // 유닉스에서 위의 구문만 찾을 수 있도록 해주는 명령
  • 긴 쿼리는 이해하기도 어렵고, 최적화가 어려우므로 피하자.
  • Unique Index가 많으면 Lock
  • memcached 등의 캐쉬를 사용한다면, 없는 데이터에 대한 것도 캐쉬할 필요가 있을 수 있다.
  • 문의는 http://cafe.naver.com/realmysql

4. Javascript

  • 이벤트 핸들러는 버블링을 사용 : Target은 hasClass() 등을 사용해서 판별
  • (이제는) localStorage를 사용
  • 문자열 합칠 때에는 배열을 join한다. 다른 예는 Array(11).join("a") 의 형태.
  • 개체를 추가할때는 append()보다는 html()을 사용
  • 추천 툴 : jsmatch, jsperf, DynaTrace, Yslow

후기를 좀 더 보태보면, 원래 계획표에 있는 코드이그나이터 발표는 발표자의 안타까운 개인 사정으로 취소가 되었다는 것을 행사가 시작하면서 미리 공지되었기에 이해하더라도, 마지막 순서로 있는 HipHop 발표는 하지 않고, 갑자기 Q&A 시간을 가지는 바람에 좀 당황했다. 나처럼 HipHop 발표를 기대한 사람들이 분명 있었을텐데 별다른 설명도 없었고, 설명을 듣는다고 달라질 것도 없는 것 같아서 따로 물어보지는 않았지만, 이전의 PHPFest도 그랬듯이 행사진행이 매끄럽지 않다는 느낌을 가지게 했다. 그리고, 사전 등록도 받았는데, 경품 추첨 같은 것도 미리 준비했으면 어땠을까 하는 아쉬움이 남는다.

진행상의 옥의 티는 있을지라도 행사 자체는 유익했다. PHP Korea에서 목표로 하고 있듯이 매년 PHPFest가 열리기를 기대한다.

'Etc' 카테고리의 다른 글

Deview 2013  (0) 2013.10.15
Why We Prefer Founding CEOs  (0) 2013.10.08
기술을 사람에게 적용하는 방법  (0) 2013.06.23

PHP에서 PDF 문서를 만들기 위한 방법에는 다음과 같은 것이 있다.

1. PDFlib

PHP 공식 사이트의 문서에 나와있는 PDF 생성방법이다. PHP 공식 사이트에 소개되어있는 만큼 가장 문서화가 잘 되어있다고 봐야할 것 같고, 제공하는 기능도 괜찮아 보인다. 하지만, PDFlib 자체는 유료 소프트웨어이므로 정식으로 사용하기 위해서는 라이센스를 구매해야한다.(구매하지 않으면, 생성하는 모든 페이지 위에 데모 문구가 찍혀서 나온다고 한다.) 비 상업적 용도로 사용한다면, PDFlib Lite 7을 사용하는 방법도 있다.(현재 유지보수는 하지 않고 있으며, 무료답게 기술 지원도 없다고 한다. 참고로 현재 PDFlib의 버전은 8이다.)

참고

2. FPDF

FPDF는 무료로 용도에 상관없이 사용할 수 있다. PDFlib에서 라이브러리를 설치해야하는 것과는 달리, PHP 라이브러리만 설치하면 되기때문에 설치도 쉽다. 게다가 ubuntu를 사용한다면, 저장소에 이미 있기때문에 더욱 간편하게 끝난다. 문서는 FPDF 공식 사이트에서 함수 설명과 예제를 제공한다.

참고

3. TCPDF

FPDF처럼 TCPDF도 무료로 용도에 상관없이 사용가능한 자유소프트웨어이다. 설치도 다운로드해서 파일을 include해서 사용하는 간편한 방식이다. 다만, FPDF가 ubuntu 패키지로 존재하는 것에 비해서 TCPDF는 별도로 다운로드 받아야한다. 그러나, FPDF가 기본적으로는 유니코드를 지원하지 않는 것에 비해서, TCPDF는 기본 지원한다.(FPDF의 경우, 한글은 CP949 코드셋을 사용한다.) 문서는 공식 사이트에서 PHPDoc과 예제를 제공한다.

참고



PHP를 업무에 사용하고 있기 때문에, 가보는게 좋지 않을까 싶다.

신청 링크

'Etc' 카테고리의 다른 글

루씬 한글분석기 기술 세미나 소식  (0) 2013.03.20
네이버의 오픈 소스 공개  (0) 2008.11.22
'파이어폭스3' 기네스 기록 도전 성공!  (0) 2008.07.03

PHP에서 MYSQL을 연결할때 사용하는 것이 mysql_connect() 함수인데, 하나의 세션/파일에서 여러개의 연결이 필요할때는 이 함수의 네번째 매개변수인 $new_link를 True로 설정해줘야한다. 그렇지 않으면 기존의 연결을 계속 재사용하게 되므로 의도와는 다르게 동작한다.

참고 : php.net


+ Recent posts