存档

‘PHP’ 分类的存档

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 标签:

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 标签: ,

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 标签: , , ,

DIRECTORY_SEPARATOR 与PATH_SEPARATOR

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

1.DIRECTORY_SEPARATOR

DIRECTORY_SEPARATOR:路径分隔符,linux上就是’/’ . windows上是’\’;

2.PATH_SEPARATOR

PATH_SEPARATOR是一个常量,include多个路径使用,在win下,要include多个路径的话,用”;”(分号)隔开,但在 linux下使用”:”(冒号)隔开的。在Linux系统中是一个” : “号,Windows上是一个”;”号。编写程序时最好用常量 PATH_SEPARATOR 代替,否则如果系统从linux移植到win系统或反过来移植会出错

分类: PHP 标签: , ,

PHP利用门户网站API转换IP地址到真实地址

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

腾讯,网易,新浪,搜狐都提供了IP地址转换为实际地址的接口.
腾讯:http://fw.qq.com/ipaddress 返回格式为 javascript格式对象. 形如: var IPData = new Array(“124.204.70.160″,”",”北京市”,”");
可以在页面中引入js文件 直接调用。


1
2
<script language="javascript" type="text/javascript" src="http://fw.qq.com/ipaddress"  charset="gb2312"> </script>
<script>document.write("你的IP是:"+IPData[0]+",来自:"+IPData[2]);</script>

搜狐: http://pv.sohu.com/cityjson 也是浏览器 js 调用的。返回 var returnCitySN = {“cip”: “124.204.70.160″, “cid”: “110000″, “cname”: “北京市”}; 的格式。

新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js
返回
var remote_ip_info = {“ret”:1,”start”:”124.205.0.0″,”end”:”124.205.136.255″,”country”:”\u4e2d\u56fd”,”province”:”\u5317\u4eac”,”city”:”\u5317\u4eac”,”district”:”",”isp”:”\u7535\u4fe1\u901a”,”type”:”",”desc”:”"};

新浪多地域测试方法:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=124.204.70.160

网易有道IP地址查询:http://www.youdao.com/smartresult-xml/search.s?type=ip&q=124.204.70.160

注: JavaScript调用还是PHP调用都要转换一下编码,不然得到的是乱码。
阅读全文…

分类: PHP 标签: , ,