Apache 日志格式LogFormat参数详解

2012年3月26日 admin 评论已被关闭

在httpd.conf (apache2.conf)里可以看到一行这样的配置

LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”" combined 的日志格式
或者其他简写记录的 common agert 等。

请求本身的情况将通过在格式字符串中放置各种”%”转义符的方法来记录,它们在写入日志文件时,根据下面的定义进行转换:

%a 远端IP地址
%A 本机IP地址
%B 除HTTP头以外传送的字节数
%b 以CLF格式显示的除HTTP头以外传送的字节数,也就是当没有字节传送时显示’-’而不是0。
%{Foobar}C 在请求中传送给服务端的cookieFoobar的内容。
%D 服务器处理本请求所用时间,以微为单位。
%{FOOBAR}e 环境变量FOOBAR的值
%f 文件名
%h 远端主机
%H 请求使用的协议
%{Foobar}i 发送到服务器的请求头Foobar:的内容。
%l 远端登录名(由identd而来,如果支持的话),除非IdentityCheck设为”On”,否则将得到一个”-”。
%m 请求的方法
%{Foobar}n 来自另一个模块的注解Foobar的内容。
%{Foobar}o 应答头Foobar:的内容。
%p 服务器服务于该请求的标准端口。
%P 为本请求提供服务的子进程的PID。
%{format}P 服务于该请求的PID或TID(线程ID),format的取值范围为:pid和tid(2.0.46及以后版本)以及hextid(需要 APR1.2.0及以上版本)
%q 查询字符串(若存在则由一个”?”引导,否则返回空串)
%r 请求的第一行
%s 状态。对于内部重定向的请求,这个状态指的是原始请求的状态,—%>s则指的是最后请求的状态。
%t 时间,用普通日志时间格式(标准英语格式)
%{format}t 时间,用strftime(3)指定的格式表示的时间。(默认情况下按本地化格式)
%T 处理完请求所花时间,以秒为单位。
%u 远程用户名(根据验证信息而来;如果返回status(%s)为401,可能是假的)
%U 请求的URL路径,不包含查询字符串。
%v 对该请求提供服务的标准ServerName。
%V 根据UseCanonicalName指令设定的服务器名称。
%X 请求完成时的连接状态:X= 连接在应答完成前中断。
+= 应答传送完后继续保持连接。
-= 应答传送完后关闭连接。

可以根据需要定义 LogFormat 格式来记录需要的日志。 例如
LogFormat “%{X-Forwarded-For}i %l %u %t %D %X \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\” \ “%{Cookie}i\” %v” common

在配置文件中要记录日志的话可以直接
CustomLog /opt/log/access_log common
按天拆分日志
CustomLog “|/usr/sbin/rotatelogs /opt/log/%Y%m%d.log 86400″ common

分类: PHP 标签:

利用screen做php的守护进程

2012年2月20日 admin 评论已被关闭

最近一个项目用了页面刷新触发伪cron查询数据库的功能,当流量很大时,需要不停的查,不太好,写了个php脚本,作为进程来运行。

[root@eric home]#  screen

运行php脚本

[root@eric home]#  php /opt/www/webroot/deal.php

deal.php页为

1
2
3
4
5
6
while(true){
	/*
       略
	*/
	sleep(30);
}

ctrl+a +d

OK ,screen -ls 会发现

There are screens on:
28395.pts-4.eric (Detached)
1 Sockets in /var/run/screen/S-root.

关掉 SSH 也可以不停运行了。

想要结束很简单 kill掉 就可以.

分类: PHP, 随便写写 标签:

mysql 查询当天、本周、上周、本月、上个月份的数据

2011年8月5日 admin 评论已被关闭

查询当天的记录

select * from hb_article_view where TO_DAYS(hb_AddTime) = TO_DAYS(NOW())

查询当前这周的数据
SELECT name,submittime FROM enterprise WHERE YEARWEEK(date_format(submittime,’%Y-%m-%d’)) = YEARWEEK(now());

查询上周的数据
SELECT name,submittime FROM enterprise WHERE YEARWEEK(date_format(submittime,’%Y-%m-%d’)) = YEARWEEK(now())-1;

