2012-04-30 2 views
7

그들은 둘 다 준비 문을 가지고 있습니다. pg_ *는 libpq의 래퍼입니다. 권리?PDO 대 pg_ * 기능

저는 PHP에서 PDO를 좋아하지만 앞으로 데이터베이스를 변경하지 않을 것입니다. 어떤 라이브러리를 사용해야합니까? 벤치 마크가 있습니까? PHP 버전 : 직접 콘크리트 DB 접근 기능을 사용하여 5.4

답변

4

이럴 (같은 pg_oci_mysql[i]_ 등)은 PDO 또는 DBMS 층 (등 교리, DIBI를) 사용 후 항상 조금 더 빨리 .

그러나 OOP 아키텍처에서 PDO 또는 모든 DBMS 계층을 사용하면이 계층을 사용하는 방법을 배우기 때문에 더 나은 접근 방식 (IMHO, 다시)을 취해야하므로 DB 엔진이 무엇이든 상관없이 사용하게됩니다. 물론 응용 프로그램 내에서 DB 엔진을 변경하는 경우 전체 응용 프로그램을 다시 작성하지 않아도됩니다.

DB 엔진을 변경하지 않으려는 경우에도 PDO를 사용하는 것이 좋습니다. 하지만 그건 내 의견 :-)

+0

@MorrisonHotel Pardon me? – shadyyx

+0

내 코멘트가 안좋아. :) – MorrisonHotel

+0

PostgreSQL : ** SELECT TO_STRING (...) from mytable LIMIT 1 OFFSET 1 ** MySQL : ** SELECT DATE_FORMAT (...) from mytable LIMIT 1,1 ** PDO를 사용해도 데이터베이스에 대한 모든 요청을 다시 작성해야합니다. 따라서 PDO는 만병 통치약이 아닙니다. 나는 Doctrine, Propel 등 (제외됨)을 사용해야 할 것이다. – MorrisonHotel

1

나는 이것이 더 맛의 문제라고 생각한다. PDO은 컴파일 된 이후 더 빠를 수 있으며, 래퍼 역할을하기 때문에 빠를 수도 있습니다. 속도 차이가 귀하의 결정에 영향을 미치지 않을만큼 작을 것이라고 확신합니다.

이 순수한 추측이지만, PDO는 새로운 지금은 DB 연결을위한 표준 것 같다, 그래서 코드의 관점에서 지원 아마 성장할 것이다, mysql_*에 대한 지원 반면 아마 pg_*이 약 해지는 것을 계속할 것이다.

PDO의 가장 큰 장점은 추상화를 통해 나중에 다른 DB로 전환 할 수 있다는 것입니다. 그러나 그렇게하지 않을 것이라고 확신하므로 결정을 내리지 않아야합니다.

나는 개인적으로 PDO으로 작업하는 것을 선호합니다. "리소스"변수보다 객체를 전달하고 제어하는 ​​것이 더 쉽습니다.

+0

폭발, 정말인가요? 필자는 PHP와 Postgre에 익숙하지 않아 이제는 사용할 기술을 결정할 필요가있었습니다. 몇 가지 테스트를 실행하고 pg_connect가 PDO보다 더 빠른 것처럼 보입니다. – HMarioD

9

PDO는 멋진 인터페이스를 제공하지만 더 일반화되면 각 백엔드의 미묘한 특이성을 처리하는 데 더 많은 어려움이 따른다. the bugtracker을 보면 많은 문제가 있으며 그 중 일부는 심각한 문제입니다.

다음은 postgresql의 일화적인 증거입니다. PDO의 파서는 standard_conforming_strings을 ON으로 설정하는 데 문제가 있습니다 (PG-9.1 기준). PHP-5.3.9 와 테스트 케이스 :

$dbh->exec("SET standard_conforming_strings=on"); 
$p=$dbh->prepare("SELECT 1 WHERE 'ab\' = :foo AND 'cd' = :bar"); 
$p->execute(array(":foo" => "ab", ":bar" => "cd")); 

는 (실행)은 예기치 Database error: SQLSTATE[HY093]: Invalid parameter number: :foo와 PDO 층에 실패한다. foo를 매개 변수로 식별 할 수없는 것 같습니다.

다른 조건없이 'ab\'=:foo 후에 쿼리가 중지되면 정상적으로 작동합니다. 또는 다른 조건에 문자열이 포함되어 있지 않으면 잘 작동합니다.

issue #55335과 유사한 문제가 발생하여 으로 처리되지 않았습니다. 제 의견으로는 매우 잘못된 것으로입니다. [사실, PDO를 직접 해킹 해본 적이 있지만 다른 백엔드와 호환되지 않는 방식으로 패치가 적용되지 않았습니다. 나는 쿼리 어휘 분석기가 너무 일반적인 것에 당황했다.]

한편, pg_ *는 libpq에 가깝기 때문에, 이런 종류의 문제는 처음에는 발생하지 않을 가능성이 적고, 해결된다면 더 쉽게 해결할 수 있습니다.

그래서 요점은 PDO가 모든 것이 좋지 않다는 것입니다. 내부적으로는 pg_ *보다 확실히 어렵습니다. 복잡성이 커지면 더 많은 버그가 발생합니다. 이 버그가 해결 되었습니까? 특정 bugtracker 항목을 기반으로합니다.

+1

+1 우수 게시물. 관련 증거를 통해 입증 된 당신의 주장을 분명히했습니다. RDBMS에 더 가까이 다가 가면 더 빠르고 깨끗합니다. –