• 展开微博窗口
  • QQ:52619941
  • 微信:cnmemory
  • 展开分类目录
  • 还没有账号?

Memory

记一次redis响应慢的处理

背景

前段时间,公司某业务在高并发下,单机单个redis实例中,有个大字符串的get操作总是很慢。查看slowlog并无慢日志记录。

原因

通过咨询掌阅@老錢,得到了以下答复

redis的网络读写和逻辑处理都是单个线程处理的,slowlog只是衡量逻辑处理的时间并不包括接受指令和发送响应的时间。字符串的get操作逻辑非常快,所以slowlog没有任何信息。但是网络读写就慢了,特别是高并发下何况你的value也大的有点离谱,内存中有大量待发送的缓冲数据堆积在那里,单线程需要拼命地发送数据,所以才会这样缓慢。建议将value于本地内存缓存起来。

解决

老錢的建议是将value缓存到本地内存,当然也可以考虑增加redis实例做读写分离来分散压力,但是受限于当时项目的规模,在项目初期都是在用单个redis实例操作,如果做redis集群,业务代码改动相对较大,于是还是决定将value进行本地缓存。

那么由于项目架构采用的是传统的nginx+php-fpm,无法常驻内存,于是决定利用/dev/shm(tmpfs)将这个value缓存到本地内存文件系统中。

既然用到了本地缓存,就要考虑集群下机器的value一致性,所以最终使用redis在每台机器上部署了一个订阅服务,当value发生改变时,更新本地缓存。

效果

从zabbix中可以很明显看到网络传输的峰值下降了非常多,可见这个key在业务高峰期时读取有多频繁。

结论

对于大字符串,偶尔读写不会存在问题,但是在频繁读写就会给redis带来不小的压力,所以可以考虑做本地缓存和redis集群。…

php基于libevent实现并发socket服务端

通常提到PHP,很多人都认为它只能做Web项目,当然,在Web开发时也的确能够体现出PHP迅敏开发的优势。

那么我们能否单纯的用PHP开发网络服务端?我们从最简单的做法开始尝试。

如下面一段代码,想要用PHP来实现一个socket服务端相对来说还是比较简单的。

$ip = '127.0.0.1';

关于php的pctnl扩展小记

pcntl扩展在加载的时候,在初始化module的阶段会将pcntl_signal_dispatch方法作为tick事件发生时的触发函数,所以使用declare(ticks = 1)也能捕捉到信号量。

PHP源码剖析如下:


PHP_MINIT_FUNCTION(pcntl)
{
	php_register_signal_constants(INIT_FUNC_ARGS_PASSTHRU);
	php_pcntl_register_errno_constants(INIT_FUNC_ARGS_PASSTHRU);
	php_add_tick_function(pcntl_signal_dispatch TSRMLS_CC);

	return SUCCESS;
}

星期五

PHP的对象和引用赋值

在PHP的手册上看到这么一句话

在php5 的对象编程经常提到的一个关键点是“默认情况下对象是通过引用传递的”。但其实这不是完全正确的。下面通过一些例子来说明。

php的引用是别名,就是两个不同的变量名字指向相同的内容。在php5,一个对象变量已经不再保存整个对象的值。只是保存一个标识符来访问真正的对象内容。 当对象作为参数传递,作为结果返回,或者赋值给另外一个变量,另外一个变量跟原来的不是引用的关系,只是他们都保存着同一个标识符的拷贝,这个标识符指向同一个对象的真正内容。

并且提供了这么一个例子


class A {
 public $foo = 1;
} 

$a = new A;
$b = 

记一CI框架的$_POST编码问题

最近在做支付回调接口时,碰到一个编码问题,由于第三方支付平台异步通知post方式请求使用的是GBK编码,而我们项目服务端使用UTF-8编码开发,所以在做signature验证时,我们需要将post的数据进行编码转换

iconv("GBK//IGNORE", 'UTF-8', $_POST[$key]);

然而转换的结果竟然和原文并不一致,导致MD5后的签名和第三方通知过来的签名不匹配。于是决定脱离CI框架写一个简单的demo来获取第三方平台通知的数据内容是否正确,发现在原生php下,第三方平台post过来的数据是正常的,而在CI框架下,$_POST获取到数据的汉字编码字符却和原生PHP下$_POST获得的字符不一致。为了解决问题,尝试使用

$data = file_get_contents("php://input");

来获取原始数据,简单的将方法进行封装

function get_input_value() {
    static $content = null;
    

当foreach遇到PDOStatement:bindParam

前段时间在开发一个小项目的时候遇到了一个问题,只怪学艺不精,我们先看看代码:

<?php
$data = $_REQUEST['data'];
$sql = "update config set price1=?, price2=?, price3=? ";
$stmt = $dbh->prepare($sql);
foreach($data as $key=>$val) 

浅谈面向对象与代码可读性

你是否能读懂下面这段代码呢,反正我是看不懂。

<?php
class MakeLove
{
    
    //Current piston motion frequency
    private $frequency 0;
    //Max piston motion frequency
    private $maxFrequency 

CSS3+JS+PHP制作实时时钟

闲下来的时候就爱捣鼓些小玩意,顺便来一首经典的老歌,随意感受一下^_^,回归正题,今天给大家带来的是一款由CSS3实现的实时时钟(DEMO的链接在文本的末尾),主要的思路是利用css3的transform和animation来实现一个会走的钟摆,那么,为什么会利用到PHP呢?因为要通过animation制作一个指针转动的动画,但是在animation动画中,指针的起始点要根据实际的时间来控制,我们就需要PHP的帮助,通过下面的代码计算出时针,分针,秒针的初始位置:

date_default_timezone_set('Asia/Shanghai');
$sec = date('s');
$min = date('i')+$sec/60;
$hour = date('H')+$min/60;
$hour_deg = floor($hour/12*360);
$min_deg = floor($min/60*360);
$sec_deg = floor($sec/60*360);