查询当前月份的数据
select name,submittime from enterprise where date_format(submittime,’%Y-%m’)=date_format(now(),’%Y-%m’)

查询距离当前现在6个月的数据
select name,submittime from enterprise where submittime between date_sub(now(),interval 6 month) and now();

查询上个月的数据
select name,submittime from enterprise where date_format(submittime,’%Y-%m’)=date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),’%Y-%m’)

select * from `user` where DATE_FORMAT(pudate,’%Y%m’) = DATE_FORMAT(CURDATE(),’%Y%m’) ;

select * from user where WEEKOFYEAR(FROM_UNIXTIME(pudate,’%y-%m-%d’)) = WEEKOFYEAR(now())

select *
from user
where MONTH(FROM_UNIXTIME(pudate,’%y-%m-%d’)) = MONTH(now())

select *
from [user]
where YEAR(FROM_UNIXTIME(pudate,’%y-%m-%d’)) = YEAR(now())
and MONTH(FROM_UNIXTIME(pudate,’%y-%m-%d’)) = MONTH(now())

select *
from [user]
where pudate between 上月最后一天
and 下月第一天

分类: PHP 标签:

技术人员的产品观

2011年3月18日 admin 评论已被关闭

 “这里用户体验不好,麻烦修改下。“P说。

“这里也不不好,麻烦修改下。”P说。

“还有这里…这里…这里…这里……”P说。

产品同事总有一堆堆的问题找我们修改。头都爆炸了。

这只是一个例子,实际中,还有很多。对于这一幕,我们不用纠结产品同事是否如何,我们站在技术人员的角度来看看这个问题。

在我们开发产品的过程中,我们是否考虑过产品是否易用呢?是否考虑过用户群是谁呢?是否考虑过产品目标是什么呢?是否考虑过产品的商业模式?是否考虑过产品的运营?是否考虑过产品的优化?是否考虑过产品数据的深度挖掘?…

站在肯定的立场,我们如何思考和实施呢?

首先我们来看看做产品前,都要考虑的几个问题。

1.产品定位
我们要做什么产品?核心竞争力是什么?

2.行业分析
该行业有没有比较成功的案例?是否有竞争对手?竞争对手的商业模式是怎样的?

3.用户分析
我们的用户群都有哪些?分别都有什么特性?

4.产品分析
产品有什么核心功能?分别可以满足用户的哪些核心需求?产品有哪些内容?产品的哪些内容最能吸引用户?

5.商业模式
产品如何盈利?如何长远发展?

在这五个方面之前,还要考虑用户需求调研,可行性分析等。

我们再来看下,产品开发过程中,主要都关注些什么?

1.交互设计
产品所要传达的信息,如何能更好的传递给用户?不同的用户群是否要需要不同的展现和交互方式?

2.用户体验
如何给用户以最好的feeling?

当然,在开发过程中,还会关注开发过程,测试等等。

最后我们来看下,开发完成后,都关注些什么呢?

1.产品推广
产品如何推广?广告?联盟?微博?SEO ……

2.产品运营
产品如何运营?如何拉来用户?如何留住用户……

3.数据挖掘
运营数据需要监控哪些?如何分析?根据分析结果如何优化产品……

在这些过程中,我们技术人员,需要关注和考虑什么呢?如果你全部关注,最好不过了。

为什么需要关注这些呢?
技术固然重要,但体现技术价值的,将技术转化为生产力的产品也同样重要。在关注技术的同时,关注产品,创造更好的产品,创造更高的价值。

Google wave 、google TV 从技术角度而言,很给力。但从产品角度而言,却Ungelivable,最终走向失败。

不要把我们的视野仅仅停留在coding,不要两耳不闻窗外事,一心只做coding活。

腾讯CEO马化腾,是个技术达人,但也非常关注产品。几乎每一款产品出来第一个体验的就是他。

百度CEO李彦宏,也是个技术牛人。其也非常之关注产品。百度的诸多产品也都经历其手。

