데이터 베이스 MySQL 튜토리얼 MongoDB php driver 简要分析

MongoDB php driver 简要分析

Jun 07, 2016 pm 04:34 PM
driver mongodb php ~에 대한 분석하다 연결하다

关于连接、连接池、长连接、短连接 连接池。PHP MongoDB driver 版本( 1.2.0-1.2.12 only )使用连接池(Connection Pooling) 1.1.4及之前版本可以选择使用短连接或者长连接 举个简单的例子,写段程序连接1000次数据库: ?phpfor ($i=0; $i 需要将近18秒; 使

关于连接、连接池、长连接、短连接
连接池。PHP MongoDB driver 版本( 1.2.0-1.2.12 only)使用连接池(Connection Pooling)

1.1.4及之前版本可以选择使用短连接或者长连接
举个简单的例子,写段程序连接1000次数据库:

<?php for ($i=0; $i
로그인 후 복사

需要将近18秒;
使用长连接

<?php for ($i=0; $i "x"));
}
?>
로그인 후 복사

小于0.02秒。

1.2.x 使用连接池,所有连接都是长连接,驱动自动管理。使用长连接的直接原因是效率高。因为连接复用而省去了大量的创建连接的开销。长连接由PHP进程维护。
在执行任何查询时,都会从连接池中请求一个连接,完成之后再归还给连接池。这里的完成是指持有该连接的变量离开了它的作用域。

1.3以后连接管理做了很大改动,抛弃了连接池,连接均为长连接。
每个worker进程(线程、PHP-FPM或Apache worker)中,驱动把连接管理和Mongo*对象分离,降低驱动的复杂度
当一个worker进程启动,MongoDB驱动会为之初始化连接管理器管理连接,并且默认没有连接。
在第一个请求调用new MongoClient();时,驱动创建一个新连接,并且以一个哈希值标识这个连接。
这个哈希值包括以下参数:主机名、端口,进程ID和可选的replica set名,
如果是密码验证的连接,则还包括数据库名、用户名和密码的哈希值(对于密码验证的连接,我们后面再详细讨论)。
调用MongoClient::getConnections()方法,可以查看连接对应的哈希值
然后该连接会在连接管理器中注册:
在需要连接的任何时候,包括插入、删除、更新、查找或执行命令,驱动都会向管理器请求一个合适的连接来执行。
请求连接时会用到new MongoClient()的参数和当前进程的ID。每个worker进程/线程,连接管理器都会有一个连接列表,
而每个PHP worker同一时刻,只会运行一个请求,因此和每个MongoDB之间只需要一个连接,不断重用,
直到PHP worker终止或显式调用MongoClient::close()关闭连接。

源码简要分析,版本mongo-php-driver-1.4.5
连接初始化及连接管理
连接管理器(manager)初始化:
模块初始化的时候也就是在PHP_GINIT_FUNCTION()里面,初始化连接管理器。
php_mongo.c L288 mongo_globals->manager = mongo_init(); mongo_init()定义在mcon/manager.c L622
mongo_init() 初始化建立连接(socket连接)。

连接管理器与MongoClient分离,下面看MongoClient初始化:
mongoclient.c L338

