月度归档:2014年07月

php等比缩放图片并计算其margin

php等比缩放图片并计算其margin,适用于处理宽高比例不一致但要求显示一致的图片场合。


/*
 * 等比缩放图片并计算其margin
 * @param $picpath 图片路径
 * @param $pwidth  要显示的宽度
 * @param $pheight  要显示的高度
 * @return array 宽高,margin的top和left(bottom=top,right=left)
 */ 
function resizeImageWHM($picpath,$pwidth,$pheight){
 $imginfo=getimagesize($picpath);
 $owidth=$imginfo[0];
 $oheight=$imginfo[1];

 $ra=number_format(($owidth/$pwidth),3);//宽比
 $ra2=number_format(($oheight/$pheight),3);//高比
 if($owidth>$pwidth && $oheight>$pheight){
 if($ra>=$ra2){
	     $width=round($owidth/$ra);;
		 $height=round($oheight/$ra);
	  }else{
	     $width=round($owidth/$ra2);
		 $height=round($oheight/$ra2);
	  }	  
	
      
 }else{
    $width=$owidth;
	$height=$oheight;
 }
 
 $margin_top=0;
 if($height<$pheight){
    $margin_top=round(($pheight-$height)/2);
 }
 
 $margin_left=0;
 if($width<$pwidth){
    $margin_left=round(($pwidth-$width)/2);
 }
 
 $newsize['width']=$width;
 $newsize['height']=$height;
 $newsize['margin_top']=$margin_top;
 $newsize['margin_left']=$margin_left;

 return $newsize;
}

PHP获取MySQL数据表的结构信息(包括set结构的值)

在PHP官网上找到的一个获取MySQL数据表的结构信息的函数,稍微改进了下,替换掉过时的ereg函数。现在
这个函数比mysql_list_fields要强大,它能获取到集合结构(set)字段的所有值,这在生成HTML时是非常
有用的。

上代码:

function GetFieldInfo($table) { 
  global $cfg_dbname,$cfg_dbhost,$cfg_dbuser,$cfg_dbpwd;
  $con = mysql_connect($cfg_dbhost, $cfg_dbuser, $cfg_dbpwd);
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

$db_selected = mysql_select_db($cfg_dbname,$con);
  mysql_query("set names utf8");
  if($table == '') return false; 
  $fields = mysql_list_fields($cfg_dbname, $table); 
  if($fields){ 
    $columns = mysql_query('show columns from ' . $table); 
    if($columns){ 
      $num = mysql_num_fields($fields); 
      for($i=0; $i < $num; ++$i){ 
        $column = mysql_fetch_array($columns); 
        $field = mysql_fetch_field($fields, $i); 
        $flags = mysql_field_flags($fields, $i); 
        if($flags == '') $flags=array(); 
        else $flags = explode(' ',$flags); 
        if (preg_match('/enum.(.*)./',$column['Type'],$match)) 
          $field->values = explode(',',$match[1]); 
        if (preg_match('/set.(.*)./',$column['Type'],$match)) 
          $field->values = explode(',',$match[1]); 
        if(!$field->values) $field->values = array(); 
        $field->flags = $flags; 
        $field->len = mysql_field_len($fields, $i); 
        $result_fields[$field->name] = $field; 
        $result_fields[$i] = $field; 
      } 
      mysql_free_result($columns); 
    } 
    mysql_free_result($fields); 
    return $result_fields; 
  } 
  return false; 
}

ThinkPHP小知识点

分享ThinkPHP的几个小知识点:

1. URL中隐藏模块Home名称

define(‘BIND_MODULE’,’Home’);

2. 自定义函数库置于 /Common/Common目录下,需要在项目的配置文件中配置加载该函数库

/Conf/config.php, 添加 “LOAD_EXT_FILE”=>”common” ,则会自动加载 common.php

3. 模型新增数据使用 add ,更新时使用 save

CentOS 6下Nginx作为入口做负载均衡实战

刚才花了一个半小时的时间在三台CentOS 6系统下使用Nginx作了一次负载均衡的实战。入口是Nginx,后台可以是apache也可以是Nginx,端口可以自定义。

实验环境 :

Server1 192.168.0.100 : 
用途: 入口服务器,负载均衡服务器 
环境: CentOS 6 + Nginx + PHP(php-fpm) 
端口: 80

Server2 192.168.0.101 : 
用途:一般的后台服务器 
环境:CentOS 6 + Apache + PHP 
端口:80

