PHP의 이런 부분에 대해 어떻게 생각하시나요

shamlock의 이미지

PHP가 속도가 빠르고 여러가지 중소형 사이트에서
사용하기 좋은 언어라는 평판을 들었습니다.

심심풀이로 PHP 공부좀 한 담에
insert / select 하는 프로그램을 하나 만들어봤습니다.

PHP의 첫 느낌을 말씀드리면
타이핑 무척귀찮다고 느꼈습니다.(변수앞에 $기호붙이는것때문에)
익숙하지 않은 탓일것 같다는 생각을 하지만..
$기호때문에 자꾸 실수를 하게 되는 군요. 클래스에도 $때문에 햇갈리구요

아래와 같은 형태로 코드를 작성하기 위해서

 
		<? while($listQuery->next()): ?>
			<tr>
				<td><? echo $listQuery->record[0] ?></td>
				<td><? echo $listQuery->record[1] ?></td>
				<td><? echo $listQuery->record[2] ?></td>
			</tr>
		<? endwhile ?>		

나름대로 클래스를 만들어봤습니다

        class ListQuery extends AbstractQuery
	{
 
		var $record   = array();
		var $rowNumber ;
		function execQuery($q)
		{
			if($this->dao == null) 
			{
				$this->dao = new SimpleDao;
				$this->dao->connect();
			}
 
			$this->queryId = mysql_query($q, $this->dao->conn);
			$this->rowNumber = 0;
			$this->error = mysql_error();
			if( !$this->queryId )
			{
				$this->dao->halt("잘못된 쿼리");
			}
		}
 
		function next()
		{
			$this->record = mysql_fetch_array($this->queryId);
			$this->rowNumber += 1;
			$this->errno = mysql_errno();
			$this->error = mysql_error();
 
			$stat = is_array($this->record);
			if( !$stat )
			{
				mysql_free_result($this->queryId);
				$this->queryId = 0;
			}
			return $stat;
		}
	}

PHP를 공부해 보면서 제가 느낀 문제점은 아래와 같은데요..
(제가 몰라서 문제점이라고 생각한건지 모르겠습니다.)
1. 성가신 타이핑
2. 커넥션풀이 없는 문제
3. 자바의 finally 블럭처럼 connection을 확실히 닫을수 있는 방법
4. 바인드 변수에 대한 지원

다른 분들은 어떻게 생각하시는지... 의견을 듣고 싶습니다.

다즐링의 이미지

일단..
1번은 이클립스나 등의 IDE 를 쓰시면 문제가 없을듯 합니다. 자바를 vim 으로 코딩해보셧나요 -_-;;; 죽습니다.

2번 커넥션 풀의 경우.. php 자체는 없고... 모듈로 sqlrelay 를 쓰시거나.
pconnect 를 이용하여 잘 구현하셔야합니다.

아니면 php 의 자바구현체인 quercus 를 쓰시면 됩니다.

3번은 무슨 의미인지 모르겠군요. 끝에 수행이 될 필요가 있다면 핸들러를 설정해서 하시면 될듯하구요.

4번역시 무슨 의미인지 -0-;;

php 는 자체만으론.. 힘듭니다. 순수하게 php 로 뭘 하실 생각은 하지마시고.. 어차피 리눅스나 유닉스에서 돌릴테니..

붙여다가 쓰시는 방식으로 확장하셔 합니다.

memcached 등과.. 여러가지를 잘 붙여쓰시면 충분히 빠르고 편리합니다.

( 가기까지 과정은 고난의 연속이지만 말입니다 )

------------------------------------------------------------------------------------------------
Life is in 다즐링

------------------------------------------------------------------------------------------------
Life is in 다즐링

koseph의 이미지

PHP가 빠른 건 사실이지만 항상 그렇진 않답니다.

먼저 고려하셔야 할 것은 PHP가 native OOP 언어가 아닌 hybrid OOP언어라는 점입니다. 그래서, 문법도 버전별로 좀 차이가 나구요. 갈수록 형식은 OOP 모양새를 갖추려고 하는 중입니다.

그리고 PHP는 컴파일 언어가 아니기 때문에 $var 정도는 애교로 봐주시는 게 좋습니다. 없으면 허전합니다. PHPer들에겐요. ^^

일단 OOP로 가게 되면.... 속도는 많이 떨어집니다.
그건 instance 정보를 주렁 주렁 달고 다녀서 메모리도 많이 사용하게 되고요. 즉, procedural에서의 함수 vs. 함수 아규먼트에 비해 오브젝트간 메시지의 크기가 엄청나게 증가해서 많은 양의 데이터를 한꺼번에 처리하는 경우 메모리 사용량이 급격히 증가합니다. 아마도 OOP 특성상 이건 어떤 경우라도 피해가기가 힘들듯...

어플리케이션에서 자주 사용하는 DB connection 부분을 procedural로 구현한 경우와 이를 OOP로 구현한 경우 혹은 OOP로 이미 만들어진 루틴을 그냥 불러서 사용하는 경우 실제로 퍼포먼스를 프로파일링한 결과를 보면 OOP로 넘어가는 순간 속도는 많이 떨어집니다. PHP에선 물론 Zend optimizer가 있긴 하지만 이게 여의치 않으면 3rd party accelerator가 있습니다. 쓸만 하냐구요? 저는 yes에 한표입니다.

