Linux、C、PHP、WEB架构底层服务开发

给PHP增加函数强制类型返回

在开发过程中,函数的返回值类型应该是确定不变的,但PHP是弱类型的语言,

所以PHP是没有此类语法验证的,正因为如此,造成了很多坑坑。

比如下面的代码:

<?php
function getArticles(...){
    $arrData = array();
    if($exp1){
      return $arrData;
    }else if($exp2){
      return 1;
    }else{
      return false;
    }

}
$arrData =getArticles(...);
foreach($arrData as $record){
//do something.
....
}
?>

Continue reading “给PHP增加函数强制类型返回” »

作者 斯人 | 发布于 2014 年 7 月 3 日 | Tags PHP PHP内核

基于yaf的模块化开发方案

随着网站流量越来越大,用户越来越多,需求也越来越复杂,一站式开发已经远远不能支撑我们业务发展需要,在产品发展期间碰到的问题越来越多,技术架构限制了业务的发展,这对于研发人员来讲是不能忍的,业务制约技术发展可以理解,但技术制约业务发展是绝对不允许的。
Continue reading “基于yaf的模块化开发方案” »

作者 斯人 | 发布于 2016 年 2 月 17 日

Nginx PHP 使用 limit_req,limit_conn 限制并发,外加白名单

下面方法可以防止黑客知道你的源服务器真实IP进行并发攻击,通常只需要保护动态文件请求,如PHP。

添加文件 nginx/conf/limit/whiteip.conf 里面是你要忽略限制的白名单IP地址,通常是你自己的地址或者CND地址,或者负载均衡服务器的IP地址,再或者你的安全代理服务器的地址。
Continue reading “Nginx PHP 使用 limit_req,limit_conn 限制并发,外加白名单” »

作者 斯人 | 发布于 2015 年 7 月 8 日

PHPer都应该关注的服务端性能问题–听云Server试用笔记

很早就在用国外的NewRelic(http://www.newrelic.com/)的APM产品来监测自己网站的PHP应用性能了。无奈国外的服务从国内访问起来实在是太慢了,虽然New Relic已经上市了,但是这访问慢的问题却是一直没见好转,反而越来越严重。可能是GFW时不时抽风所致,有时候还得翻墙才能访问New Relic的报表。虽说翻墙是码农们必备的技能,但是为了看个报表查个故障都要翻墙的话实在太麻烦了。   最近非常意外地发现国内也有提供和New Relic类似服务的厂商了。听云(http://www.tingyun.com/),国内老牌的网络性能监测厂商基调网络提供的APM Saas服务,也是2014年底开始公测他们针对PHP的性能管理产品听云Server。非常幸运地拿到了听云Server的试用帐号,这周在自己的测试环境里测试了一下,感觉还不错,虽然暂时还达不到国外New Relic的成熟水平,但是基本已经可以使用了。这两天抽时间总结了一下测试的过程和使用感受。   Continue reading “PHPer都应该关注的服务端性能问题–听云Server试用笔记” »

作者 斯人 | 发布于 2015 年 2 月 5 日

fpm开启slowlog Fsockopen出现Operation now in progress的问题追踪二

关于具体问题,请参见上一篇 fpm开启slowlog Fsockopen出现Operation now in progress的问题追踪一

本文主要是定位问题。

接上一篇。

引起该问题的原因有两个:
1)connect的socket连接操作是非阻塞的(是起因但并非结果):
如果connect要用非阻塞,那就需要select/poll来监听我们的socket句柄。
Fsockopen调用 main/network.c 中php_network_connect_socket函数来建立connect连接,
首先它会将sock句柄设为非阻塞
Continue reading “fpm开启slowlog Fsockopen出现Operation now in progress的问题追踪二” »

作者 斯人 | 发布于 2014 年 6 月 4 日 | Tags fsockopen PHP php-fpm PHP内核

fpm开启slowlog Fsockopen出现Operation now in progress的问题追踪一

问题描述:

前两天老大跟我讲了一个他们原来遇到的问题,php采用fastcgi的方式启动,并且打开slow log日志,当调用fsockopen读取一个连接,这个连接超过了slowlog设置的时间,fpm进程就会抛出一个warning,用来记录关于这个满请求的一些基本信息。

详细描述如下:

假如我们设置的slowlog 的时间为5s,而通过fsockopen去访问一个不存在的ip和端口,连接超时时间设为10s,代码如下:
Continue reading “fpm开启slowlog Fsockopen出现Operation now in progress的问题追踪一” »

作者 斯人 | 发布于 2014 年 6 月 4 日 | Tags fsockopen PHP php-fpm PHP内核

对单表亿级数据的简单测试

本次对mysql做了单表亿级数据量的压测。
表的关系简单,只有两个int字段,user_id和company_id,且都增加了索引。
通过python脚本,随机向同一个表随机插入100W、500W、1000W-1E数据,并且记录了每次插入数据所耗时间。
先来看下写入数据的情况吧:
python脚本空转:
空转100W:0.14s
空转1000W:1.74s
单次插入1000W条数据:295.11s Continue reading “对单表亿级数据的简单测试” »

作者 斯人 | 发布于 2014 年 5 月 16 日 | Tags Mysql

基于Redis的BloomFilter实战

离线数据处理与实时数据处理有很大的不同,其中一个例子就是去重。在聚数据中,访问UV和购买UV都需要实时的去重。离线处理的时候,我们可以通过count(groupby)或者count(distinct)等方式比较容易的计算出UV,而且不用太担心性能,大不了就是多一点map或者执行时间久一点。那么在实时计算的时候,我们有什么好的办法来做这个事情呢?
Continue reading “基于Redis的BloomFilter实战” »

作者 斯人 | 发布于 2014 年 4 月 24 日 | Tags Redis

redis误同步恢复

redis主备同步非常方便,通过slaveof命令即可同步。上周应用切换了redis,想让新的redis和旧的redis进行数据同步,结果把新redis中其他应用已经写入的所有数据都删除了。。。这里记录下恢复方法。

首先先恢复redis的dump文件。还好现在阿里云弹性计算集群给每个镜像每天都进行了备份,通过操作前一天的备份镜像,快照制作当时的整个redis目录复制了出来,作为恢复的基础。
Continue reading “redis误同步恢复” »

作者 斯人 | 发布于 2014 年 4 月 24 日 | Tags Redis

我目前使用redis的方式

1.将redis的List用作队列,这个很轻量级,不用引入别的队列服务器,缺点是可能会丢失数据,因为其持久化方案是redis通用的aof或者rdb方式

2.将排好序的实体id放到LIST中,然后以prefix 实体id为key,用hashtable存储具体的实体信息

3.用ZSET存储排名和带有权重信息的一些实体id,缺点是内存占用太厉害了。
Continue reading “我目前使用redis的方式” »

作者 斯人 | 发布于 2014 年 4 月 24 日 | Tags Redis