关注这些有什么用呢?
也有很多技术人员在迷茫,难道要coding到七老八十?于是大家都在讨论发展方向和转型的问题。至于具体转型到哪个方向?是否要转型,暂不做讨论。但有一点是要提及的,就是可转型方向之一便是产品。

当你站在用户使用的角度去开发产品,那必定是较为好用的产品;当你站在老板的角度开发产品,那必定是较为成功的产品。

再说的实在一些,关注产品,对于技术人员的职业素质的提高,大有裨益。关注产品,来年的加薪可能就是你,来年的升职的可能就是你。

2011新年伊始,抬起头看看,做个不是非常艰难的决定,关注产品,培养你的产品观,拓展你的职业发展之路,成就你的职业旅程。

本文已经首发于InfoQ中文站,版权所有,原文为 技术人员的产品观——暨2011年展望 如需转载,请务必附带本声明,谢谢。

PHP 中文字符串截取方法汇总

2011年3月7日 admin 1 条评论

PHP 截取字符串代码

通过指定编码进行字符串截取:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
 * @todo 中文截取,支持gb2312,gbk,utf-8,big5
 *
 * @param string $str 要截取的字串
 * @param int $start 截取起始位置
 * @param int $length 截取长度
 * @param string $charset utf-8|gb2312|gbk|big5 编码
 * @param $suffix 是否加尾缀
 */
