月度归档:2017年06月

PHP中设置时区3方法小结

今天发现一段PHP代码中的时间判断语句出了点问题,研究了一下发现问题出在PHP的时区设置上,PHP所取的时间默认是格林威治标准时间,所以和北京时间相差8小时

找到原因后,在网上搜索到了一些关于PHP的时区设置方法: 



1、修改php.ini,在php.ini中找到data.timezone =去掉它前面的;号,然后设置data.timezone = “Asia/Shanghai”;即可。 



2、在程序PHP 5以上版本的程序代码中使用函数ini_set(‘date.timezone’,’Asia/Shanghai’);或者date_default_timezone_set(‘Asia/Shanghai’); 



一些常用的时区标识符说明: 



Asia/Shanghai – 上海 

Asia/Chongqing – 重庆 

Asia/Urumqi – 乌鲁木齐 

Asia/Hong_Kong – 香港 

Asia/Macao – 澳门 

Asia/Taipei – 台北 

Asia/Singapore – 新加坡 





函数设置时区方法: 

复制代码代码如下:

<?php 
function_exists(date_default_timezone_set);//在这他总是返回1,这函数是判断这里面的字符是不是一个定义了的函数名 
date_default_timezone_set(“Etc/GMT”);//这是格林威治标准时间,得到的时间和默认时区是一样的 
date_default_timezone_set(“Etc/GMT+8”);//这里比林威治标准时间慢8小时 
date_default_timezone_set(“Etc/GMT-8”);//这里比林威治标准时间快8小时 
date_default_timezone_set(‘PRC’); //设置中国时区 
?> 





函数ini_set()设置时区: 

可以在文件开头加入 ini_set(‘date.timezone’,’Asia/Shanghai’); // ‘Asia/Shanghai’ 为上海时区 



手动修改php.ini设置 
打开php找到date.timezone = “PRC” 如有去掉前面的分号,没有的话手动添加! 



以下是一些资料补充:



装上PHP5后你会发现这样的问题 

$atime=date(“Y-m-d H:i:s”); 

echo $atime; 

?> 

输出:2006-05-16 06:36:06 

现在几点了?/我的是14:36 

这是为什么捏? 

原因是假如你不在程序或配置文件中设置你的服务器当地时区的话 

PHP所取的时间是格林威治标准时间,所以和你当地的时间会有出入 

格林威治标准时间和北京时间大概差8个小时左右 那么我们如何避免时间误差呢? 

我们一起来看看解决方法: 

在页头使用date_default_timezone_set()设置我的默认时区为北京时间 

复制代码代码如下:

<? 
date_default_timezone_set(‘PRC’); 
echo date(‘Y-m-d H:i:s’); 
?> 



时间和服务器当前时间一样了! 

另外附date_default_timezone_set用法如下: 

———————————————————————————— 

date_default_timezone_set 

(PHP 5 >= 5.1.0RC1) 

date_default_timezone_set — 设定用于一个脚本中所有日期时间函数的默认时区 

说明 

bool date_default_timezone_set ( string timezone_identifier ) 

date_default_timezone_set() 设定用于所有日期时间函数的默认时区。 

注: 自 PHP 5.1.0 起(此版本日期时间函数被重写了),如果时区不合法则每个对日期时间函数的调用都会产生一条 E_NOTICE 级别的错误信息。 

参数 

timezone_identifier 

时区标识符,例如 UTC 或 Europe/Lisbon 

返回值 

本函数永远返回 TRUE(即使 timezone_identifier 参数不合法)。 

————————————————————————————- 

或者修改 php.ini 中 date.timezone 值 

date.timezone = PRC 



装上PHP5后你会发现这样的问题 

$atime=date(“Y-m-d H:i:s”); 

echo $atime; 

?> 

输出:2006-05-16 06:36:06 

现在几点了?/我的是14:36 

这是为什么捏? 

原因是假如你不在程序或配置文件中设置你的服务器当地时区的话 

PHP所取的时间是格林威治标准时间,所以和你当地的时间会有出入 

格林威治标准时间和北京时间大概差8个小时左右 那么我们如何避免时间误差呢? 

我们一起来看看解决方法: 

在页头使用date_default_timezone_set()设置我的默认时区为北京时间 

复制代码代码如下:

<? 
date_default_timezone_set(‘PRC’); 
echo date(‘Y-m-d H:i:s’); 
?> 



时间和服务器当前时间一样了! 

另外附date_default_timezone_set用法如下: 

