站点高并发写问题的一个解决实践

站点高并发写问题的一个解决实践

我负责一个基于Yii的lamp站点维护和优化,其中有一个表的并发写很高,导致用户体验差,甚至写失败造成数据丢失,分析后发现这个表其实并发读要求很低,所以计划将写记录到log中,定期将log写入mysql。

log4php在yii中使用

log4php是Apache的一个log框架,下载下来的库,放在与yii中protected一个目录下。修改配置log4php/config.php,这个是php数组格式的配置信息,我们希望将记录写入文件,并按照小时来切分,如:

<?php
    return array(
    ‘rootLogger‘ => array(
    ‘appenders‘ => array(‘default‘),
    ),
    ‘appenders‘ => array(
        ‘default‘ => array(
            ‘class‘ => ‘LoggerAppenderDailyFile‘,
            ‘layout‘ => array(
            ‘class‘ => ‘LoggerLayoutSimple‘
            ),
            ‘params‘ => array(
            ‘datePattern‘ => ‘Y-m-d.H‘,
            ‘file‘ => ‘./history_log/history-%s.log‘,
            )
        )
    )
    );

很简单吧,当然,要在yii的index.php中对库引用:

// history_log
$log4php=dirname(__FILE__).‘/log4php/Logger.php‘;
$log4phpconfig=dirname(__FILE__).‘/log4php/config.php‘;
require_once($log4php);
Logger::configure($log4phpconfig);

使用上,在业务处举个栗子:

Logger::getRootLogger()->info(json_encode($item));

这样,数据就记录在日志中,举个栗子:

周期将log写入数据库

我使用shell和yii的commands支持相结合来做定期脚本,意识流,为了省事。

shell来获取时间并调用yii command:

logTime=$(date --date=‘1 hour ago‘ +%Y-%m-%d.%H)

/home/qec/qss/www/protected/yiic UpdateHistory $logTime

yii php用来读log,写mysql,一个继承yii的CConsoleCommand类就好:

class UpdateHistoryCommand extends CConsoleCommand
{
    const LOGPATH=‘/home/qec/qss/www/history_log/‘;

    public function __construct()
    {
    }

