作者存档

nginx php 使用memcached出现页面502错误

2012年7月28日 没有评论

php的版本5.2.17,memcached扩展的版本2.0.1,当使用memcached的cas功能时候出现502错误,而set、get功能正常。开始一直以为是nginx的配置有问题,网上也有人提到过可能跟fast-cgi的一些参数设置有问题,试着修改默认值,问题依旧没有得到解决。后来通过CLI来执行php脚本时候提示了一个错误,按照这个错误搜索,发现原来这是memcached扩展2.0.1跟php 5.2.17不兼容的Bug,具体参看:https://bugs.php.net/bug.php?id=61283。

解决的办法要么是升级php,要么降级memcached扩展到1.0.2,经过测试在php 5.2.17 和 memcached 1.0.2能正常工作。

分类: PHP 标签:

解决 PHPExcel 长数字串显示为科学计数

2012年7月24日 8 条评论

解决 PHPExcel 长数字串显示为科学计数

在excel中如果在一个默认的格中输入或复制超长数字字符串,它会显示为科学计算法,例如身份证号码,解决方法是把表格设置文本格式或在输入前加一个单引号。

使用PHPExcel来生成excel,也会遇到同样的问题,解决方法有三种:
1、设置单元格为文本

$objPHPExcel = new PHPExcel();
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->setTitle('Simple');
//设置A3单元格为文本
$objPHPExcel->getActiveSheet()->getStyle('A3')->getNumberFormat()
	->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_TEXT);
//也可以设置整行或整列的style
/*
//E 列为文本
$objPHPExcel->getActiveSheet()->getStyle('E')->getNumberFormat()
	->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_TEXT);
//第三行为文本
$objPHPExcel->getActiveSheet()->getStyle('3')->getNumberFormat()
	->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_TEXT);
*/

更多的格式可以在PHPExcel/Style/NumberFormat.php中找到。注意:上述的设置对长数字字符串还是以文本方式来显示科学计数法的结果,原因可能php在处理大数字时采用的科学计数法。

2、在设置值的时候显示的指定数据类型

$objPHPExcel = new PHPExcel();
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->setTitle('Simple');

$objPHPExcel->getActiveSheet()->setCellValueExplicit('D1',
                                 123456789033, 
                                 PHPExcel_Cell_DataType::TYPE_STRING);

3、在数字字符串前加一个空格使之成为字符串

$objPHPExcel = new PHPExcel();
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->setTitle('Simple');

$objPHPExcel->getActiveSheet()->setCellValue('D1', ' ' . 123456789033);

推荐使用第二、三种,第一种没有根本解决问题。

分类: PHP 标签:

PHPExcel mac os 下中文乱码问题

2012年7月24日 没有评论

在php中使用PHPExcel来生成Excel表格,内容含有中文,window系统下显示正常,mac os的office打开excel显示不出来中文,现象是表格中看到中文显示为方框,但是焦点放在表格上时,上面的显示的又是中文。程序中使用的编码是GBK,由于PHPExcel只支持UTF8,已经在程序中使用iconv进行了转码,所以可以排除编码的问题。百思不得其解,只好借助万能的Google,在一个链接中发现有人说mac os 打开的excel文件出现乱码是由于字体造成的,再次打开乱码的excel文件,发现打开的默认字体为一个英文字体,终于找到原因了,解决问题就很简单了,在生成excel时候强制设置表格使用某种支持中文的字体即可,如宋体,代码如下:

$objPHPExcel = new PHPExcel();	
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->getDefaultStyle()->getFont()->setName('宋体');

注意:如果当前文件的编码不是使用UTF8,需要对’宋体’进行编码转换使之成功UTF8编码。

PHPExcel真是个好东西,功能太强大了,有点小遗憾的是中文文档不全,想要实现某种功能只能借助搜索引擎了。

分类: PHP 标签:

php json 中文问题

2012年7月11日 没有评论

php中内置函数json_encode提供把一个array转化为json字符串的功能。网上看到很多人说不能处理中文,这种说法其实是不对的,关键是要看php源文件的编码方式,对于非UTF8的php源文件,中文确实会有问题,反之能正常工作,为什么会这样呢,php手册上说的很清楚