그럼, PHP에선 OOP를 쓰지 말라는 얘기인가? 현실적으로 안 쓸순 없죠. ^^; 특히나 기존의 라이브러리를 활용하고자 하는 경우라면요.
아주 빈번하게 쓰이면서 동시에 퍼포먼스가 필요한 경우라면 너무 큰 클래스를 쓰는 건 자충수가 될 수 있습니다.

자바가 좋냐, PHP가 좋냐라는 주제가 아니기 때문에 더 이상 말은 줄이구요.

1. 입맛에 맞는 IDE로 극복하시는 수밖에 없군요. 외국에선 Dreamweaver를 쓰는 경우도 있습니다만 Zend Studio라는 것도 있습니다. 다만 한글과 문제가 좀 됩니다. 이맥스가 포팅되어 있는 환경에서 작업하신다면 emacs의 php-mode를 써보시기 바랍니다. PHP OOP코드에서 힘을 발휘할 지는 저도 모르겠습니다.

2. 커넥션 풀이 없다는 건.... 그만큼 자유롭다는 뜻이 아닐까요? ^^; 직접 간단하게 작성해서 쓰셔도 되구요. 그리고, 다양한 공개라이브러리가 존재합니다. PEAR 패키지로도 제공이 되구요. 자바 영토와는 다른 구성을 보입니다. 단점일 수도 있겠지만 성능을 올리는 부분에선 당연히 선택의 여지가 큽니다. 그리고 위에 언급하신 다른 패키지를 이용해서 동일한 기능을 구현할 수도 있구요.

3. OOP에 있어서 자바와 동일한 수준을 요구하시는 건 아직까지 좀 힘들죠.
말씀하신 부분은 http://snippets.dzone.com/posts/show/1617 와 같이 기존의 예외처리 부분을 확장해서 쓰는 방식으로 꼼수를 부려야 합니다.

4. 역시 마찬가지입니다. 완벽한 OOP 언어라고 말할 수 없는 부분이 바로 그런 부분입니다. 하지만, 전 OOP를 아주 많이 사용하는 편이 아니어서 불편한 줄 모르겠습니다. 자세한 건 www.php.net 을 참조하시길 바랍니다.
---------------------------------
There's always another way, dear.

---------------------------------
There's always another way, dear.

송효진의 이미지

4. 는 mysqli 함수를 쓰면 binding 이 됩니다. PDO 클래스를 추천합니다.

emerge money
http://wiki.kldp.org/wiki.php/GentooInstallSimple - 명령어도 몇개 안되요~
http://xenosi.de/

7339989b62a014c4ce6e31b3540bc7b5f06455024f22753f6235c935e8e5의 이미지

3. 자바의 finally 블럭처럼 connection을 확실히 닫을수 있는 방법

register_shutdown_function 함수를 이용하면 됩니다.

송효진의 이미지

php 는 원래 종료시 자동으로 닫아줍니다.
꼭 닫아야 한다면 클래스의 __destruct() 로 좀더 깔끔하게 처리할 수도 있겠지요.

emerge money
http://wiki.kldp.org/wiki.php/GentooInstallSimple - 명령어도 몇개 안되요~
http://xenosi.de/

김정균의 이미지

2번과 4번은 sqlrelay 를 사용할 경우 한꺼번에 해결이 가능합니다.

php가 웹에서 java 보다 유리한 점은 그만큼 확장성이 좋다는 것입니다. php 자체에서 지원해 주지 않아도 middle ware 붙이기가 쉽거든요.

hongminhee의 이미지

위에 이미 나온 이야기지만, 모든 커넥션은 자동으로 닫혀집니다. 올리신 코드에 대해서는, IteratorIteratorAggregate 인터페이스를 구현하시는 쪽을 추천합니다. foreach 문에서도 사용할 수 있고… 여러모로 언어에서 제공하는 각종 인터페이스가 잘 맞기 때문입니다. (아직 Python만큼 잘 되어있진 않습니다.)

kmryu의 이미지

db의 자원뿐 아니라 다른 객체를 사용할때에도 exception이 발생 할 것을 고려하여 일일이 finally를 쓴다는 것은 개발자를 너무 피곤하게 만듭니다.
.net에선 효율적이고 안전한 자원관리를 위해 using을 통해서 자동으로 try/finally가 이루어지는데 php도 윗 분들 말씀대로 그런 류의(개발자가 명시하지 않아도 예외처리를 알아서 처리해주는..)방법을 찾으시는게 좋겠습니다. (있지 않을까요?..)

소타의 이미지

1. 개인적 차이일 듯..
2. 이건 언어의 특성이 아니라 자바라면 컨테이너의 차이겠죠. DBMS마다 세션 컨트롤러를 선택할 수도 있고 다른 써드파티를 사용할 수도 있습니다.
3. runtime scope가 언어의 특성마다 다른데 PHP처럼 종료 시 자동으로 닫아주는데 필요한가요?
4. 사용중이신 구형 mysql 인터페이스에서만 지원하지 않을 수 있습니다. pgsql용 기본 인터페이스에서는 지원합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.