10 27

Docker介绍及安装

Docker介绍

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架或包括系统。更详细的介绍可以看下《5分钟弄懂Docker》。

Docker安装

这里的安装环境为Centos6.4,其他系统的安装请参考这里

首先,你需要安装EPEL仓库,请看这里EPEL installation instructions

docker的包是由EPEL提供的

如果你已经安装了(不相关)的docker包,它会跟docker-io有冲突,有一个错误报告,如果想继续安装docker-io,请先删除docker。

下一步,来让我们安装docker-io在我们的主机上

升级docker-io包

# sudo yum -y install docker-io

现在我们就安装好了,让我们开始docker进程

# sudo yum -y update docker-io

如果你想让他开机启动,我们需要这样做

# sudo service docker start

现在让我们确认一下docker是否工作了

# sudo chkconfig docker on

运行了,OK你现在去运行hello word的实例吧。

# sudo docker run -i -t fedora /bin/bash
07 22

PHP的Trim截取乱码

一直使用Trim过滤首尾两端的字符串,关于Trim的官方描述:

trim — 去除字符串首尾处的空白字符(或者其他字符)

今天发现一个很奇怪的问题, 代码如下:

<?php
$str = '研发、产品、';
echo trim($str, '、');

猜下这个会返回什么?“研发、产品”?NO,这个居然很奇怪的返回了“研发、产��”。

难道是我的打开方式不对,怎么会返回乱码呢。

经过一番测试,发现一个很有趣的问题。

<?php
echo trim('abacabb', 'ab');   //print 'c'

原本以为这个会返回acabb的,但是居然只返回了c。这就是对trim函数的误解了。

其实这个在官方说明文档的Example是有的,只是我没注意看而已。

trim会循环去掉字符串首位存在的字符。如上面的例子,则执行过程如下:

字符串abacabb会从下标0开始循环,如果存在ab中的字符就去掉,一直到没有就停止循环。

所以执行为:

  • 循环a存在字符串ab中,去掉,剩下bacabb
  • 循环b存在字符串ab中,去掉,剩下acabb
  • 循环a存在字符串ab中,去掉,剩下cabb
  • 循环c不存在字符串ab中,停止循环,所以去掉首字符就剩下:cabb。

但是trim是过滤首尾字符,所以还会从末尾循环去掉。

  • 循环b存在字符串ab中,去掉,剩下cab,
  • 循环b存在字符串ab中,去掉,剩下ca,
  • 循环a存在字符串ab中,去掉,剩下c,
  • 循环c不存在字符串ab中,停止循环,所以去掉末端字符就剩下:c。

所以整个结束后,abacabb就剩下了c了。看到这里对trim函数有所了解了吧。

好了,说回乱码的问题,为什么会出现返回乱码的情况呢。

这是因为在PHP中,字符串函数默认都不是 multibyte-safe 的。如果需要 multibyte-safe 则需要使用mb_系列的函数。

“、”的十六进制码为0xe3 0x80 0x81,对于不是 multibyte-safe 的函数会把它当做三个字符。

而“品”的十六进制码为0xe5 0x93 0x81。这里最后一个0x81刚好符合了,被过滤了。所以才会导致出现乱码的情况。

ok,问题找到了,trim没有mb函数,但是我们可以自己封装一个。Function mb_trim

PS:用了trim好久了,但是一直没有真正了解。看官方文档还是很重要的。

07 09

swfupload上传失败返回RESIZE_ERROR

上传用的是swfupload插件,今天有几张照片死活传不上去,调试发现返回的errorCode为-300。

找到-300在SWFUpload.UPLOAD_ERROR中的RESIZE,Ps:很奇怪,网上很少看到有-300的错误说明,倒是有ERROR_RESIZE这个变量

RESIZE_ERROR - 当调整图像大小时出现了某错误啊

看到这个提示一头雾水,图片本身是没问题的。用PHP 的GD库是可以裁剪的。

后来将message信息打印出来发现如下:Error generating resized image. Resizing: Error #2015

google 搜索发现这个是flash player的问题:

In AIR 1.5 and Flash Player 10, the maximum size for 
a BitmapData object is 8,191 pixels in width or height, 
and the total number of pixels cannot exceed 16,777,215 pixels. 
(So, if a BitmapData object is 8,191 pixels wide, 
it can only be 2,048 pixels high.) 

In Flash Player 9 and earlier and AIR 1.1 and earlier, 
the limitation is 2,880 pixels in height and 2,880 in width.
Starting with AIR 3 and Flash player 11, 
the size limits for a BitmapData object have been removed. 
The maximum size of a bitmap is now dependent on the operating system.

