php函数mult_iconv:转换任意维数组的字符集编码(扩展iconv函数功能)

php的iconv函数只支持对字符串的转换编码,如果是数组,就要自己遍历转换了,因此写如上的函数,对任意维数组进行转换,同时转换下标(索引)及值。

注意:不转对象。

function mult_iconv($in_charset,$out_charset,$data)
{
    if(substr($out_charset,-8)=='//IGNORE'){
        $out_charset=substr($out_charset,0,-8);
    }
    if(is_array($data)){
        foreach($data as $key => $value){
            if(is_array($value)){
                $key=iconv($in_charset,$out_charset.'//IGNORE',$key);
                $rtn[$key]=mult_iconv($in_charset,$out_charset,$value);
            }elseif(is_string($key) || is_string($value)){
                if(is_string($key)){
                    $key=iconv($in_charset,$out_charset.'//IGNORE',$key);
                }
                if(is_string($value)){
                    $value=iconv($in_charset,$out_charset.'//IGNORE',$value);
                }
                $rtn[$key]=$value;
            }else{
                $rtn[$key]=$value;
            }
        }
    }elseif(is_string($data)){
        $rtn=iconv($in_charset,$out_charset.'//IGNORE',$data);
    }else{
        $rtn=$data;
    }
    return $rtn;
}

下载程序文件(含示例)

调用示例:

$foobar=mult_iconv('gbk','utf-8','一个数组、字符串或其它类型数据');

一个复杂一点的测试示例(不转对象)

// ******* 一个复杂一点的测试示例 ********************
class MyClass
{
    public $v1='不转对象,恭喜发财';
    public $v2='skipped object';
    public function f()
    {
        return true;
    }
}
$obj=new MyClass();

$foo=array('abcd','随便写点文字'
    ,array('中文下标'=> 789,'天地玄黄'
        =>array('宇宙洪荒'=>'赵钱孙李',300=>'恭喜发财,不转对象'
                    ,array('更深的数组'=>'照样可以转换')
                )
    )
    ,'恭喜发财,不转对象' => $obj
    ,'如需转对象'=>'Do It Yourself!'
    ,'作者很懒'=>'用不到就不写了'
    );
$bar=mult_iconv('gbk','utf-8//IGNORE',$foo);
var_dump($bar);

php+MSSQL的坑:(n)varchar型字段被截断

很自虐的搭配php+MSSQL,太多的坑,就不说text型被截断了。

受限于现有的asp+mssql应用,新增的部分功能使用php开发。对一个表的读写,后台使用asp,读写都很正常。前台一个调用是php写的,但就是遇到一个诡异的问题,要对数据做一个很复杂的解析处理,结果是数据丢失一部分。一层一层的输出,最后才发现是从数据库读出来了数据就不完整,这可奇怪了。又不是text型的数据,加了ini_set()修正text型默认长度限制,也不行。

但被截断长度很奇怪,恰恰是254个字节,似乎正好是较老的mssql里varchar()的默认最大长度;而该字段的实际是varchar(1000);

难道是字段类型问题?

于是修改该字段为text型,再执行,全好了,没有一点异常。

看来php+mssql实在是个自虐的搭配,不知道还有多少坑....

不过限于老的程序架构,也是个没办法的,人总是要吃饭的....

[另记: 盘点php+mssql下的坑]

这些坑还是有解决方案的,先留着,以后补充

1 text/ntext型字段长度被截断

2 php下mssql 库不支持ntext类型的数据

3 “varchar(n) 其中n>254 ”类型数据被截断

4 php5.3以后的win32 官方二进制版不支持mssql库

parted打开磁盘报错Invalid partition table on /dev/sdx -- wrong signature 0/gparted显示硬盘未分区

因为硬盘空间不足,所以对其中一个分区进行扩容(当然,本磁盘有空闲的空间才能扩容),使用gpared,以前的经验是本分区工具非常稳定,无损的分区调整。不过这次把一个swap分区往后移动时,报错了,分区调整失败。,gparted重新载入磁盘,但显示磁盘没有分区,所以分区都不见了。

这下麻烦了,不过在gome磁盘实用工具里还是正常的,其它分区也都能正常工作。然而gparted里显示有误,总令人不安心。

到windows里,使用diskgen也没有查出分区表有错误。再回到centos里,gparted仍没有分区。使用parted命令行工具,看到了如标题里的一行错误消息:

Invalid partition table on /dev/sda -- wrong signature 0

这样看,还是分区表有问题,通过万能的google搜索,看到老外有篇文章 http://techspalace.blogspot.com/2011/10/solved-invalid-partition-table-on.html,提到了这种情况下:

If you also encounter any of the above problem, simple run fdisk by sudo fdisk /dev/sda press p and then press w. You'll see a message "The partition table has been altered!".

只要用fdisk打开,什么都不用做,直接保存分区表,就可以了。保存时会提示消息说:"The partition table has been altered!"

半信半疑的,还是勇敢的尝试了一下(几百G的文件,很多没有备份,确实有点冒险),因为考虑到fdisk还是非常老牌的分区工具,况且没有做调整,还不至于造成分区表丢失。

操作如下:

fdisk_open_and_save_disk

果然,再次gparted打开,显示分区正常了。只是那个swap分区没了,测试用的ubuntu系统用的,无所谓,重新分个swap区好了。

国内开启google位置记录功能/android版google maps 7+上,恢复位置记录功能在国内使用(需root)

android版google 地图在 7以后的版本上,位置记录功能在国内不能用了,提示本功能不能在中国使用。

至少对本人,“位置记录”功能是非常有用的功能,尤其是骑车出行时记录自己的路线。目前还没找到替代产品。之前一段时间内恢复回旧版本,以使用该功能。后来使用shlug用户组的高手kernel老兄提供的方案,成功启用了本功能。

方法如下:

让andorid系统启动后加载下面这段脚本:

脚本fixsim

欺骗android系统,让它以为运行在美国运营商的服务下。

加载该脚本需要手机有root权限。个人使用 “固件工具箱” (rom toolbox) 实现启动加载,功能位于:

rom toolbox - 工具 - 脚本编写器 , 导入如上启用脚本(推荐将脚本改下名字,如init.fixsim.sh),并设置成开机自动启动,完成后重启手机。

Screenshot_2013-10-22-23-01-06 Screenshot_2013-10-22-23-01-20

可能得过一阵子才能在google地图里启用“位置记录”,估计是系统缓存的问题。

个人测试环境:galaxy nexus 手机, android 4.3(已root), 固件工具箱5.9.0 付费版,上述脚本。

----------------------------

当然用其它办法让该脚本执行也可以,个人没有尝试。kernel老兄的方案是:将上述脚本“自己扔 /etc/init.d/下面,记得改权限,当然内核得支持执行/etc/init.d下面的脚本才行”

-----------------------------

另外:7以后版本的google地图上,有个很好用的缩放地图的方法,只要单指即可完美操作,比传统的缩放按钮更好用,比多指拉伸/缩小更方便:

折腾:vps上php环境升级为php5.5

php5.5出来很久了,一直没应用,vps上还是5.3,折腾一番尝试一下看5.5效果如何。

查阅了官方的升级说明,从5.3到5.5变化不大,而且vps上主要跑的wordpress,drupal,phpmyadmin等应用,它们的开发理论是是比较规范的,估计问题不大。

原环境,php-fpm, nginx, 其中php安装了apc, memcache两个附加模块。

下载php5.3源码,解压,参考5.3的配置参数,改了下安装目录到/usr/local/php55,编译安装,很顺利。

不过启动php-fpm进程时,还得加 -c参数指定php.ini目录才行,指定该参数重新配置编译了几次,都还是不行。那就带参数也无所谓了。

在一个测试站点上,修改nginx里fast-cgi端口为9005, 新开启一下fpm进程,php-fpm端口设置为9005,(php5.3工作在9000端口)这样不影响php5.3的正常工作。打开phpinfo页面,检查没有发现异常,打开phpMyAdmin,也正常。

编译附加模块apc,但编译失败,google到雪鸟(雪候鸟)的文章,说php5.5里集成了zend O+加速模块,这样就可以不要apc了。

到以前的memcache目录里,重新配置编译安装,正常。

加载,因为是偷懒从php5.3的php.ini里拷来加载模块的两行代码,没有改,在运行php-fpm时报错了,说是模块跟php的api版本不一致,一个是2009xxx版,一个是2012xxx版,以为编译错了。重新下载新版本memcache也一样。