    public function run($args)
    {
        if(count($args) != 1){
            echo "need one time arg","\n";
            return false;
        }
        $logTime = $args[0];
        $logFileName = ‘history-‘.$logTime.‘.log‘;
        echo "logFileName: ",$logFileName,"\n";
        echo self::LOGPATH.$logFileName,"\n";
        $path= self::LOGPATH.$logFileName;
        $logFd = fopen($path, ‘r‘);
        if($logFd == 0){
            echo "Open logFile ",self::LOGPATH,$logFileName," failed!\n";
            return false;
        }
        $this->addLogToHistory($logFd);
    }
    ...

最后,crontab里面加入定时任务:

5 * * * * source /home/qec/.bash_profile;cd /home/qec/qss/www/protected/commands; sh hourlyJobs.sh >> ../runtime/hourlyJobs.log

就可以了。

PS:第一次使用markdown,感觉不错。

时间: 2024-10-13 20:37:05

站点高并发写问题的一个解决实践的相关文章

大型站点高并发架构技术

高并发: 高并发主要是由于网站PV访问量大,单台服务器涌承载大量访问所带来的压力,所以会采用多台服务器进行分流,采用服务器集群技术,对于每个访问会被 发送到哪台服务器,我们采取负载均衡策略,常见的技术有LVS,由于网站中有大量的静态页面,所以采用缓存服务器和反向代理技术,包括HAPROXY,Redis,数据库可以采用数据库集群,进行读写分离,缓解数据库压力. 大型站点高并发架构就是利用负载均衡技术.反向代理技术.数据库集群.web服务器集群.Nosql技术等,以实现单台数据器不能达到的并发量,换

高并发架构系列:如何解决Redis雪崩、穿透、并发等5大难题

别人用手机刷新闻.刷段子,你用手机刷知识.你会的越多,成功率就越高. 本篇分享大型网站高并发架构设计是如何解决Redis雪崩.穿透.并发等5大难题的,以下,enjoy~ 缓存雪崩 数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机. 比如一个雪崩的简单过程: 1.redis集群大面积故障 2.缓存失效,但依然大量请求访问缓存服务redis 3.redis大量失效后,大量请求转向到mysql数据库 4.mysql的调用量暴增,很

Linux C++ Socket 高并发短连接 TIME_WAIT 挥之不去解决方法

近期遇到一个项目 需要在Linux上建立一个Socket 进行 HTTP_GET , 需要线程高并发的 使用TCP Socket 进行Send 发送HTTP_GET请求到 指定网站 . 而且不需要read数据返回 一旦Send完毕就直接close了,  但这样做却在本地产生了很多 TIME_WAIT 状态 导致端口堵塞无法高并发连接了 . 在网上找了很多资料, 都说到了这点  高并发短连接的close 需要双发达成 才能进入CLOSE状态, 如果只有一段 Close(sock) 只会带来另一端的

高并发写测试悲观锁,乐观锁

源码地址 有纰漏,错误,欢迎指正,谢谢 JMeter测试工具 需要创建一个心的工程: 添加一个线程组-这里面设置秒级并发数: 添加一个请求-这里设置压力测试的接口:参数使用:${ }可以从csv文件中获取数据 请求头管理-添加需要修改的请求头信息: CSV文件-可以将请求的参数,以变量的形式,从csv文件中获取,模拟多种请求数据: 具体怎么用,百度 测试场景 测试场景为:请求对应商品,减少对应库存: 并发量:秒级1w请求: 不加锁 Controller就不写了,但是要测试,需要通过Request

PHP高并发和大流量怎么解决?

PHP高并发和大流量的解决方案 一 高并发的概念 在互联网时代,并发,高并发通常是指并发访问.也就是在某个时间点,有多少个访问同时到来. 二 高并发架构相关概念 1.QPS (每秒查询率) : 每秒钟请求或者查询的数量,在互联网领域,指每秒响应请求数(指HTTP请求) 2.PV(Page View):综合浏览量,即页面浏览量或者点击量,一个访客在24小时内访问的页面数量 --注:同一个人浏览你的网站的同一页面,只记做一次pv 3.吞吐量(fetches/sec) :单位时间内处理的请求数量 (通

高并发场景下请求合并的实践

前言 项目中一般会请求第三方的接口,也会对外提供接口,可能是RPC,也可能是HTTP等方式.在对外提供接口时,有必要提供相应的批量接口,好的批量实现能够提升性能. 高并发场景中,调用批量接口相比调用非批量接口有更大的性能优势.但有时候,请求更多的是单个接口,不能够直接调用批量接口,如果这个接口是高频接口,对其做请求合并就很有必要了.比如电影网站的获取电影详情接口,APP的一次请求是单个接口调用,用户量少的时候请求也不多,完全没问题:但同一时刻往往有大量用户访问电影详情,是个高并发的高频接口,如果

MySQL面试必考知识点:揭秘亿级高并发数据库调优与最佳实践法则

做业务,要懂基本的SQL语句: 做性能优化,要懂索引,懂引擎: 做分库分表,要懂主从,懂读写分离... 数据库的使用,是开发人员的基本功,对它掌握越清晰越深入,你能做的事情就越多. 今天我们用10分钟,重点梳理一遍以下几方面: 数据库知识点汇总: 数据库事务特性和隔离级别: 详解关系型数据库.索引与锁机制: 数据库调优与最佳实践: 面试考察点及加分项. 知识点汇总 一.数据库的不同类型 1.常用的关系型数据库 Oracle:功能强大,主要缺点就是贵 MySQL:互联网行业中最流行的数据库,这不仅

[转]10分钟梳理MySQL知识点:揭秘亿级高并发数据库调优与最佳实践法则

转:https://mp.weixin.qq.com/s/RYIiHAHHStIMftQT6lQSgA 做业务,要懂基本的SQL语句: 做性能优化,要懂索引,懂引擎: 做分库分表,要懂主从,懂读写分离... 数据库的使用,是开发人员的基本功,对它掌握越清晰越深入,你能做的事情就越多. 今天我们用10分钟,重点梳理一遍以下几方面: 数据库知识点汇总: 数据库事务特性和隔离级别: 详解关系型数据库.索引与锁机制: 数据库调优与最佳实践: 面试考察点及加分项. 一.数据库的不同类型 1.常用的关系型数

Nginx和Tengine解决高并发和高可用,而非推荐Apache

什么是Nginx  什么是Tengine 看看国内大公司在用Nginx和Tengine吗? 步骤一:进入 https://www.taobao.com/,按F12.可看到 有很多APP对淘宝进行请求.随便点击一个, 步骤二:当然,可以看到,并不都在nginx里.比如还有Tengine...等其他.这个自行去看吧! 所以,学会一个知识,淘宝网站里,用到了很多,并非nginx一家.  Nginx和Apache的优缺点  进入Tengine官网 自行去看吧! 什么是高并发和负载均衡 如何解决高并发和负