2012-03-28 3 views
2

postgreSQL 데이터베이스에서 사용자 작업으로 (기본) 로깅을 사용하고 있습니다. 성능을 향상시키기 위해 모든 로그 삽입을 비동기 적으로 실행하여 스크립트를 계속 진행시키고 로그 항목이 작성 될 때까지 기다리지 않습니다.PostgreSQL을 사용하여 PHP에서 비동기 준비 문을 실행하고 결과를 무시함

SQL 인젝션을 방지하고 필요에 따라로드하기 위해 준비된 구문을 모든 곳에서 사용합니다.

문을 준비 할 때 보류 중의 결과가 이전의 비동기 쿼리에서 페치 될 때 문제가 발생합니다. (PostgreSQL은 새로운 문장을 준비하기 전에 보류 된 결과가 있다고 말합니다.)

따라서 workarround로 모든 보류 결과 (있는 경우)를 모으고 무시하고 PHP와 PostgreSQL을 만족스럽게 작성하여 진술을 준비합니다.

하지만 그 workarround (내가 본 것처럼)로 결과를 수집해야 asyncronously 실행하여 얻을 수있는 성능을 놓친다.

준비된 명령문을 비동기 적으로 실행할 수있는 방법이 있습니까? 그리고 결과를 무시하도록 postgres에 신중하게 말합니까? 내 PostgreSQL의 클래스 내부

, 나는

pg_send_execute($this->resource, $name, $params); 

으로 준비된 문을 호출하고

//Just in case there are pending results (workarround) 
while (pg_get_result($this->resource)!==FALSE); 
$stmt = pg_prepare($this->resource, $stmtname, $query); 

어떤 도움이 apreciated 될 것이다 그들을 prepairing하고있다.

업데이트 : 사용중인 모든 비동기 쿼리는 INSERT 쿼리 만이므로 이론적으로 결과를 무시해야합니다.

답변

3

오직 비동기적인 것은 PostgreSQL 서버와의 통신입니다. 데이터베이스는 모든 것을 순차적으로 처리해야합니다.

내 제안 :

당신은, 로깅의 PostgreSQL을 사용하여 로깅을 위해 별도의 데이터베이스 연결을 사용하여 스크립트와 데이터베이스 사이에 앉아 연결 풀을 얻을 수있는 경우 - PostgreSQL의에서 인증은 비용이 많이 들고 시간이 좀 걸립니다, 이것은 그것을 줄일 것입니다. 두 번째 연결을 얻는 데는 시간이 걸리지 만이 방법을 사용하면 연결 풀이없는 경우보다 빠를 것입니다.

안정성 요구 사항에 따라 자동 충돌 (PHP 충돌시 로그 항목을 잃지 않음)을 사용해야합니다. databse 끝 (데이터가 WAL을 건너 뛸 때 빠른 삽입)에 대해 신경 쓰지 않거나 복제를 사용하지 않거나 로그가 필요하지 않은 경우 UNLOGGED 테이블 (PostgreSQL 9.1부터 사용 가능)을 사용할 수 있습니다 복제.

속도 최적화로서 로그 테이블에는 각 삽입시 업데이트해야하기 때문에 색인이 없어야합니다. 필요한 경우 두 번째 테이블을 만들고 일괄 처리로 데이터를 이동합니다 (X 분마다 또는 매 시간마다).

+0

감사합니다. 그 접근 방식은 더 건설적인 답변입니다. :) – StormByte

관련 문제