纳闷中,突然意识到php.ini里最后加的加载memcache模块是以绝对路径调用的,这个路径没改,还是加载的php5.3目录下的,这不报错就没天理了。删掉路径,只保留文件名,杀死php-fpm进程,重新开启,正常了。这次安装模块是安装到extension_dir指定的目录下的,这样更简单。

运行wordpress站点,报错了:

syntax error, unexpected end of file

想起php.ini里没有开启short_open_tag, 以前安装5.3时也报了这个错误,一些不规范的插件,不想改它的源码,反正有其它一些php程序也这么干,那就打开short_open_tag好了。

重启php-fpm,运行wp又报错了

Call-time pass-by-reference has been removed

又是一个插件的问题:wp-related-posts,其源码 wp-related-posts/wp-relatedposts.php 里有这样的行 wp_relatedposts_ontags(&$options), 删除调用参数时的&号,即wp_relatedposts_ontags($options) 这就好了。

测试运行没有发现问题。

杀死php5.3的fpm进程。修改php5.5的fpm到9000端口上,并启动。

再测试一番,正常。

修改/etc/rc.local里的php-fpm开机启动命令为5.5版本。

完成。

记录一下,算是这个中秋节做的一点有意义的事情。

原计划一大早睡觉,结果又0:18了——

---- 130923 补 --------------------

原来 opcache并没有自动加载,虽然它会被安装到php扩展的目录下,默认在 {$PREFIX}/lib/php/extensions/no-debug-non-zts-20121212

在php.ini里加入以下两行

[opcache]
zend_extension=opcache.so

opcache.so是个zend扩展模块,要用zend_extension=xx加载。

重启php-fpm生效

CentOS6.x下安装python2.7

CentOS6.x自带的python是2.6.x版,一直没有更新到2.7,其上游发行版redhat太过保守了。goagent的新版本已经要求python2.7以上版本了,为了升级goagent,决定安装python2.7.

一个原则:不要去改动系统自带的东西,除非你知道所有不得影响。

考虑到默认位置下的python是系统运行所需,覆盖升级有可能影响一些功能;并且yum update时,可能新装的python会被再次覆盖。所以计划将python2.7装到/opt/python2.7目录下。

在普通用户下下载编译python2.7,个人习惯,软件包都在 ~/optdata/software/build下编译,原源tar包放在 ~/optdata/software/source/下

cd ~/optdata/software/build/
wget http://www.python.org/ftp/python/2.7.5/Python-2.7.5.tar.bz2  #下载python2.7源码
tar xvf Python-2.7.5.tar.bz2         #解压
mv Python-2.7.5.tar.bz2 ../source/   #将源码移到~/optdata/software/source/下
mv Python-2.7.5/ python-2.7.5/       #不喜欢文件名里带大写,改首字母为小写
cd python-2.7.5/
./configure --help                   #查看配置参数,其中主要看--prefix参数,即配置安装目标位置
./configure --prefix=/opt/python2.7  #运行配置。如果你的系统缺少部分开发包,可能会报错,按错误提示yum install 相应的包
make

完成后,su切换到root下,make install安装。

现在python2.7即安装好了,如需使用python2.7,就要指定其完整的路径/opt/python2.7./bin/python

但,这个python只是个基本环境,可能要装一些新模块。pip是个很好用的工具,我们先安装它,有了pip,就可以自动安装了,跟yum一样方便的工具。

下载,个人的python包一般是放在~/optdata/software/python/里

cd ~/optdata/software/python/
wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py
/opt/python2.7/bin/python ez_setup.py
wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py
/opt/python2.7/bin/python get-pip.py

查看下pip版本号,安装pyOpenSSL试试,goagent客户端要用这个包的

/opt/python2.7/bin/pip -V
/opt/python2.7/bin/pip install pyOpenSSL

没问题,完成。

这样如果需要使用python2.7就这样指定/opt/下完整路径运行。而对系统自带的python2.7没有任何影响。

windows远程桌面remote desctop连接到服务器的console控制台会话

If you need to connect to the console, start Remote Desktop from start run and use the console switch:

mstsc /console  /v 192.168.100.200:3389

详细的说明:运行 mstsc /? 得如下的用法说明

reffer: http://social.technet.microsoft.com/Forums/windowsserver/en-US/19a188a7-cafd-403a-b5e3-77e7c82dfbb2/can-vnc-server-run-on-windows-server-2008

Pages: Prev 1 2 3 4 5 6 7 8 9 10 ... 45 46 47 Next