This function only works with UTF-8 encoded data.

对于使用utf8作为文件编码方式的人,可以直接忽视中文问题,那么采用GBK或GB2312的怎么办?要么修改文件的编码方式,往往这个不太显示,总不能为了这个问题把一个项目都修改成UTF-8,另外的一个办法是借助urlencode、urldecode在转换一下,urlencode是把原字符串转换为UTF8格式编码,这就满足了json_encode支持UTF8的需求,而urldecode是把UTF8编码转换成当前字符编码。所以在进行json_encode前先把array中的字符串使用urlencode,然后执行json_encode,接着使用urlencode把json_encode结果进行解码。实例代码如下:

function arrayEncode(&$arr) {
    foreach ($arr as $k => $v) {
        if (is_array($v)) {
            arrayEncode($arr[$k]);
        } else {
            $arr[$k] =  urlencode($v);
        }

        if (is_string($k)) {
            $nk = urlencode($k);

            if ($nk != $k) {
                $arr[$nk] = $arr[$k];

                unset($arr[$k]);
            }
        }
    }
}

function my_json($arr) {
    arrayEncode($arr);
    
    return urldecode(json_encode($arr));
}

将图片生成圆角图片

2012年7月10日 没有评论

说明:此文章有网友提供

见官方demo:http://www.imagemagick.org/Usage/thumbnails/#rounded%5Fborder

运行此demo必须条件:

1、ImageMagick 安装路径 D:/Program Files/ImageMagick/convert.exe

2、将 ex 文件夹放在 C盘根目录下。

最终转换命令

"convert c:/card1.jpg -alpha set -gravity center -extent 1200x750 " +
" c:/a_big.png -compose DstIn -composite " +
" c:/b_big.png -compose Over -composite " +
" c:/111.png "

其中 a_big.png b_big.png 均是背景图 顺序不能互换 111.png 是生成的圆角图片

思路:

这里假设用户上传的最大长宽比例不超过1200*750,

我们可以先做 1200*750 2张背景图,frist_1200_750.png 和 sec_1200_750.png。

由于用户上传图片大小不同,也就是 width,height不同

1、得到用户上传图片的width、height

2、判断目录下是否存在此长宽比的背景图,如果不存在,再创建此长宽比的背景图,Radius.java createThumbnail 方法。

3、根据转换命令,进行转换。记住,2张背景图的顺序不能反, 读者可试试互换结果。 Radius.java createRadiusImg 方法。

4、测试,如果 width > height 生成的圆角图长宽比正常。测试图片 card1.jpg

如果 width < height,就不正常了。 测试图片 4d58cae79da70.jpg 如果 width > height, 长宽比均比较大,生成图片 和 原图片对比,发现生成图片模糊,测试图片 200711108226923_2.jpg

Demo代码下载地址:http://pan.baidu.com/netdisk/singlepublic?fid=588935_3480700337

nginx日志分割

2012年7月10日 3 条评论

nginx日志本身不能通过配置来进行分割,如果要进行分割,需要通过写一个简单的脚本来实现这个功能。以前我一直都是用cp命令来做的,例如:

#/bin/bash
nginxLog="/usr/local/nginx/logs/access.log"
logBakFile="/usr/local/nginx/logs/"$(date "+%F")/"bak_"$(date "+%H-%M-%S")".log"