如上说明,图片的高宽不能超过8191px,然后总的像素值不能超过16777215px,总像素值计算为:height px * width px。

查看了下上传图片的px为:高度:5184px, 宽度:3456px。总像素值:5184*3456 = 17915904,这个值大于了flash player的限制了。

用ps打开图片修改下图片大小为:高度:4984px,宽度:3323px,总像素值:4984*3323 = 16561832,刚刚好小于flash player的限制,上传,ok,没问题了。果然是这个限制的问题!

PS:上面说flash player 11版本已经移除了这个限制,改为根据系统进行限制,但是不知道系统限制是如何计算的。反正我升级为flash player14上传也提示这个错误。

2014-11-17日更新

推荐一个由百度开源的上传插件webuploader,可以解决此问题。
官方地址: http://fex.baidu.com/webuploader/
其他有点可以查看官网介绍。

06 16

Centos下安装Ice php扩展

安装ICE的方式有两种,一种下载安装包自己编译,一种是通过yum命令进行安装。

因为Ice需要的包比较多,所以编译安装的话比较麻烦,这里我们就只介绍第二种方式,通过yum安装。以下是官方描述:

The Ice run times and developer kits for all supported language mappings (i386 and x86_64).

You can also install Ice using yum by downloading the repository description (zeroc-ice-amzn1.repo) and installing it in /etc/yum.repos.d. Once installed, you can view the available packages using the following command:

# yum list ice* db53* mcpp-devel

Refer to the EC2 documentation for more information.

yum 安装

首先需要添加一个yum源。

# vi /etc/yum.repos.d/zeroc-ice-amzn.repo

写入:

[zeroc-ice]name=Ice 5 for Amazon Linux $releasever - $basearch

baseurl=http://www.zeroc.com/download/Ice/5/el6/$basearchenabled=1gpgcheck=1gpgkey=http://www.zeroc.com/download/RPM-GPG-KEY-zeroc-release

官网上说可以通过

# yum list ice* db53* mcpp-devel

查看安装包列表。真正的安装命令是

# yum install -y ice* db53* mcpp-devel

安装完成可以通过命令搜索文件所在路径:

# find / -name IcePHP.so
06 05

关于PHP使用ICE出现Ice_MemoryLimitException

场景:使用ICE做中间件,C++做服务端,PHP做客户端。

由于某个接口的传输数据过大,接口异常:Ice_MemoryLimitException,搜索了下是由于Ice的默认传输大小是1MB,最大可以设置为2G。

很明显我们传输的数据超过了1M。找到问题那就好办了,设置下Ice.MessageMaxSize即可,找到PHP.ini加上这面这句话:

ice.options="--Ice.MessageSizeMax=2048"

重启php-fpm,在phpinfo中查看确实是生效了。本以为这样就解决了。

但是刷新页面,异常依旧,Google了下,发现C#或者python都可以在代码中设置MessageSizeMax参数。想到PHP应该也可以直接在代码中设置。

在官方网站找到以下例子:

<?php
require 'Ice.php';
require 'Hello.php';
$communicator = null;
try {
    $data = new Ice_InitializationData;
    $data->properties = Ice_createProperties();
    //记载配置文件
    $data->properties->load("props.cfg");
    $communicator = Ice_initialize($data);
    $proxy = $communicator->stringToProxy("...");
    $hello = Demo_HelloPrxHelper::checkedCast($proxy);
    $hello->sayHello();
} catch(Ice_LocalException $ex) {
    // Deal with exception...
}
if($communicator) {
    try {
        $communicator->destroy();
    } catch(Ice_LocalException $ex) {
        // Ignore.
    }
}
?>

确实是可以设置参数,但是这里是配置的文件的,为了方便我直接使用以下代码进行设置:

$data = new Ice_InitializationData;

$data->properties = Ice_createProperties();
//设置传输数据大小, 单位KB
$data->properties->setProperty('Ice.MessageSizeMax', 2048);


$init = Ice_initialize($data);

OK,刷新之后问题解决。

PS:注意Ice.MessageSizeMax参数需要服务端和客户端同时设置。

参考资料:

C#的设置方式:http://stackoverflow.com/questions/8434429/why-do-i-get-icememorylimitexception-even-with-ice-messagesizemax-2000000

官方提供的调用实例:http://doc.zeroc.com/display/Ice/Application+Notes+for+PHP

Ice.MessageMaxSize的设置BUG:http://blog.chinaunix.net/uid-24439730-id-144103.html

上一页 下一页