好得很程序员自学网
  • 首页
  • 后端语言
    • C#
    • PHP
    • Python
    • java
    • Golang
    • ASP.NET
  • 前端开发
    • Angular
    • react框架
    • LayUi开发
    • javascript
    • HTML与HTML5
    • CSS与CSS3
    • jQuery
    • Bootstrap
    • NodeJS
    • Vue与小程序技术
    • Photoshop
  • 数据库技术
    • MSSQL
    • MYSQL
    • Redis
    • MongoDB
    • Oracle
    • PostgreSQL
    • Sqlite
    • 数据库基础
    • 数据库排错
  • CMS系统
    • HDHCMS
    • WordPress
    • Dedecms
    • PhpCms
    • 帝国CMS
    • ThinkPHP
    • Discuz
    • ZBlog
    • ECSHOP
  • 高手进阶
    • Android技术
    • 正则表达式
    • 数据结构与算法
  • 系统运维
    • Windows
    • apache
    • 服务器排错
    • 网站安全
    • nginx
    • linux系统
    • MacOS
  • 学习教程
    • 前端脚本教程
    • HTML与CSS 教程
    • 脚本语言教程
    • 数据库教程
    • 应用系统教程
  • 新技术
  • 编程导航
    • 区块链
    • IT资讯
    • 设计灵感
    • 建站资源
    • 开发团队
    • 程序社区
    • 图标图库
    • 图形动效
    • IDE环境
    • 在线工具
    • 调试测试
    • Node开发
    • 游戏框架
    • CSS库
    • Jquery插件
    • Js插件
    • Web框架
    • 移动端框架
    • 模块管理
    • 开发社区
    • 在线课堂
    • 框架类库
    • 项目托管
    • 云服务

当前位置:首页>后端语言>PHP
<tfoot draggable='sEl'></tfoot>

php怎么连接集群 php对接接口

很多站长朋友们都不太清楚php怎么连接集群,今天小编就来给大家整理php怎么连接集群,希望对各位有所帮助,具体内容如下:

本文目录一览: 1、 如何实现php+session+memcached高可用集群 2、 PHP集群如何部署?当网站的访问,数据过多时.程序应该如何调整? 3、 php怎么连接oracle 集群(oracle rac)? 如何实现php+session+memcached高可用集群

在这个互联网高度发达的时代,许多应用的用户动辄成百上千万,甚至上亿。为了支持海量用户的访问,应用服务器集群这种水平扩展的方式是最常用的。这种情形下,就会涉及到许多单机环境下完全不需要考虑的问题,这其中session的创建、共享和存储是最常见之一。

在单机环境中,Session的创建和存储都是由同一个应用服务器实例来完成,而存储也仅是内存中,最多会在正常的停止服务器的时候,把当前活动的Session钝化到本地,再次启动时重新加载。

而多个实例之间,Session数据是完全隔离的。而为了实现Session的高可用,多实例间数据共享是必然的,下面我们以Redis 的SessionManager实现多Tomcat实例Session共享的配置为例,我们来梳理下一般session共享的流程:

添加具体要使用的manager的Jar文件及其依赖

redis session manager依赖jedis, commons-pool, commons-pool2

对应版本的redis session manager的jar文件

在TOMCAT_HOME/conf/context.xml中增加如下配置

<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />

<Manager className="com.radiadesign.catalina.session.RedisSessionManager"

host="localhost"

port="6379" database="0"

maxInactiveInterval="30" />

其中host和port等替换为对应的配置信息

启动多个Tomcat实例,以自带的examples应用为例进行验证

访问examples应用的servlets/servlet/SessionExample,

在页面中添加数据到session中,并查看页面上对应的session信息

访问另一个实例上相同应用的页面,查看session信息,两者应该是一致的

使用redis-cli查看redis中存储的对应数据,相应的sessionId对应的数据已经保存了下来

以上是一个基本的配置过程,而在这些配置与验证的步骤中,第二步是核心逻辑实现。 前面的文章,曾介绍过Tomcat的Valve,在请求处理时,Pipeline中的各个Valve的invoke方法会依次执行。Tomcat的AccessLogValve介绍

此处的session处理,就是以一个自定义Valve的形式进行的。关于Session的文章,前面也写过几篇,会附在结尾处。

以下是RedisSessionhandlerValve的invoke方法,我们看,主要是在Valve执行后进行Session的存储或移除。

public void invoke(Request request, Response response) {

try {

getNext().invoke(request, response);

} finally {

final Session session = request.getSessionInternal(false);

storeOrRemoveSession(session);

manager.afterRequest();

}

}

而session的保存和移除又是通过manager执行的。 manager.save(session); manager.remove(session);

这里,manager就是前面定义的RedisSessionManager。默认单实例情况下,我们使用的都是StandardManager,对比一下两者,标准的Manager对于session的创建和删除,都会调到其父类ManagerBase中相应的方法,

public void add(Session session) {

sessions.put(session.getIdInternal(), session);

int size = getActiveSessions();

if( size > maxActive ) {

synchronized(maxActiveUpdateLock) {

if( size > maxActive ) {

maxActive = size;

}

}

}

}

public void remove(Session session, boolean update) {

if (session.getIdInternal() != null) {

sessions.remove(session.getIdInternal());

}

}

我们来看,由于其只保存在内存的Map中protected Map<String, Session> sessions = new

ConcurrentHashMap<>(),每个Tomcat实例都对于不同的map,多个实例间无法共享数据。

对应到RedisSessionManager对于session的处理,都是直接操作redis,基本代码是下面这个样:

public void save(Session session) throws IOException {

Jedis jedis = null;

Boolean error = true;

try {

RedisSession redisSession = (RedisSession) session;

Boolean sessionIsDirty = redisSession.isDirty();

redisSession.resetDirtyTracking();

byte[] binaryId = redisSession.getId().getBytes();

jedis = acquireConnection();

if (sessionIsDirty || currentSessionIsPersisted.get() != true) {

jedis.set(binaryId, serializer.serializeFrom(redisSession));

}

currentSessionIsPersisted.set(true);

jedis.expire(binaryId, getMaxInactiveInterval());

} }

移除时的操作是这样的

public void remove(Session session, boolean update) {

Jedis jedis = null;

Boolean error = true;

log.trace("Removing session ID : " + session.getId());

try {

jedis = acquireConnection();

jedis.del(session.getId());

error = false;

} finally {

if (jedis != null) {

returnConnection(jedis, error);

}

}

}

而此时,多个Tomcat实例都读取相同的Redis,session数据是共享的,其它实例的初始请求过来时,由于会执行findSession的操作,此时会从Redis中加载session,

public Session findSession(String id) throws IOException {

RedisSession session;

if (id == null) {

session = null;

currentSessionIsPersisted.set(false);

} else if (id.equals(currentSessionId.get())) {

session = currentSession.get();

} else {

session = loadSessionFromRedis(id); // 看这里,会从redis中load

if (session != null) {

currentSessionIsPersisted.set(true);

}

}

currentSession.set(session);

currentSessionId.set(id);

return session;

}

从而可以保证在一个实例被切换后,另外的实例可以继续响应同一个session的请求。

以上即为Redis实现session共享高可用的一些关键内容。有兴趣的朋友可以看下通过Memcached实现高可用,也是这个原理。顺着这个思路,如果你有将Session存储在其它地方的需求时,完全可以写一个出来,自己动手,丰衣足食。

总结一下,我们是通过自定义的Valve来实现请求后session的拦截,同时,使用自定义的SessionManager,来满足不同的session创建与存储的需求。而至于是存储在Redis/Memcached中,还是存储在DB中,只是位置的区别。原理,是一致的。

PHP集群如何部署?当网站的访问,数据过多时.程序应该如何调整?

个人建议 至少4台服务器,并且最好是以局域网方式互通(服务器4可以完全独立)

服务器1和服务器2都只放php代码程序,暴露在外网,分别当电信服务器和网通服务器

服务器3只放数据库,通过用户权限,仅允许被服务器1和2访问——不暴露在外网

服务器4只放附件,暴露在外网,所有的附件请求,都直接对这个服务器进行

需要指出的是,你如果作为网站管理者,每次管理数据库,都要用1或者2当跳板,才可以访问。

php怎么连接oracle 集群(oracle rac)?

$oraUser="nihao";//数据库账号

$oraPass="123456"; //密码

$oraDB="(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)))(CONNECT_DATA=(SID=orcl)))"; //SID要和连接的数据库对应上

$conn = ociLOGOn($oraUser,$oraPass,$oraDB) ;//连接

$rs_search=OCIParse($conn, $sql_search); //执行SQL语句

OCIExecute($rs_search);

//$rs_search这个是结果集可以用

$row=oci_fetch_array($rs_search);//把数据拿出来 这是一条数据写法 多条循环

有不明白的HI我

关于php怎么连接集群的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。

查看更多关于php怎么连接集群 php对接接口的详细内容...

声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did195788
更新时间:2023-04-26   阅读:18次

上一篇: phpcms手机 phpcms手机端+ 电脑端源码

下一篇:php对象数组排序 php对象和数组哪个效率高

相关资讯

最新资料更新

  • 1.php声明字符串 在php中声明变量应使用什么符号
  • 2.php资源扫描教程 php识别二维码内容源码
  • 3.php闭包this php闭包函数使用场景
  • 4.erpphp源码下载 thinkphp erp源码
  • 5.php登录网站 php网页登录
  • 6.有哪些php社区 phpbbs
  • 7.phpkey排序 php 排序函数
  • 8.phpping测速 测试php性能工具
  • 9.php会员登录与注册 php 用户登录
  • 10.手机打开php乱码 php乱码怎么办
  • 11.原生php提交form php原生开发的好处
  • 12.php用户检索记录系统 php搜索数据库
  • 13.php网页打印控件谷歌 php打印插件
  • 14.文章加载更多php php加载html
  • 15.php数学函数 php中函数的定义
  • 16.免费的php解密 php des解密
  • 17.修改php网页链接 怎么修改php网页
  • 18.bashphp的简单介绍
  • 19.php绘制健康码 php源码怎么搭建网站
  • 20.php开发宝典 php7开发宝典pdf下载

CopyRight:2016-2025好得很程序员自学网 备案ICP:湘ICP备09009000号-16 http://haodehen.cn
本站资讯不构成任何建议,仅限于个人分享,参考须谨慎!
本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。
本网站刊载的所有内容(包括但不仅限文字、图片、LOGO、音频、视频、软件、程序等)版权归原作者所有。任何单位或个人认为本网站中的内容可能涉嫌侵犯其知识产权或存在不实内容时,请及时通知本站,予以删除。

网站内容来源于网络分享,如有侵权发邮箱到:kenbest@126.com,收到邮件我们会即时下线处理。
网站框架支持:HDHCMS   51LA统计 百度统计
Copyright © 2018-2025 「好得很程序员自学网」
[ SiteMap ]