———————————————————————————— 

date_default_timezone_set 

(PHP 5 >= 5.1.0RC1) 

date_default_timezone_set — 设定用于一个脚本中所有日期时间函数的默认时区 

说明 

bool date_default_timezone_set ( string timezone_identifier ) 

date_default_timezone_set() 设定用于所有日期时间函数的默认时区。 

注: 自 PHP 5.1.0 起(此版本日期时间函数被重写了),如果时区不合法则每个对日期时间函数的调用都会产生一条 E_NOTICE 级别的错误信息。 

参数 

timezone_identifier 

时区标识符,例如 UTC 或 Europe/Lisbon 

返回值 

本函数永远返回 TRUE(即使 timezone_identifier 参数不合法)。 

————————————————————————————- 

或者修改 php.ini 中 date.timezone 值 

date.timezone = PRC

修改值参考php官网给的:http://php.net/manual/zh/timezones.php

当然如果是apache还可以

修改.htaccess文件有两种办法,下面的两条语句只要有一条即可

php_value date.timezone Asia/Shanghai
SetEnv TZ Asia/Shanghai

阿里云, ucloud, 青云 mysql 性能 简单测试

这三家我都有使用

先说 使用感受

  • 青云最专业,后台控制面板也好用。关机只收部分费用也非常适合做测试机器
  • 阿里云没什么要说的,很均衡。不折腾就上阿里云。 就是有几次无故重启不通知
  • ucloud 问题很多,比如 购买的 IP 无法访问 mailgun, 创建主机失败,只能删了重新创建。 网络突然故障, github 无法 clone

这几天有想法 测一下 这三家提供的 mysql 读写性能如何, 于是写了下面的脚本。
先说一下这三家 mysql 的配置:

  • 青云是最低一档的 1 核 2G mysql5.5 , 配置默认
  • ucloud 是最低一档 600M 内存, mysql5.6 标准版,默认配置
  • 阿里云是 第二档 600M 内存, mysql5.5 ,默认配置

所以这是一个不严谨的测试,因为这些机器都是早就买好的。所以无法做到测试环境一模一样。

测试结果:

每家各测试多次,结果比较稳定,就选取其中的一次结果:

青云

INSERT ONE 3.25666999817
INSERT MANY 0.217604875565
QUERY 3.51868581772

ucloud

INSERT ONE 5.17626905441
INSERT MANY 1.33850288391
QUERY 2.40842795372

阿里云

INSERT ONE 5.36786603928
INSERT MANY 0.239859104156
QUERY 5.58612704277

测试脚本:

# -*- coding: utf-8 -*- import os import time import random import base64 import MySQLdb MYSQL_HOST = '127.0.0.1' MYSQL_PORT = 3306 MYSQL_USER = 'root' MYSQL_PASSWORD = 'root' MYSQL_DB = 'bench_test' max_num = 10000 conn = MySQLdb.connect( host=MYSQL_HOST, port=MYSQL_PORT, db=MYSQL_DB, user=MYSQL_USER, passwd=MYSQL_PASSWORD ) # 数据库需要提前建立好,但是表不用 cursor = conn.cursor() sql = """create table if not exists test ( id integer not null primary key, age integer not null, name varchar(255) not null )""" cursor.execute(sql) conn.commit() cursor.close() # 生成测试数据 DATA = [] for i in range(max_num): DATA.append((i+1, i+1, base64.b64encode(os.urandom(64)))) def insert_one_test(): cursor = conn.cursor() cursor.execute("delete from test") start = time.time() for value in DATA: cursor.execute('insert into test (id, age, name) values (%s, %s, %s)', value) conn.commit() cursor.close() print "INSERT ONE", time.time() - start def insert_many_test(): cursor = conn.cursor() cursor.execute("delete from test") start = time.time() start_index = 0 batch_amount = 2000 while start_index < max_num: values = DATA[start_index: start_index+batch_amount] cursor.executemany("insert into test (id, age, name) values (%s, %s, %s)", values) start_index += batch_amount conn.commit() cursor.close() print "INSERT MANY", time.time() - start def query_test(): cursor = conn.cursor() start = time.time() for i in range(10000 * 1): _id = random.randint(1, max_num) cursor.execute("select id, age, name from test where id = %s", (_id,)) result = cursor.fetchone() assert result[1] == _id print "QUERY", time.time() - start if __name__ == '__main__': insert_one_test() insert_many_test() query_test() 

https://cn.v2ex.com/t/233000