PHP_METHOD(MongoClient, __construct)
{
 php_mongo_ctor(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
}
로그인 후 복사

php_mongo_ctor主要工作:
指定连接管理器为上面的全局管理器;
解析连接的一些参数设置,如主机,端口,选项w等等,
调用php_mongo_connect()函数
php_mongo_connect()函数定义在mongoclient.c L275
php_mongo_connect()主要调用mongo_get_read_write_connection()函数(mcon/manager.c L415)
来获得合适的连接;
mongo_get_read_write_connection()主要工作是获得合适的连接:
根据单机、复制集、mongos以及不同读写分离设置获取到合适的连接
代码对应
STANDALONE 调用mongo_get_connection_multiple(定义mcon/manager.c L319)
REPLSET mongo_get_read_write_connection_replicaset()(mcon/manager.c L249)
multiple(mongos类型在这里处理) mongo_get_connection_multiple()

获取连接及读写分离
在mcon/parse.c L457 处理replicaSet选项
L483 设置了servers->options.con_type = MONGO_CON_TYPE_REPLSET
MongoClient的__construct()和connect()里面会调用php_mongo_connect()函数
php_mongo_connect()函数定义在mongoclient.c L275
在mongo_connection()里面调用mongo_get_read_write_connection()函数
mongo_get_read_write_connection()函数定义在mcon/manager.c L415
在mongo_get_read_write_connection()里面判断了servers->options.con_type
对于replica sets,调用mongo_get_read_write_connection_replicaset()
mongo_get_read_write_connection_replicaset()定义在mcon/manager.c L249
在mongo_get_read_write_connection_replicaset()里面调用了mongo_discover_topology()去探测服务器
mongo_discover_topology()的实现在mcon/manager.c L144 ,
mongo_discover_topology()->mongo_connection_ismaster(mcon/manager.c L167)
->bson_create_ismaster_packet(mcon/mini_bson.c L86)->执行isMaster命令

replica sets
根据read preference设置,查出候选servers.
调用mongo_find_candidate_servers(mcon/read_preference.c L319)
调用mongo_find_all_candidate_servers (mcon/read_preference.c L135)
PRIMARY 找PRIMARY
PRIMARY_PREFERRED 不处理
SECONDARY_PREFERRED 找PRIMARY和SECONDARY
SECONDARY 只找SECONDARY
NEAREST 找所有类型
调用mongo_filter_candidates_by_replicaset_name(mcon/read_preference.c L211),根据复制集名称过滤;
调用mongo_filter_candidates_by_credentials (mcon/read_preference.c L270) 根据db,username,password认证,通过验证的添加到候选连接里。
调用mongo_sort_servers (mcon/read_preference.c L424)根据read preference的几种设置选项对于的排序算法,基本都是按照 ping time来排序。
调用mongo_select_nearest_servers(mcon/read_preference.c L461),
如果read preference设置的是PRIMARY,PRIMARY_PREFERRED,SECONDARY,SECONDARY_PREFERRED,NEAREST;
选择ping值最低的作为第一个元素,距最低的ping值15ms内的成员都添加进去。
调用mongo_pick_server_from_set (mcon/read_preference.c L510)
PRIMARY_PREFERRED,
根据上面的排序选择结果,如果第一个是PRIMARY(一般是),选择PRIMARY,
(当然选择如果第一个不是PRIMARY,即无主的情况,进入下面的随机选择(rand()),随机选一个复制集成员;
SECONDARY_PREFERRED,
根据上面的排序选择结果,如果大于1个,如果最后一个是PRIMARY,随机选择除PRIMARY之外SECONDARY的成员;
(当然如果只有1个了,跳到下面的随机选择步骤,选择的是PRIMARY)
随机选择,这里不管read preference设置,包含SECONDARY和nearest,
SECONDARY和nearest区别是nearest把PRIMARY当做其他secondaries一样。
nearest不是选择ping值绝对最低的那一个,而是包含绝对最低的+15ms内的组合里(如果到这个阶段不止一个的话)随机选择一个。

mongos
调用mongo_get_connection_multiple(mcon/manager.c L319)
调用mongo_get_connection_single( mcon/manager.c L55),测试连通性
调用mongo_find_candidate_servers (mcon/read_preference.c L319)->
调用mongo_filter_candidates_by_seed ( mcon/read_preference.c L245 ) 连接生成hash,
比较seed列表里hash与servers里的hash,返回相等的。
调用mongo_filter_candidates_by_credentials (mcon/read_preference.c L270) 根据db,username,password认证
通过验证的添加到候选连接里。
调用mongo_sort_servers (mcon/read_preference.c L424)根据read preference的几种设置选项对于的排序算法,基本都是按照
ping time来排序。
调用mongo_select_nearest_servers(mcon/read_preference.c L461),选择ping值最低的。
Hash格式:

  • HOST:PORT;-;.;PID
    或者
  • HOST:PORT;REPLSETNAME;DB/USERNAME/md5(PID,PASSWORD,USERNAME);PID

简单总结
对给出的mongos连接串,逐个去建立连接,测试连通性,如果都连不通,退出;
对这些连接做一下过滤与验证,对合格的连接根据ping值选择最快的来连接。
所以对于mongos来说,如果只提供一个连接,是不能找到其他mongos的。这与replica sets不同,
对于replica sets,任意一个数据成员可以找到其他所有数据成员。

参考:
http://mongodb.github.io/node-mongodb-native/driver-articles/anintroductionto1_1and2_2.html
http://emptysqua.re/blog/reading-from-mongodb-replica-sets-with-pymongo/
http://docs.mongodb.org/manual/core/read-preference-mechanics/
http://wulijun.github.io/2012/12/10/mongodb-php-driver-connectiong-handling.html
http://derickrethans.nl/mongodb-connection-handling.html
http://www.php.net/manual/zh/mongo.connecting.persistent.php

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

<gum> : Bubble Gum Simulator Infinity- 로얄 키를 얻고 사용하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
Nordhold : Fusion System, 설명
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora : 마녀 트리의 속삭임 - Grappling Hook 잠금 해제 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP 및 Python : 코드 예제 및 비교 PHP 및 Python : 코드 예제 및 비교 Apr 15, 2025 am 12:07 AM

PHP와 Python은 고유 한 장점과 단점이 있으며 선택은 프로젝트 요구와 개인 선호도에 달려 있습니다. 1.PHP는 대규모 웹 애플리케이션의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 데이터 과학 및 기계 학습 분야를 지배합니다.

PHP와 Python : 다른 패러다임이 설명되었습니다 PHP와 Python : 다른 패러다임이 설명되었습니다 Apr 18, 2025 am 12:26 AM

PHP는 주로 절차 적 프로그래밍이지만 객체 지향 프로그래밍 (OOP)도 지원합니다. Python은 OOP, 기능 및 절차 프로그래밍을 포함한 다양한 패러다임을 지원합니다. PHP는 웹 개발에 적합하며 Python은 데이터 분석 및 기계 학습과 같은 다양한 응용 프로그램에 적합합니다.

PHP : 데이터베이스 및 서버 측 로직 처리 PHP : 데이터베이스 및 서버 측 로직 처리 Apr 15, 2025 am 12:15 AM

PHP는 MySQLI 및 PDO 확장 기능을 사용하여 데이터베이스 작업 및 서버 측 로직 프로세싱에서 상호 작용하고 세션 관리와 같은 기능을 통해 서버 측로 로직을 처리합니다. 1) MySQLI 또는 PDO를 사용하여 데이터베이스에 연결하고 SQL 쿼리를 실행하십시오. 2) 세션 관리 및 기타 기능을 통해 HTTP 요청 및 사용자 상태를 처리합니다. 3) 트랜잭션을 사용하여 데이터베이스 작업의 원자력을 보장하십시오. 4) SQL 주입 방지, 디버깅을 위해 예외 처리 및 폐쇄 연결을 사용하십시오. 5) 인덱싱 및 캐시를 통해 성능을 최적화하고, 읽을 수있는 코드를 작성하고, 오류 처리를 수행하십시오.