if [ ! -d ${logBakFile%/*} ]
then
    mkdir -p ${logBakFile%/*}
fi

cp $nginxLog $logBakFile 2>&1 >/dev/null
cat /dev/null > $nginxLog

原理很简单,就是通过cp命令拷贝一份当前的日志,拷贝完后清空当前日志。当然,如果nginx的并发量很大,可能会造成日志丢失情况。

今天无意中看到另外一种分割日志的方法,主要是通过mv命令来实现,我感觉可能比我以前的实现要好一些,特此记录一下。上述脚本可以修改为:

#/bin/bash
nginxLog="/usr/local/nginx/logs/access.log"
logBakFile="/usr/local/nginx/logs/"$(date "+%F")/"bak_"$(date "+%H-%M-%S")".log"

if [ ! -d ${logBakFile%/*} ]
then
    mkdir -p ${logBakFile%/*}
fi

mv $nginxLog $logBakFile 2>&1 >/dev/null
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`

先用mv命令把日志备份,然后使用kill -USR1 让nginx 重新打开日志文件。虽然这样也可能丢失日志,但mv命令执行肯定要cp快,所以相当来说要安全一些。

可以把上述脚本加入到crontab中,这样就可以实现按天、按小时等一些时间规则来进行日志分割

分类: Linux, nginx 标签: ,

Mac os x F4 键失效

2012年7月3日 1 条评论

mac os loin 中可以通过快捷键F4快速启动Launchpad,最近不知何故失效了,解决方法是:打开“使用工具”中的“终端”程序,执行如下命令:

rm ~/Library/Preferences/com.apple.symbolichotkeys.plist

然后注销电脑、重新登陆,问题应该就解决了。需要注意的是这样一来自己曾经定义的快捷键可能就会失效,需要重新去定义了。

分类: 其它 标签:

更改 centos yum 源

2012年6月28日 没有评论

centos下可以通过yum很方便快捷的安装所需的软件和库,如果yum的源不好,安装速度会非常慢,centos默认官方源似乎都是国外的,所以速度无法保证,我一直使用163的源,感觉速度不错。下面就说说如何修改yum的源。


1、进入存放源配置的文件夹
cd /etc/yum.repos.d

2、备份默认源
mv ./CentOS-Base.repo ./CentOS-Base.repo.bak

3、使用wget下载163的源
wget http://mirrors.163.com/.help/CentOS-Base-163.repo

4、把下载下来的文件CentOS-Base-163.repo设置为默认源
mv CentOS-Base-163.repo CentOS-Base.repo

通过上述操作就把默认源修改为163的了。当然上述的第三、四步可以合并为如下:

wget http://mirrors.163.com/.help/CentOS-Base-163.repo -O CentOS-Base.repo
分类: Linux 标签:

mac os 使用maven出现警告 Workspace defines a VM that does not contain a valid jre/lib/rt.jar

2012年6月25日 没有评论

mac os 下使用maven执行mvn eclipse:eclipse 时,看到命令行上输出的日志中有一条警告信息,信息如下:

[WARNING] Workspace defines a VM that does not contain a valid jre/lib/rt.jar: 

/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

原因是mac os 下没有rt.jar文件,用classes.jar替代了,其完整路径是/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar,知道原因,解决这个问题也就很容易,只需要做一个软链接即可,操作如下:

cd /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
sudo mkdir -p jre/lib
sudo ln -s /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/classes.jar jre/lib/rt.jar

如果是root用户,可以省略上述命令中的“sudo”

分类: Java 标签:

mac os 下安装 mysql-python

2012年6月20日 1 条评论

python中如果需要访问mysql数据库,需要额外安装第三方的库,比较流行的是库是MySQL-python,可以到http://sourceforge.net/projects/mysql-python/下载源代码。解压下载的tar.gz文件,执行如下操作即可完成安装:

python setup.py build  
python setup.py install

注意:如果mysql_config(MYSQL_HOME/bin)文件没有位于系统path下,那么需要更改site.cfg文件,在里面指定mysql_config的完整路径。

不出意外,如果你在终端中运行python,导入MySQLdb时,你会收到一个错误,提示中含有“Library not loaded: libmysqlclient.18.dylib”,错误的原因是刚编译安装的lib放在MYSQL_HOME/lib下,终端找不到此位置,解决的方法是可以做一个软链接链接到/usr/lib下,例如:

ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/

另外如果使用eclipse的pydev插件,当需要用到MySQLdb库时,需要在Libraries中指定刚安装后的egg文件的路径,该路径在安装时会有提示,例如我的按照位置为:/Library/Python/2.7/site-packages/MySQL_python-1.2.3-py2.7-macosx-10.7-intel.egg 。

无觅相关文章插件,快速提升流量