function CsubStrPro($str, $start = 0, $length, $charset = "utf-8", $suffix = true)
{
    if (function_exists ( "mb_substr" ))
        return mb_substr ( $str, $start, $length, $charset );
 
    $re ['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
    $re ['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
    $re ['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
    $re ['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
    preg_match_all ( $re [$charset], $str, $match );
    $slice = join ( "", array_slice ( $match [0], $start, $length ) );
    if ($suffix)
        return $slice . "…";
 
    return $slice;
}

2:自动识别 GBK 和UTF-8 编码的字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
function cutStr($sourcestr, $cutstart=0, $cutlength) {
    $returnstr = '';
    $i = 0;
    $n = 0;
    $str_length = strlen ( $sourcestr ); //字符串的字节数
    while ( ($n < $cutlength) and ($i <= $str_length) ) {
        $temp_str = substr ( $sourcestr, $i, 1 );
        $ascnum = Ord ( $temp_str ); //得到字符串中第$i位字符的ascii码
        if ($ascnum >= 224) //如果ASCII位高与224,
        {
            $returnstr = $returnstr . substr ( $sourcestr, $i, 3 ); //根据UTF-8编码规范,将3个连续的字符计为单个字符
            $i = $i + 3; //实际Byte计为3
            $n ++; //字串长度计1
        }
        elseif ($ascnum >= 192) //如果ASCII位高与192,
        {
            $returnstr = $returnstr . substr ( $sourcestr, $i, 2 ); //根据UTF-8编码规范,将2个连续的字符计为单个字符
            $i = $i + 2; //实际Byte计为2
            $n ++; //字串长度计1
        }
        elseif ($ascnum >= 65 && $ascnum <= 90) //如果是大写字母,
        {
            $returnstr = $returnstr . substr ( $sourcestr, $i, 1 );
            $i = $i + 1; //实际的Byte数仍计1个
            $n ++; //但考虑整体美观,大写字母计成一个高位字符
        }
        else //其他情况下,包括小写字母和半角标点符号,
        {
            $returnstr = $returnstr . substr ( $sourcestr, $i, 1 );
            $i = $i + 1; //实际的Byte数计1个
            $n = $n + 0.5; //小写字母和半角标点等与半个高位字符宽...
        }
    }
    if ($str_length > $i) {
        $returnstr = $returnstr . "..."; //超过长度时在尾处加上省略号
    }
    return $returnstr;
}
分类: PHP 标签: ,

PHP将汉字转化成拼音的函数(用于取首字母索引或按字母排序中文)

2011年2月23日 admin 评论已被关闭

PHP将汉字转化成拼音的函数(用于取首字母索引或按字母排序中文)
阅读全文…

分类: PHP 标签: , , ,

ThinkPHP海量数据分表机制详细代码及说明

2011年2月23日 admin 评论已被关闭

应用ThinkPHP内置的分表算法处理百万级用户数据.

数据表:
house_member_0
house_member_1
house_member_2
house_member_3

模型:

1
2
3
4
5
6
7
8
9
10
class MemberModel extends AdvModel {
 
    protected $partition = array('field'=>'username','type'=>'id','num'=>'4');
 
    public function getDao($data=array()) {
        $data = empty($data) ? $_POST : $data;
        $table = $this->getPartitionTableName($data);
        return $this->table($table);
    }
}

阅读全文…

分类: PHP 标签: , ,

PHP获取当前页面url

2011年2月23日 admin 评论已被关闭
1
2
3
4
5
6
7
8
9
function get_url() { 
	if (!isset($_SERVER['REQUEST_URI'])) {  
		$url = $_SERVER['REQUEST_URI'];      
		}else{ 
			$url = $_SERVER['SCRIPT_NAME'];     
			$url .= (!empty($_SERVER['QUERY_STRING'])) ? '?' . $_SERVER['QUERY_STRING'] : '';           
			}    
			return $url;
	}

此函数返回正在执行的文件名信息。
当前 url:”http://”.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']

获取URL相关的服务器环境变量:
1,$_SERVER["QUERY_STRING"]
说明:查询(query)的字符串

2,$_SERVER["REQUEST_URI"]
说明:访问此页面所需的URI

3,$_SERVER["SCRIPT_NAME"]
说明:包含当前脚本的路径

4,$_SERVER["PHP_SELF"]
说明:当前正在执行脚本的文件名

实例:
1,http://www.wenan8.com/ (直接打开主页)
结果:
$_SERVER["QUERY_STRING"] = “”
$_SERVER["REQUEST_URI"] = “/”
$_SERVER["SCRIPT_NAME"] = “/index.php”
$_SERVER["PHP_SELF"] = “/index.php”

2,http://www.wenan8.com/?s=55 (附带查询)
结果:
$_SERVER["QUERY_STRING"] = “s=55″
$_SERVER["REQUEST_URI"] = “/?s=55″
$_SERVER["SCRIPT_NAME"] = “/index.php”
$_SERVER["PHP_SELF"] = “/index.php”

3,http://www.wenan8.com/index.php?s=55&l=wenan
结果:
$_SERVER["QUERY_STRING"] = “s=55&l=wenan”
$_SERVER["REQUEST_URI"] = “/index.php?s=55&l=wenan”
$_SERVER["SCRIPT_NAME"] = “/index.php”
$_SERVER["PHP_SELF"] = “/index.php”

$_SERVER["QUERY_STRING"]获取查询语句,实例中可知,获取的是?后面的值
$_SERVER["REQUEST_URI"] 获取http://www.wenan8.com后面的值,包括/
$_SERVER["SCRIPT_NAME"] 获取当前脚本的路径,如:index.php
$_SERVER["PHP_SELF"] 当前正在执行脚本的文件名

分类: PHP 标签: ,

蛋疼的腾讯礼仪

2011年1月19日 admin 评论已被关闭

刚才在微博发了条言:
AD : 出售可靠#黄牛党# 电话。

在登录一看。打不开腾讯微博了。

呵,腾讯也出来”礼仪” 啦? 你凭神马 断定的我 不符合你腾讯的礼仪啦!
疼训呀,真让人蛋疼!

分类: 随便写写 标签: ,

PHP中使用JSON

2011年1月19日 admin 评论已被关闭

目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。

从5.2版本开始,PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码。

一、json_encode()

该函数主要用来将数组和对象,转换为json格式。先看一个数组转换的例子:

      $arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);
 
      echo json_encode($arr);

结果为

      {"a":1,"b":2,"c":3,"d":4,"e":5}

再看一个对象转换的例子:

      $obj->body = 'another post';
 
      $obj->id = 21;
 
      $obj->approved = true;
 
      $obj->favorite_count = 1;
 
      $obj->status = NULL;
 
      echo json_encode($obj);

结果为

      {
        "body":"another post",
 
        "id":21,
 
        "approved":true,
 
        "favorite_count":1,
 
        "status":null
      }

阅读全文…

分类: PHP 标签: , , ,