PHP의 목적 : 동적 웹 사이트 구축 PHP의 목적 : 동적 웹 사이트 구축 Apr 15, 2025 am 12:18 AM

PHP는 동적 웹 사이트를 구축하는 데 사용되며 해당 핵심 기능에는 다음이 포함됩니다. 1. 데이터베이스와 연결하여 동적 컨텐츠를 생성하고 웹 페이지를 실시간으로 생성합니다. 2. 사용자 상호 작용 및 양식 제출을 처리하고 입력을 확인하고 작업에 응답합니다. 3. 개인화 된 경험을 제공하기 위해 세션 및 사용자 인증을 관리합니다. 4. 성능을 최적화하고 모범 사례를 따라 웹 사이트 효율성 및 보안을 개선하십시오.

PHP와 Python 중에서 선택 : 가이드 PHP와 Python 중에서 선택 : 가이드 Apr 18, 2025 am 12:24 AM

PHP는 웹 개발 및 빠른 프로토 타이핑에 적합하며 Python은 데이터 과학 및 기계 학습에 적합합니다. 1.PHP는 간단한 구문과 함께 동적 웹 개발에 사용되며 빠른 개발에 적합합니다. 2. Python은 간결한 구문을 가지고 있으며 여러 분야에 적합하며 강력한 라이브러리 생태계가 있습니다.

Composer를 사용하여 권장 시스템의 딜레마를 해결하십시오 : Andres-Montanez/권장 사항-펀들 Composer를 사용하여 권장 시스템의 딜레마를 해결하십시오 : Andres-Montanez/권장 사항-펀들 Apr 18, 2025 am 11:48 AM

전자 상거래 웹 사이트를 개발할 때 어려운 문제가 발생했습니다. 사용자에게 개인화 된 제품 권장 사항을 제공하는 방법. 처음에는 간단한 권장 알고리즘을 시도했지만 결과는 이상적이지 않았으며 사용자 만족도에도 영향을 미쳤습니다. 추천 시스템의 정확성과 효율성을 향상시키기 위해보다 전문적인 솔루션을 채택하기로 결정했습니다. 마지막으로 Composer를 통해 Andres-Montanez/Residations-Bundle을 설치하여 문제를 해결했을뿐만 아니라 추천 시스템의 성능을 크게 향상 시켰습니다. 다음 주소를 통해 작곡가를 배울 수 있습니다.

PHP와 Python : 그들의 역사에 깊은 다이빙 PHP와 Python : 그들의 역사에 깊은 다이빙 Apr 18, 2025 am 12:25 AM

PHP는 1994 년에 시작되었으며 Rasmuslerdorf에 의해 개발되었습니다. 원래 웹 사이트 방문자를 추적하는 데 사용되었으며 점차 서버 측 스크립팅 언어로 진화했으며 웹 개발에 널리 사용되었습니다. Python은 1980 년대 후반 Guidovan Rossum에 의해 개발되었으며 1991 년에 처음 출시되었습니다. 코드 가독성과 단순성을 강조하며 과학 컴퓨팅, 데이터 분석 및 기타 분야에 적합합니다.

PHP를 사용하는 이유는 무엇입니까? 설명 된 장점과 혜택 PHP를 사용하는 이유는 무엇입니까? 설명 된 장점과 혜택 Apr 16, 2025 am 12:16 AM

PHP의 핵심 이점에는 학습 용이성, 강력한 웹 개발 지원, 풍부한 라이브러리 및 프레임 워크, 고성능 및 확장 성, 크로스 플랫폼 호환성 및 비용 효율성이 포함됩니다. 1) 배우고 사용하기 쉽고 초보자에게 적합합니다. 2) 웹 서버와 우수한 통합 및 여러 데이터베이스를 지원합니다. 3) Laravel과 같은 강력한 프레임 워크가 있습니다. 4) 최적화를 통해 고성능을 달성 할 수 있습니다. 5) 여러 운영 체제 지원; 6) 개발 비용을 줄이기위한 오픈 소스.

See all articles