PHP: Hypertext Preprocessor | |
250px | |
최초 개발자 | Rasmus Lerdorf (라스무스 러돌프) |
운영 및 개발 | The PHP Group |
공식 사이트 | [1] |
가격 | 오픈소스[1] |
최신 버전 | 7.0.10 (2016.8.18) |
1 개요
대표적인 서버사이드 스크립트 언어로 한국을 비롯한 전 세계 수많은 웹 시스템의 기반이 되는 언어. 비슷한 언어로는 ASP, JSP, CGI, ROR 등이 있다. C언어와 유사한 문법을 사용하여, 소규모 웹 페이지 제작시 쉽고 빠르다는 점에서 사용자, 사용처가 많다.
PHP라는 이름은 원래 Personal Home Page Tools이나, 지금은 PHP: Hypertext Preprocessor라는 재귀 약자를 사용하고 있다.
워드프레스, 미디어위키 등의 많은 어플리케이션이 PHP로 짜여져있다. 의외로 웹서핑을 해보면 쓰이는 곳이 많다. 우리나라 한정으로 엄청난 점유율을 보이는 XpressEngine과 그누보드 역시 PHP로 된 것.
2 특징
다른 서버 사이드 스크립트 언어와 마찬가지로 <?php ... ?>로 이루어진 스크립트 실행 영역이 있다. <? ... ?>로도 줄여 쓸 수 있고, 변수 하나만 출력할 경우에는 <?=$var?>[2]같은 형식으로도 줄일 수 있다. 그러나 이렇게 줄여 쓰는 방식은 기본적으로 꺼져 있으므로 쓰려면 php.ini에서 short_open_tags의 설정을 on으로 바꿔줘야 한다. 이 줄여 쓰는 방식이 꺼져 있는 이유는 XML의 <? xml version="1.0" ?>과 같은 구문과 충돌하기 때문이다. 원래 PHP가 처음 나왔을 때는 HTML만 있어서 줄여 쓰는 방식도 문제가 없었지만, HTML에 XML의 문법을 도입한 XHTML 1.0이 나오면서 충돌이 일어났고 결국 저 옵션이 기본적으로 꺼져 있는 것으로 변경된 것. 다행히 HTML5에서는 XML 문법이 도로 빠졌다.
- 예전에는 WYSIWYG 기반 에디터를 사용할 때 <?php ... ?>로 이루어진 스크립트 실행 영역을 올바르지 않은 태그로 잘못 인식하는 문제를 회피하기 위해 <script language="php"> ... </script> 태그를 사용하기도 했다. 그러나 이 태그는 JavaScript를 삽입할 때 쓰는 게 일반적이어서 혼동하기 쉽고 <?php ... ?> 방식보다 쓰기가 번거롭다는 단점이 있어 쓰임이 줄어들었고 PHP 7부터는 이 방식이 지원되지 않을 예정이다.
상기했듯 PHP는 그 형태가 C언어와 매우 유사한데, 몇 가지 상수와 변수 선언이 필요 없다는 것을 제외하면 큰 차이가 없다. 따라서 C언어를 할 줄 아는 사람은 PHP도 할 수 있다고 봐도 무방하다.[3] 사실 C를 어느정도 다룰줄 안다면 PHP로 1주안에 간단한 쇼핑몰을 만든다! 우린 안될거야 아마
프리프로세서가 오픈소스이다보니 이식성이 좋아서 거의 모든 웹 서버에서 실행할 수 있다. Microsoft의 IIS에서도 실행할 수 있다! 윈도우용은 그 특성상 실행파일(바이너리)로 만들어서 제공한다. 그 동안 윈도우용은 32비트 버전밖에 안 나왔지만, 5.5 버전부터는 64비트 버전도 나오고 있다. 물론 윈도우용 소스를 다운받아 64비트용으로 컴파일해도 된다. 윈도우용의 경우 동작 방식의 차이 때문에 IIS에서 돌리는 PHP는 Non-Thread Safe 버전으로, Apache에서 돌리는 PHP는 Thread-Safe 버전으로 따로 나온다. 쓰는 웹 서버 프로그램을 잘 보고 다운받아야 한다.[4]
3 현황
한때 포털사이트나 기업이 운용하는 웹사이트에서도 PHP를 사용하긴 하였는데, 보안적 취약성으로 인하여 현재는 Java 계열의 JSP나 C\# 계열의 ASP.NET으로 옮겨갔다. 참고로 JSP나 ASP.NET은 로드 밸런싱 기능이 포함되어 있어서 상대적으로 웹 서버의 부하를 줄여주는 효과가 있으며, PHP에 비해 보안기능이 훨씬 강력하다. 상기한 보안문제[5] 및 대량의 트래픽이 발생할 경우의 문제 등으로 인해 기업 사이트 혹은 상업적 목적의 대형 사이트는 PHP를 쓰는경우가 거의 없다. 페이스북은 아직 PHP를 사용한다. IT관련 기업 외부노출 페이지를 PHP로 짠다면 제대로 된 회사가 아니라는 얘기까지 있을 정도. 페이스북은 이전에는 PHP를 주 언어로 사용하다가 2014년 자사에서 개발한 hack이라는 언어를 사용한다. 관련기사 [6] [7] PHP의 보안문제는 크게 두가지 측면에서 기인한다. 하나는 PHP의 언어 구조적 허술함에 의해 개발자가 코딩 중 원치 않게 보안 이슈를 만들어 내는 것이고, 또 하나는 개발자 중 허술한 개발자들이 섞여있다는 것이다. 어찌보면 더 큰 문제다. 이 중 PHP의 구조적인 허술함은 Codeigniter나 Laravel과 같은 프레임웍에서 제공하는 기능들을 이용해서 보완이 가능해져서 요즘은 나아진 상태다.
개인 웹호스팅 쪽으로 내려오면 여전히 PHP가 강세이다.[8] JSP의 경우에는 아파치나 IIS말고도 톰캣이란 별도의 서버툴을 설치해야 되는데 설치는 둘째치고 코드가 갱신될 때마다 톰캣 서버쪽에도 반영을 해줘야한다. 이게 서버 관리자 입장에서는 은근히 귀찮다(…). ASP.NET은 일단 .NET이 기반이라 마이크로소프트의 운영체제와 IIS를 설치해야 되는데 문제는 이게 다 라이센스비 깨지는 것들이다(…).[9] [10] 본인이 꼭 필요하다면 지원하는 곳을 찾을 수는 있는데 비용이 꽤 많이 든다는 점을 염두에 두자.
이런저런 문제 때문에 협업이 쉽지 않은 언어이다. MVC 패턴을 적용하기에는 사용 환경상 난점이 있는 언어이고[11], 프레임워크도 별로 없기 때문이다. Codeigniter나 Laravel이 각광을 받고 있지만 딱히 어떤 프레임워크가 우위를 접하고 있는 것도 아니다. 시간이 지나면 정리될 수도 있지만, 아직은 지켜봐야 할 단계이다.
종종 JSP와 비교되기도 하지만 위의 장단점을 읽어보면 용도가 확연하게 다른 것을 알 수 있다. 어차피 PHP는 소규모나 개인 개발, 오픈소스 개발 용도로 쓰이는 것이고, 대규모 개발에 PHP를 반드시 써야할 이유도 없다. 개발자들 중에 여러가지 이유로 PHP로 시작했다가 JSP로 넘어가려는 경우가 있는데 서로 워낙 다른 언어다 보니 경우에 따라서는 어렵게 느낄 수 있다.
4 기타
PHP4까지는 클래스를 지원하기는 하는데 좀 시원찮아서(...) 아직 객체지향 프로그램을 만들기 어려웠지만 5에서는 많이 개선됐다. 그 덕분에 PHP4까지는 정말 순수하게 스크립트 형태로 작성된 코드들이 많았는데, PHP5 적용 이후로는 점점 객체지향 프로그래밍에 가까운 코드들이 나오고 있다. 덕분에 프로그래밍 언어를 정식으로 배우지 않은 사람들 입장에서는 코드 해독하기가 난해해지고 있다(…). PHP의 최대 장점이었던 진입장벽이 높아지고 있다고 우려하는 사람들도 있을 정도.[12]
사실 전체적으로 '뭔가 잘 설계된' 언어는 결코 아니다. 예를 들어 내장 함수나 인자 이름 명명에 일관성이 부족하다. 이는 필요할 때마다 그 기능을 그때그때 추가하는 방식으로 개발되었기 때문이다. 그 밖에도 여러 가지로 까이고 극딜당한다. 역으로 많은 부분을 개발자에게 맡기는 특성 때문에, 부담없는 웹 프로그래밍에는 그만인 언어라는 평가도 있다.
현재 웹상에 공개된 많은 웹 관련 어플리케이션들이 PHP로 작성되었기 때문에 간단하게 필요한 부분을 고칠 수 있을 정도로 배워두면 상당한 도움이 된다.
종종 일부 사이트에서 php 파일을 다운로드받는 경우가 있는데 이게 php 스크립트가 아니라 스크립트의 실행 결과물로써 나오는 php라는 확장자를 가진 html 파일이라는 사실을 아는 이는 그다지 많지 않다. 아무리 허술해도 서버의 소스 코드를 그냥 내뱉을 정도로 허술하지는 않다. 어디 가서 php 다운받는다고 말하지 말자. 컴공 있으면 개쪽난다 단, 진짜 php 소스가 다운로드 되는 경우가 있는데, 이 경우는 서버 세팅하면서 PHP 모듈을 설치하지 않거나 모듈 설정이 잘못된 경우다. 이런 경우는 php 파일을 서버에서 스크립트로 인식 못하기 때문에 일반 파일로 간주하고 다운로드시키기 때문이다. 주로 관리가 안 되고 오랫동안 방치된 사이트가 이런 경우가 많다. 아니면 테스트용 서버이거나. 아니면 PHP 스크립트가 애초에 배포하는 파일이거나.
라이센스를 보면, 일단 프리프로세서는 3.x[13]를 제외한 모든 버전이 PHP License라 불리는 독자적 라이센스를 따른다. MIT 라이센스 비스무리한 형태이나 프리프로세서를 재배포할 때 (내용 수정 여부에 관계없이)패키지명에 PHP라는 단어를 넣지 못하게 하고 'This product includes PHP software, freely available from http://www.php.net/software'라는 문구를 코드에 삽입할 것을 강제하는 내용이 있어 GPL과는 호환이 되지 않는다.
페이스북에서 PHP에 지대한 공헌을 하고 있다. 이유는 위에서 언급했듯이 페이스북이 PHP(or Hack 언어) 기반으로 만들어졌기 때문.[14] 대표적으로 페이스북에서 PHP의 표준에 대해 공식화한 문서가 있다.[15][16] GitHub 페이지 영어울렁증은 조심하자
5 컴파일러?
PHP는 스크립트 언어고 인터프리터가 소스 코드를 매번 일일이 해석해서 실행하는 방식이라 아무래도 퍼포먼스에 한계가 있다. 그래서 PHP 소스코드를 최대한 그대로 재활용하되 컴파일링을 통해 퍼포먼스를 향상시키는 소프트웨어들이 몇 개 개발돼 왔다.
페이스북은 자사 서비스를 개발하다가 PHP의 퍼포먼스 문제를 해소하기 위해 오픈소스로 HipHop for PHP와 HipHop Virtual Machine(HHVM)을 개발했다. 전자는 PHP 코드를 C++ 코드로 변환한 뒤 컴파일하는 방식이고, 후자는 Java와 비슷하게 JIT 컴파일링을 하는 방식이다. 페이스북은 현재 전자의 개발을 중단하고 후자만 개발하여 내놓고 있다. 참고로 페이스북은 HHVM을 개발하면서 hack 언어라는 프로그래밍 언어도 만들었는데, HHVM에서 hack 언어로 작성된 코드도 실행할 수 있다. PHP 7에서는 마개조를 해서 HHVM 못지 않은 수준으로 인터프리터의 퍼포먼스가 향상되었다.[17]
다른 툴에 대한 설명은 추가바람.
6 통합 개발 환경
통합 개발 환경(IDE)은 아직 대중적으로 쓰이지 않는다. 프로그래밍 할 때는 구문 강조 기능이 있는 에디터를 많이 사용하고, 디버그는 웹서버에 올린 뒤 웹 브라우저로 해당 페이지를 불러와서 실행하여 출력되는 에러 메시지로 확인하는 방식이다.
그러나 통합 개발 환경이 좀더 편한 부분도 있으므로 조금씩 나오고는 있다. 이클립스 쪽에서 Eclipse PDT, Aptana 같이 PHP를 지원하는 물건이 나와 있고, 상용으로는 PHPStorm이 많이 쓰인다.
7 업데이트
2012년 3월 5.4버전이 배포되었다! 다만 업데이트된 기능[18]이 다른 언어에서 이미 지원되고 있으나, 제작진들의 모르쇠로 인해서 환호성과 탄식이 교차하고 있다.
신기능 소개
2013년 6월에 5.5가 배포되었다. yield, finally 키워드 지원 결국 또 뒷북, 보안성 강화, 배열 지원 강화 등을 골자로 하고 있다. 보안상의 문제 때문에 mysqli 및 PDO를 제외한 MySQL 연결이 비권장(deprecate) 요소로 들어갔다. PHP7에서 완전히 제거되었다.
2014년 8월에 5.6이 배포되었다. $HTTP_RAW_POST_DATA가 비권장 요소가 되었고, 2기가 이상 파일 업로드가 가능해졌다. 또한 지수 표현을 위해 별도의 함수를 사용했었으나 **라는 연산자가 추가되었다. 결국 이제야?
PHP 5가 처음 나온 것이 2004년으로 거의 10년이 넘었는데, 사실 2005년부터 PHP 6에 대한 개발이 시작되었다. 하지만 이게 취소되는 바람에 PHP 5로 근 10년간 우려먹게 된 것이다. PHP 6은 처음부터 유니코드를 기반으로 작동되도록 설계가 되었고, 이 때문에 대단히 많은 변경점이 예고되어 있는 버전이었다. 그러나 하필 인코딩으로 UTF-16을 선택한 것이 발목을 잡았다. 이미 이 때부터 웹에서의 유니코드 인코딩은 UTF-8이 대세가 되어가는 중이었기 때문이다. 이 실책은 개발자들의 참여 저조로 이어졌고, 개발에 난항을 겪다가 2010년 5월 PHP 6 프로젝트는 취소되었다. 그리고 PHP 6에서 논의되던 상당수의 기능은 PHP 5.4 버전으로 흡수되었다.
하지만 PHP 5로 장기간 버티는 것은 아무래도 무리가 많았다. 엔진이 10년간 바뀌지 않은 채 유지되다보니 다른 스크립트 언어에 비해 속도 차이가 많이 나게 된 것이다. 그나마 계속 버전업을 통해 속도를 개선해 나갔지만 근본적인 개선은 무리였다. 결국 2014년 PHP 6을 건너뛰고 차기버전으로 PHP 7의 개발을 발표한다. PHP 7은 PHP NG (Next Generation)라는 새로운 구현체가 도입될 것이며, 덕분에 2015년 6월 배포된 PHP 7 알파1 버전은 PHP 5.6에 비해 약 70%, PHP 5.5에 비해서는 거의 2배의 성능 향상을 보이고 있어, HHVM 못지 않은 성능을 보여준다. 또한 새로운 기능을 추가하는 것과 동시에 기존 PHP 5의 호환성을 최대한 유지한 상태로 넘어가기 때문에 혼란은 많지 않을 듯하다.
PHP 7 발표 행보는 상당히 빠르다. 2015년 6월 11일에 알파1이 나온 이후 한 달 만인 7월 10일에 베타1이 나오고, 또다시 한 달 만인 8월 18일 릴리즈 후보안 1(RC1)이 나왔다. 11월 26일에 RC 8이 나왔으며, 12월 3일에 일반 이용자용(GA)이 나왔다. PHP 7은 PHP 5.6보다도 2배 빠른 성능을 보인다고 한다.
2015년 12월 3일, 드디어 PHP 7 정식 버전이 발표되었다. # 여러 사용자들에 의하면 php7은 2배에서 10배까지도 빠르다고 한다.
2016년 6월 9일, PHP 7.1 알파 버전을 내놓았다. 이후 두 차례 더 알파 버전을 내놓은 뒤 7월 21일에 베타 버전으로 넘어갔다. 이후 릴리즈 후보안 1(RC1)은 9월 1일에 나왔다. 이 추세대로라면 2016년 하반기 중에 7.1 정식버전이 발표될 것으로 예상된다.
8 PHP로 작성된 프로그램 목록
나무위키에 항목이 있는 것만 추가한다.
- ↑ 무료. 배포중인 인터프리터 소스를 이용해 입맛따라 PHP를 주물럭댈수 있다.
- ↑ 제로보드 스킨을 만져봤다면 많이 봤을 것이다.
- ↑ 물론 언어와는 별개로 웹과 HTTP가 동작하는 방식을 알아야 제대로 개발이 가능하다. 이건 JSP나 ASP등을 하더라도 마찬가지.
- ↑ 다운로드 받는 페이지 옆에 보면 영어긴 해도 잘 설명되어 있다.
- ↑ Stefan Esser 라는 보안 전문가(iOS Jailbreak 로도 유명하다)가 만든 패치인 수호신 (진짜 이름이 Suhosin 이다.) 으로 인해 어느 정도 개선되었다.
그의 여자친구가 한국인이다 - ↑ hack 언어는 HHVM이라는 일종의 JIT 기반 인터프리터에서 실행된다.
- ↑ PHP는 다른 언어에 비해 구조적으로 일관성이 없고 기능적으로 미약한 부분이 있어 거대 웹사이트인 페이스북에서는 자사에서 사용하기 적합하지 않은 PHP를 문법적, 기능적으로 확장하여 Hack 언어와 HHVM을 제작하였다. HHVM은 Hack 언어 뿐만 아니라 PHP 코드 역시 정상적으로 실행된다.
- ↑ 대부분의 웹호스팅이 PHP를 기본적으로 지원하고 있다. 그리고 상대적으로 가격이 저렴한 편이다. 왜냐하면 한 서버에 수용할 수 있는 사용자가 더 많기 때문이다.
- ↑ Windows Server 2008 R2가 가장 싼 것이 60만원부터 시작한다. IIS야 무료지만 윈도우에서만 사용이 된다.
- ↑ 값싸게 .NET을 돌리려면 모노로 돌리면 되지만 MS API가 완전히 구현되어있지는 않으므로 실행이 안 되는 경우도 있을 수 있다.
- ↑ 개인용이나 소규모 개발 용도로 많이 사용되다 보니 사용자들 사이에 협업에 필요한 여러가지 개념이 제대로 정착되어 있지 않다.
- ↑ 그런데 루비 온 레일즈 등의 영향을 받은 다양한 MVC 패턴을 지원하는 웹 개발 프레임워크들이 개발되었기 때문에 어떻게 보면 오히려 난이도가 더 낮아졌다고 할 수 있다. 2015년 현재 대세로 떠오르고 있는 Laravel 프레임워크 같은 경우에는 github에서 파이썬의 대표적인 웹 개발 프레임워크인 django의 star 수를 뛰어넘었다.
- ↑ PHP License/GPL 듀얼 라이센스를 채택했다.
- ↑ 외국에서는 기업이 오픈소스 프로젝트를 이용하여 자사의 서비스를 구축한 경우 그 프로젝트에 기여(contribute)를 하는 일이 흔하다.
- ↑ 심지어 공식 PHP에서도 이 문서를 이용한다!
- ↑ 이전까지 PHP는 제대로 된 언어 사양서(php.net의 문서와는 성격이 조금 다르다)가 없었다. 즉, 마땅히 PHP 언어 개발진이 해야 할 일을 돈 한 푼 안받고 페이스북에서 한 것이다!
- ↑ 심지어 HHVM보다 성능이 더 뛰어난 상황도 있다!
- ↑ 배열을 []로만 선언하기, 배열을 리턴하는 함수를 곧바로 접근하기 등. 이것은 이미 오래 전부터 JavaScript에서 구현된 것들이다. 이외에도 JavaScript에서 유래한 일부 기능이 추가되었다.