Server3 192.168.0.102 : 
用途:一般的后台服务器 
环境:CentOS 6 + Apache + PHP 
端口:8080

Server2和Server3用的是 Apache ,配置了虚拟主机,分别在端口80和8080接收test.kiccp.com .

Server1用的是 Nginx ,配置如下: 
/etc/nginx/nginx.conf :

# For more information on configuration, see: #   * Official English Documentation: http://nginx.org/en/docs/ #   * Official Russian Documentation: http://nginx.org/ru/docs/ user nginx  nginx;
worker_processes 1;

error_log  /var/log/nginx/error.log; #error_log  /var/log/nginx/error.log  notice; #error_log  /var/log/nginx/error.log  info; pid        /var/run/nginx.pid;


events {
    worker_connections 1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main '$server_name $remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on; #tcp_nopush     on; #keepalive_timeout  0; keepalive_timeout 65;

    gzip  on;
    upstream myserver { ####两个后台服务器,分别监听80和8080端口。 server 192.168.0.101:80 weight=5; 
       server 192.168.0.102:8080 weight=5;
       } # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. ##包含etc/nginx/conf.d/下的所有conf文件,虚拟主机配置就在这个目录里。 include /etc/nginx/conf.d/*.conf;

}

接下来是 /etc/nginx/conf.d/ 下的loadbalance.conf文件,被nginx.conf 包含进来。

server { 
listen 80; 
server_name test.kiccp.com; ##绑定域名 location / { 
proxy_pass http://myserver; ##使用nginx.conf中定义的upstream  proxy_redirect off; 
proxy_set_header Host $host; 
proxy_set_header X-Real-IP $remote_addr; 
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
client_max_body_size 10m; 
client_body_buffer_size 128k; 
proxy_connect_timeout 90; 
proxy_send_timeout 90; 
proxy_read_timeout 90; 
proxy_buffer_size 4k; 
proxy_buffers 4 32k; 
proxy_busy_buffers_size 64k; 
proxy_temp_file_write_size 64k; 
 }
}

在这种配置下, Server1上的Nginx监听80端口上的test.kiccp.com,并随机路由到Server2和Server3, 
这样就达到了负载均衡的目的。虽然Server3上的apache用的是8080端口,但访客察觉不到,url显示的依然 
是test.kiccp.com且端口没有变化。Server1的log会把所有这些请求都记录下来,而Server2和Server3的 
log中记录的来源ip则是Server1的IP,毕竟是从Server1路由过去的。Server1上的Nginx不用关心Server2 
和Server3上使用的是apache还是nginx,或者tomcat,只需要知道它的ip和端口即可。

实战总结:

1.Nginx做负载均衡是很强大的,而且配置过程简单

2.Nginx所负载的服务器不一定要用Nginx,用Apache和Tomcat也可以,而且端口完全可以自定义。

3.Nginx的负载均衡对于访客来说是不透明的,他们也无需知道当前由哪个服务器在处理他的请求。

月薪5千30年缴公积金36万:若自己打理可获利30万

此前关于公积金的观点,多诟病其劫贫济富、提取困难、管理混乱、投资水平低下、政府挪用、贪腐风险等,这些批评虽然可能促使公积金制度的小修小补,但核心问题是,公积金还有没有存在的必要。

如果你有兴趣,有足够的耐心,不妨看看我们从财务角度、投资角度上分析,告诉你可能不知道的真相。

一、公积金贷款、商业贷款相差多少钱?

没有几个人能全款买房,那些富二代、土豪劣绅、或者啃老啃三代筹钱买房的,我们暂且都不讨论,一般人买房,要么通过公积金贷款,要么通过商业银行贷款。

北上广深四大城市,个人公积金贷款最多50万(两人合贷,最高可以达到80万),为了方便计算,我们拿50万贷款额度作为样本,贷款30年,不提前还贷。

公积金贷款利率4.5%,贷款50万30年,利息41万。

商业贷款利率6.55%,贷款50万30年,利息64万。

两者相差23万!

天啊,原来公积金贷款可以省这么多利息!完全符合公积金设立的宗旨,互惠互助、互存互贷,公积金真是伟大,人们在欢呼,但,这只是表象。

二、废除公积金制度,月薪上涨20%吗?

如果废除公积金制度,此时我们讨论的前提是,必须承认公积金是个人劳动报酬,事实上是的:

依据现行的《住房公积金管理条例》规定,住房公积金是单位和在职员工缴纳的一种长期住房储金,并且所有权属于职工个人。

同时,职工以及单位为职工缴纳住房公积金,是依据上年度员工工资水平的一定比例来确定,可见公积金是从职工工资而来,因此公积金实际本质就是工资,或者说是员工劳动报酬所得。

只不过这部分劳动报酬之前是强制留存在公积金账户里。废除公积金后,你的月薪将会立即上涨20%(一般来说,抠门的公司一般只付8%,个人为了合法避税则选用12%)。

看到这里,人们开始眉开眼笑了,没错,月薪一下上涨20%。

但你现在只能用商业贷款买房了,你只能默默承受6.55%的高额利息了,怕了吗?

三、问题是,你能不能跑赢这23万?

刚才说到,贷款50万30年,商业贷款比公积金贷款利息多付23万,问题是,废除公积金后,你能不能用每个月“多”发的钱,在30年间挣到23万?

别怕,你能的!再给点耐心看看怎么算计:

为了方便计算,我们需要忽略你的工资涨幅、 CPI涨幅、未来利率市场化等因素。

如果你的工资是5000元。(备注一下,2013年北京人均工资是5793元,上海5036元,广州6647元,深圳7220元,全国4289元,我们取个整数5000元。)

你每月公积金是5000×(公司缴纳8%+个人缴纳12%)=1000元。

你每年的公积金是1000元×12个月=1.2万元。

你30年的公积金总额是1.2万×30=36 万元。

如果废除公积金,你每年都提取这笔钱去投资,比如就放在“宝宝”之类的货币基金里,按照最近年化收益约4%计算。

F=1.2×(1+4%)^29+1.2×(1+4%)^28+……+1.2×(1+4%)^1=66.1018万元

复利投资收益为66.1018万元-36万元=30.1018万元。

30万纯收益,顿时秒杀23万的利差。

4%的收益率一般能达到,只要你不炒股,炒股就难说了,姚明进去潘长江出来。

当然了,考虑利率市场化,今后存款和“宝宝”们的收益率会呈递减趋势,那么要达到多少收益率才能跑赢23万呢?

1.2×(1+i)^29+1.2×(1+i)^28+……+1.2×(1+i)^1-本金36万元=利差23万元

计算i约等于3.5%,比一年期定存3%略高而已,这时你是不是信心百倍?

四、真相是什么?

真相就是,如果你工资超过5000元,废除公积金,把钱交给你打理,你比那帮公积金管理中心的大老爷们会做得更好!

看到这里,你是支持废除公积金,还是支持保留公积金?

五、还有真相:公积金存款不是还有利息吗?

有人会说,公积金存款也有利息啊,那是你想多了。

按照现行制度,当年的公积金按活期存款利率(0.35%)计算,上年结余的公积金按三月整存整取利率(2.6%)计算,且今后也持续按照此利率水平计息。

公积金的会计年度为当年的7月1日——次年的6月30日,每年6月30日进行结息。

如果你的每月公积金1000元,你一年下来能拿到多少利息?

1000元×0.35%×(12/12+11/12+10/12+9/12+……+2/12+1/12)=22.75元

22.75元,一斤瘦肉的价钱,所以,网上有教程,循循善诱地教导大家不要把公积金当存款了。

六、还有真相:拿私产去投资,收益去哪了?

有人会说,公积金投资也有收益啊,你又想多了,这些收益到不了你手上。

按照《住房公积金财务管理办法》规定,公积金增值收益主要有三个用途:首先是划作公积金管理中心的运营成本,其次是按增值收益60%的比例,提取贷款风险准备金(近几年楼市处于上升期,没有出现烂账,这笔风险金暂时还没有动用过)。此外,增值收益扣除上述两项后,剩余的将要全部上缴财政,用于城市廉租住房建设资金,公积金管理中心不能截留。

个人公积金账户的缴存金额,实际上属于个人财产,但现实情况是,公积金和其增值部分属于缴纳者的私人产权这一本质,未被充分确认,而且将增值收益用于廉租住房建设公共事业,或者进行增值投资,你也没有“话事权” 。

目前全国有各级公积金管理机构600多个,各地公积金管理中心共开发出几百套公积金管理系统,每个系统花费数百万元到上千万元,每年还有几十万的升级维护费,这些人力成本和软件成本都出在你的身上呢,你知道吗?