PHP控制站点并发

一般来说,一个项目中总是会有一些较难处理的业务,比如业务复杂花样繁多的搜索,使用搜索系统如sphinx,lucence等来处理的话,数据源的若是变化过快(如顶、踩、浏览数之类),则首先推数据的频率就较难衡量,另外无法精确搜索或排序。所以一般情况下的做法是通过DB进行搜索,并且除了尽量将业务分解到程序层面外,还会在DB前加一层cache。但是这样做也有不少已知的弊端:

1、实际上很多业务无法放到普通的PHP中处理,如一些较复杂的排序、筛选,通过普通的PHP来实现的话效率还不如MYSQL。

2、cache的命中率也不好保证,特别是对一些使用关键词进行查询的业务,关键词变化太多。

若是遇到恶意刷的话,DB服务器容易直接挂掉,因此我们可以在程序层面上加一层限制器,限制并发数,该限制器具备以下特点:

1、高效(废话么,否则直接刷限制器就刷爆了)。现在是使用memcache进行原子操作计数,可以扩展成使用其他方法。

2、精确到action层。可以单独限制单个页面。

3、方便。见仁见智吧

4、成本低廉。包括研发成本与硬件成本。

根据压测,原先只能100并发的搜索功能,限制100后,压测800结果正常。

使用方法如下:

<?php

/**

* 搜索

*/

public function search(){

//增加计数器功能,超过次数则返回系统繁忙

$viewlimiter = Library::load(‘viewlimiter‘);

//访问限制器的名称,请用controller+action,尽量单个页面保持唯一

$limitName = ‘search_search‘;

//最多同时访问数

$limit = 100;

//若是超过数量则直接返回

if(!$viewlimiter->check($limitName, $limit)) {

ajaxOutput(0, $this->lang->line(‘multi_search_limit‘));

}

/*----复杂变态的业务逻辑-----*/

$xxxModel->search($params);

}

//end func

?>

时间: 2024-12-08 20:04:54

PHP控制站点并发的相关文章

【问底】夏俊:深入站点服务端技术(一)——站点并发的问题

url=http%3A%2F%2Fwww.csdn.net%2Farticle%2F2015-03-16%2F2824221&type=3&count=&appkey=&title=%E6%9C%AC%E6%96%87%E6%9D%A5%E8%87%AA%E6%8B%A5%E6%9C%89%E5%8D%81%E5%B9%B4IT%E4%BB%8E%E4%B8%9A%E7%BB%8F%E9%AA%8C%E3%80%81%E6%93%85%E9%95%BF%E7%BD%91%E

Nginx控制站点的访问

站点资源有些目录不想让他人访问,那么我们就可以做一些权限设置 一下面的站点为例子:location /redhat { root /web/html; index index.html index.htm; deny 192.168.0.123; 拒绝 allow 192.168.0.0./24; allow 192.168.1.1.; deny all; 除了上面的2个剩下的都拒绝 } 原文地址:http://blog.51cto.com/openstack2016/2159882

Windows Server 2008 R2控制站点隐藏并限制访问任意盘符的组策略配制方法

域控隐藏盘符的设置项 在组策略管理编辑器中,依次打开的用户配置→策略→管理模板→Windows组件→Windows资源管理器,其中有两项: 隐藏"我的电脑"中的这些指定的驱动器 防止从"我的电脑"访问驱动器 只设置* 第一项 能让盘符在资源管理器窗口中消失,但是仍然可以通过快捷方式的打开文件位置等方式进入到磁盘:同时设置 第二项 *既能够隐藏盘符,也能避免用户通过其他方式直接在资源管理器中访问磁盘. 系统默认的配置方案 在上述两项的编辑窗口选择启用,发现系统默认都只

控制每次线程池的并发线程的最大个数

[本人原创],欢迎交流和分形技术,转载请附上如下内容: 作者:itshare [转自]http://www.cnblogs.com/itshare/ 1. 实验目的:       使用线程池的时候,有时候需要考虑服务器的最大线程数目和程序最快执行所有业务逻辑的取舍.并非逻辑线程越多也好,而且新的逻辑线程必须会在线程池的等待队列中等待 ,直到线程池中工作的线程执行完毕,才会有系统线程取出等待队列中的逻辑线程,进行CPU运算. 2.  解决问题:     <a>如果不考虑服务器实际可支持的最大并行

Linux Shell多进程并发以及并发数控制

1. 基础知识准备 1.1. linux后台进程 Unix是一个多任务系统,允许多用户同时运行多个程序.shell的元字符&提供了在后台运行不需要键盘输入的程序的方法.输入命令后,其后紧跟&字符,该命令就会被送往到linux后台执行,而终端又可以继续输入下一个命令了. 比如: sh a.sh & sh b.sh & sh c.sh & 这三个命令就会被同时送往linux后台执行,在这个程度上,认为这三个命令并发执行了. 1.2. linux文件描述符 文件描述符(缩

shell中控制多个进程并发执行的方法

shell中实现多进程实际上就是将多个任务放到后台中执行而已,但是现在需要控制多进程并发的数量该如何实现呢?别急,我们一步一步来实现这个目标,首先从最原始的串行执行开始: #!/bin/bash start=`date +%s` for i in $(seq 1 5); do echo test sleep 2 done end=`date +%s` time=$(($end - $start)) echo "time: $time" 执行结果: # sh test1.sh test

java并发的艺术-读书笔记-第八章常用的并发工具类

jdk中提供了几个非常有用的工具类,分别是CountDownLatch,CyclicBarrier和semaphore exchanger CountDownLatch:允许一个或者多个线程等待其他线程完成操作 public class CountDownLatchTest{ static CountDownLatch c = new CountDownLatch(2); public static void main(String[] args){ new Thread(new Runnabl

C#高级知识点概要(2) - 线程和并发

原文地址:http://www.cnblogs.com/Leo_wl/p/4192935.html 我也想过跳过C#高级知识点概要直接讲MVC,但经过前思后想,还是觉得有必要讲的.我希望通过自己的经验给大家一些指引,带着大家一起走上ASP.NET MVC大牛之路,少走弯路.同时也希望能和大家一起交流,这样也能发现我自己的不足,对我自己的帮助也是非常大的. 建议大家对C#撑握的不错的时候,可以去看一些开源项目.走技术这条路,就要耐得住寂寞(群里双休日说要让群主找妹子进群的人必须反思),练好内功.不

[ASP.NET MVC 大牛之路]03 - C#高级知识点概要(2) - 线程和并发

我也想过跳过C#高级知识点概要直接讲MVC,但经过前思后想,还是觉得有必要讲的.我希望通过自己的经验给大家一些指引,带着大家一起走上ASP.NET MVC大牛之路,少走弯路.同时也希望能和大家一起交流,这样也能发现我自己的不足,对我自己的帮助也是非常大的. 建议大家对C#撑握的不错的时候,可以去看一些开源项目.走技术这条路,就要耐得住寂寞(群里双休日说要让群主找妹子进群的人必须反思),练好内功.不撑握C#高级知识点,别想看懂优秀的开源项目,更别指望吸收其编程思想:你的水平,随时可以被一个实习生代