PHP의 연결 풀링
J2EE 컨테이너에서처럼 PHP를 사용할 때 데이터베이스 연결을 캐시할 수 있습니까?만약 그렇다면, 어떻게?
php에는 연결 풀링이 없습니다.
mysql_pconnect와 connection pooling은 다른 것입니다.에는 많은 문제가 있습니다.mysql_pconnect
먼저 매뉴얼을 읽고 신중하게 사용해야 하지만 이는 연결 풀링이 아닙니다.
연결 풀링은 응용 프로그램 서버가 연결을 관리하는 기술입니다.응용 프로그램이 연결을 필요로 할 경우 응용 프로그램서버에 연결을 요청하고 사용 가능한 연결이 있는 경우 응용 프로그램서버는 풀링된 연결 중 하나를 반환합니다.
접속 확장을 php로 할 수 있습니다.http://www.oracle.com/technetwork/articles/dsl/white-php-part1-355135.html 링크를 참조해 주세요.
따라서 php에는 연결 풀링이 없습니다.
Julio가 말했듯이 apache는 현재 요청에 대한 요청이 종료되면 모든 리소스를 해방합니다.mysql_pconnect를 사용할 수 있지만 이 함수는 제한되므로 매우 주의해야 합니다.다른 선택지는 싱글톤 패턴을 사용하는 것이지만, 풀링은 아닙니다.
이것은 좋은 기사입니다.https://blogs.oracle.com/opal/highly-scalable-connection-pooling-in-php
이 기사도 읽어보세요.http://www.apache2.es/2.2.2/mod/mod_dbd.html
영속적인 접속은 접속 풀링과는 전혀 다릅니다.동일한 요청/스크립트 실행 컨텍스트 내에서 여러 DB 연결을 만든 경우에만 php의 영구 연결이 재사용됩니다.대부분의 일반적인 웹 개발 시나리오에서는 mysql_pconnect를 사용하면 다음 요청 시 열려 있는 연결에 대한 참조를 스크립트에서 얻을 수 없기 때문에 접속 최대 시간이 훨씬 더 빨리 만료됩니다.php에서 db 연결을 사용하는 가장 좋은 방법은 스크립트 실행 컨텍스트 내에서 연결이 재사용되도록 db 개체의 싱글톤 인스턴스를 만드는 것입니다.이렇게 하면 요청당 최소 1개의 DB 연결이 발생하지만 요구당 여러 개의 DB 연결을 만드는 것보다 더 좋습니다.
php의 특성상 php에는 실제 DB 연결 풀링이 없습니다.Php는 적어도 일종의 대규모 해킹이 없는 한, 요청 사이에 앉아 열린 연결 풀에 대한 참조를 관리할 수 있는 애플리케이션 서버가 아닙니다.이론적으로는 어플리케이션서버를 php로 작성하여 백그라운드에서 다수의 db접속을 열어놓고 참조를 다른 스크립트로 넘겨주는 명령줄 스크립트로 실행할 수 있다고 생각합니다만, 실제로 그것이 가능한지, 명령줄 스크립트에서 참조를 다른 스크립트로 넘기는 방법은 모르겠습니다.잘 될 것 같진 않아요. 잘 될 수 있다 해도요.어쨌든 그건 대부분 추측일 뿐이야.php와 같은 프리포크 서버의 접속 풀링을 허용하기 위해 다른 사람이 아파치 모듈에 올린 링크를 방금 발견했습니다.흥미로워 보인다: https://github.com/junamai2000/mod_namy_pool#readme
mod_php를 사용하는 것 같은데, 맞죠?
PHP 파일의 모든 실행이 완료되면 해당 파일의 상태가 중지되므로 (PHP 코드에서) 연결 풀링을 수행할 방법이 없습니다.대신 확장 기능에 의존해야 합니다.
mysql_pconnect를 사용하면 페이지 종료 후 연결이 닫히지 않습니다.이렇게 하면 연결이 다음 요청에서 재사용됩니다.
필요한 것은 이것뿐이지만 열린 상태를 유지할 연결 수를 지정할 방법이 없기 때문에 연결 풀링과 같지 않습니다.
MySQLi를 사용할 수 있습니다.
자세한 내용은 [Connection pooling]섹션 @ http://www.php.net/manual/en/mysqli.quickstart.connections.php#example-1622으로 스크롤 다운합니다.
연결 풀링도 서버(예: Apache httpd)와 해당 구성에 따라 달라집니다.
열려 있는 연결 풀에서 "host, username, password, socket, port 및 default database"의 특정 조합에 대해 사용되지 않은 영구 연결을 찾을 수 없는 경우 mysqli만 새 연결을 엽니다. 그렇지 않으면 이미 열려 있는 영구 연결은 연결 풀링의 개념과 유사한 방식으로 재사용됩니다.영구 연결 사용은 PHP 지시어 mysqli.allow_persistent를 사용하여 활성화 및 비활성화할 수 있습니다.스크립트가 여는 접속의 총수는 mysqli.max_links로 제한할 수 있습니다(호스팅 서버의 한계에 도달하는 max_user_connections 문제에 대처하는 것이 흥미로울 수 있습니다).mysqli.max_persistent를 사용하여 PHP 프로세스당 최대 영구 연결 수를 제한할 수 있습니다.
더 넓은 프로그래밍 컨텍스트에서는 웹/앱 서버의 작업이지만, 이 컨텍스트에서는 연결 재사용을 지원하는 방식으로 PHP 자체의 mysqli 명령에 의해 처리됩니다.또한 Java와 마찬가지로 정적 연결 인스턴스를 가져와 재사용할 수도 있습니다.Java는 표준 JDBC의 일부로 연결 풀링도 지원하지 않습니다. JDBC 드라이버 위에 있는 모듈/레이어가 다릅니다.
PHP는 PHP 에코시스템에 있는 공통 데이터베이스에 대해 500개의 요청(pp.ini의 max_requests 구성)에 대한 연결을 유지하는 지속 데이터베이스 연결을 지원하므로 각 요청에서 새로운 연결이 생성되지 않습니다.자세한 내용은 문서를 참조하십시오.이것에 의해서, 대부분의 과제가 해결됩니다.PHP는 객체 지향 Java에 비해 강력한 비동기 이벤트 처리와 함께 광범위한 멀티 스레딩 메커니즘 및 동시 처리 측면에서 그다지 정교하지 않습니다.따라서 PHP는 풀링과 같은 메커니즘을 내장하는 것이 매우 효과적이지 않습니다.
연결 풀을 수동으로 인스턴스화할 수 없습니다.
단, mysql_pconnect 함수와 함께 "내장" 연결 풀을 사용할 수 있습니다.
제안하고 싶습니다.PDO::ATTR_PERSISTENT
영구 연결은 스크립트 실행이 종료될 때 닫히지 않는 링크입니다.영구 연결이 요청되면 PHP는 동일한 영구 연결이 이미 있는지 확인하고(이전부터 열린 상태로 유지됨) 해당 연결이 있으면 사용합니다.존재하지 않는 경우 링크가 생성됩니다.
연결 풀링은 MySQL 서버 측에서 다음과 같이 작동합니다.
- MySQL 서버 구성에서 지속성 연결이 활성화된 경우, MySQL은 요청된 클라이언트(php 스크립트)가 작업을 완료한 후 연결을 열린 상태로 유지하며 sleep 상태로 유지합니다.
- 두 번째 요청이 동일한 자격 증명 데이터(동일한 사용자 이름, 동일한 암호, 동일한 연결 매개 변수, 동일한 데이터베이스 이름, 아마도 동일한 IP에서 IP에 대해 확실하지 않음)와 함께 제공된 경우 MySQL은 sleep 상태에서 활성 상태로 이전 연결을 풀링하고 클라이언트가 연결을 사용할 수 있도록 합니다.이를 통해 MySQL은 초기 연결 리소스 시간을 절약하고 총 연결 수를 줄일 수 있습니다.
연결 풀링 옵션은 MySQL 서버 측에서 실제로 사용할 수 있습니다.PHP 코드 끝에는 옵션이 없습니다.mysql_pconnect()는 스크립트 실행 종료 시 연결 종료 요청 신호를 보내지 않도록 PHP에 알려주는 래퍼입니다.
연결 풀링 등의 기능에 대해서는 먼저 swool 확장을 설치해야 합니다.https://openswoole.com/
php에 비동기 기능을 추가합니다.
그 후 mysql 및 redis 접속 풀링을 추가하는 것은 간단합니다.
https://github.com/open-smf/connection-pool
일부 PHP 프레임워크에는 풀링이 포함되어 있습니다.https://hyperf.wiki/2.2/#/en/pool
언급URL : https://stackoverflow.com/questions/39753/connection-pooling-in-php
'source' 카테고리의 다른 글
PHP 컨스트럭터의 __construct() 대 SameAsClassName() (0) | 2023.01.22 |
---|---|
django 관리자가 필드를 NULL로 설정할 수 있도록 하려면 어떻게 해야 합니까? (0) | 2023.01.22 |
html에서 php를 사용하여 img src, title 및 alt를 추출하는 방법은 무엇입니까? (0) | 2023.01.22 |
요소를 기준으로 마우스 위치 찾기 (0) | 2023.01.22 |
mysql 데이터베이스의 사이즈는 어떻게 취득합니까? (0) | 2023.01.22 |