在CentOS release 6.5(Final) X64下安装docker

首先查看内核
[root@netpc.com.cn~]# uname -r
2.6.32-431.23.3.el6.x86_64

据说是要3.1以上的

试试看

安装docker-io
yum -y install docker-io

查看状态
[root@netpc.com.cn ~]# service docker status
docker is stopped

启动docker进程
[root@netpc.com.cn ~]# service docker start
Starting cgconfig service: [ OK ]
Starting docker:[ OK ]

搜索php镜像
[root@netpc.com.cn ~]# docker search php
Cannot connect to the Docker daemon. Is ‘docker -d’ running on this host?

根据提示执行
[root@netpc.com.cn ~]# docker -d
WARN[0000] You are running linux kernel version 2.6.32-431.23.3.el6.x86_64, which might be unstable running docker. Please upgrade your kernel to 3.10.0.
docker: relocation error: docker: symbol dm_task_get_info_with_deferred_remove, version Base not defined in file libdevmapper.so.1.02 with link time reference

忽略警告,再次查看状态,docker死了,可是pid还在。
[root@netpc.com.cn ~]# service docker status
docker dead but pid file exists

网上搜索要安装对应的包
[root@netpc.com.cn ~]# yum upgrade device-mapper-libs

再次查看状态,已经变了。
[root@netpc.com.cn ~]# service docker status
docker dead but subsys locked

原来是要重启下。
[root@netpc.com.cn ~]# service docker restart
Stopping docker: [FAILED]
Starting docker:[ OK ]

再次查看状态,已经运行中了。
[root@netpc.com.cn ~]# service docker status
docker (pid 29178) is running…

发表在 服务器 | 标签为 | 留下评论

docker pull很慢的解决方法

今天线上服务器测试docker

在拉php5.3.29的时候发现竟然掉线了

[root@netp.com.cn~]# docker pull php:5.3.29-fpm
Pulling repository php
php:5.3.29-fpmGet https://registry-1.docker.io/v1/repositories/library/php/tags: read tcp 34.205.207.96:443: i/o timeout

有没有发现超时了,尝试了很多次都行。

最后找了个镜像一下次就搞定了,用pull上直接指定daocloud.io即可,当然还有其它镜像例如阿里云之类的。

[root@netpc.com.cn~]# docker pull daocloud.io/library/php:5.3.29
5.3.29: Pulling from daocloud.io/library/php

3690474eb5b4: Pull complete 
000e626f3e24: Pull complete 
93b7a6fbb8ca: Pull complete 
b0deb4620cac: Pull complete 
0bc0ebd7adce: Pull complete 
f5cb651f164e: Pull complete 
d07b2849cf17: Pull complete 
3cc31e514678: Pull complete 
35f5af617e67: Pull complete 
666274caa93c: Pull complete 
Digest: sha256:94fae2c176641bb06d95da333bb8e21079a3e5dfc8de404f6bf39708a072ae70
Status: Downloaded newer image for daocloud.io/library/php:5.3.29
[root@netpc.com.cn~]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
daocloud.io/library/php 5.3.29 666274caa93c 3 years ago 728.5 MB

上面的728.5MB版本 不知道怎么用

上阿里云https://dev.aliyun.com/搜索php 5.3有人分享了个fpm的可以用。

docker pull registry.cn-hangzhou.aliyuncs.com/sjdskl/php5.3-fpm

发表在 服务器 | 标签为 | 留下评论

修改docker存储设置移动目录Device or resource busy

今天为了修改Docker本地镜像与容器的存储位置

首先停掉Docker服务:

systemctl restart docker
或者
service docker stop

然后移动整个/var/lib/docker目录到目的路径:

mv /var/lib/docker /root/data/docker
ln -s /root/data/docker /var/lib/docker

过程出现在mv命令后有个/var/lib/docker/devicemapper一直无法移动和删除

提示rm: cannot remove `/var/lib/docker/devicemapper’: Device or resource busy

原因在建立容器的时候做了相应目录的挂载,没有卸载,所以Device or resource busy

根据网上的

lsof |grep docker

cat /proc/mounts | grep “mapper/docker” | awk ‘{print $2}’

都没打印出什么

最后直接打印docker就出来了

[root@netpc.com.cn~]# cat /proc/mounts | grep “docker”
/dev/vda1 /var/lib/docker/devicemapper ext4 rw,relatime,barrier=0,data=ordered 0 0
[root@netpc.com.cn~]# umount /var/lib/docker/devicemapper/

可以删除目录了,搞定!

 

发表在 服务器 | 标签为 , | 留下评论

yii2.0.15中文rules验证规则大全

这里展示常用的yii2常用的rules验证规则:

file : 文件

['imageFiles', 'file',  'extensions' => ['png','jpg'],'wrongExtension'=>'只能上传{extensions}类型文件',
   'maxFiles' => 4,'tooMany'=>'文件上传太多',
   'maxSize'=>1024*1024*5,'tooBig'=>'文件上传过大'
],
#说明:imageFiles就是模型里面保存有个图片变量,不一定是表单的名称。

image :是否为有效的图片文件

['primaryImage', 'image', 'extensions' => 'png, jpg',
 'minWidth' => 100, 'maxWidth' => 1000,
 'minHeight' => 100, 'maxHeight' => 1000,
 ]

required : 必须值验证属性

[['字段名'],required,'requiredValue'=>'必填值','message'=>'提示信息']; #说明:CRequiredValidator 的别名, 确保了特性不为空. 

email : 邮箱验证

['email','email','message'=>'邮箱格式错误'],

match : 正则验证

[['字段名'],match,'pattern'=>'正则表达式','message'=>'提示信息'];      
[['字段名'],match,'not'=>ture,'pattern'=>'正则表达式','message'=>'提示信息']; /*正则取反*/

url : 网址

['website', 'url', 'defaultScheme' => 'http']; #说明:CUrlValidator 的别名, 确保了特性是一个有效的路径. 

captcha : 验证码

['verificationCode', 'captcha']; #说明:CCaptchaValidator 的别名,确保了特性的值等于 CAPTCHA 显示出来的验证码. 

safe : 安全

['description', 'safe'];

compare : 比较

['age', 'compare', 'compareValue' => 30, 'operator' => '>=']; #说明:compareValue(比较常量值) - operator(比较操作符)  #说明:CCompareValidator 的别名,确保了特性的值等于另一个特性或常量.
['verifyPassword', 'compare', 'compareAttribute'=>'password', 'message'=>'请再输入确认密码'],

default : 默认值

['age', 'default', 'value' => null]; #说明:CDefaultValueValidator 的别名, 为特性指派了一个默认值. 

exist : 存在

['username', 'exist']; #说明:CExistValidator 的别名,确保属性值存在于指定的数据表字段中. 

filter : 滤镜

[['username', 'email'], 'filter', 'filter' => 'trim', 'skipOnArray' => true]; #说明:CFilterValidator 的别名, 使用一个filter转换属性. 

in : 范围

['level', 'in', 'range' => [1, 2, 3]]; #说明:CRangeValidator 的别名,确保了特性出现在一个预订的值列表里. 

unique : 唯一性

['username', 'unique'] #说明:CUniqueValidator 的别名,确保了特性在数据表字段中是唯一的. 

类型验证 integer,float,string,array,date,time,datetime

['created', 'type', 'datetime'],

integer : 整数

['age', 'integer'];

number : 数字

['salary', 'number'];

double : 双精度浮点型

['salary', 'double'];

date : 日期

[['from', 'to'], 'date', 'format'=>'yyyy/MM/dd/ HH:mm:ss'],

length 限制最小长度和最大长度

['username', 'length', 'max'=>7, 'min'=>2, 'tooLong'=>'用户名请输入长度为4-14个字符', 'tooShort'=>'用户名请输入长度为2-7个字'],
['password', 'length', 'max'=>22, 'min'=>6, 'tooLong'=>'密码请输入长度为6-22位字符', 'tooShort'=>'密码请输入长度为6-22位字符'],

string : 字符串

['username', 'string', 'length' => [4, 24]];

boolean : 是否为一个布尔值

['字段名', 'boolean', 'trueValue' => true, 'falseValue' => false, 'strict' => true]; #说明:CBooleanValidator 的别名 

新版yii2文件夹目录下\vendor\yiisoft\yii2\validators\Validator.php的各种最新验证规则源码,可以到该路径下去一个个去分析。

public static $builtInValidators = [
    'boolean' => 'yii\validators\BooleanValidator',
    'captcha' => 'yii\captcha\CaptchaValidator',
    'compare' => 'yii\validators\CompareValidator',
    'date' => 'yii\validators\DateValidator',
    'datetime' => [
        'class' => 'yii\validators\DateValidator',
        'type' => DateValidator::TYPE_DATETIME,
    ],
    'time' => [
        'class' => 'yii\validators\DateValidator',
        'type' => DateValidator::TYPE_TIME,
    ],
    'default' => 'yii\validators\DefaultValueValidator',
    'double' => 'yii\validators\NumberValidator',
    'each' => 'yii\validators\EachValidator',
    'email' => 'yii\validators\EmailValidator',
    'exist' => 'yii\validators\ExistValidator',
    'file' => 'yii\validators\FileValidator',
    'filter' => 'yii\validators\FilterValidator',
    'image' => 'yii\validators\ImageValidator',
    'in' => 'yii\validators\RangeValidator',
    'integer' => [
        'class' => 'yii\validators\NumberValidator',
        'integerOnly' => true,
    ],
    'match' => 'yii\validators\RegularExpressionValidator',
    'number' => 'yii\validators\NumberValidator',
    'required' => 'yii\validators\RequiredValidator',
    'safe' => 'yii\validators\SafeValidator',
    'string' => 'yii\validators\StringValidator',
    'trim' => [
        'class' => 'yii\validators\FilterValidator',
        'filter' => 'trim',
        'skipOnArray' => true,
    ],
    'unique' => 'yii\validators\UniqueValidator',
    'url' => 'yii\validators\UrlValidator',
    'ip' => 'yii\validators\IpValidator',
];
发表在 服务器 | 标签为 , | 留下评论

php通过ajax上传多文件带图片预览

以前上传图片预览都会有跨域问题,现在新的html5和浏览器都支持新的玩法了,我这里说说思路但是没有完整的代码。

在form表单enctype数据编码multipart/form-data进行传输,主要是通过HTML5的FormData对象转变表单成需要的数据类型。multiple选多图。

<form id="uploadForm" enctype="multipart/form-data">
 <input id="file" type="file" name="file" multiple="multiple" onchange="preview(this)"/>
 <button id="upload" type="button">upload</button>
 </form>
<div class="picList">

</div>
//上传前图片预览
function preview(obj){
 var length = obj.files.length;
 //多图上传时遍历文件信息(可以通过object.files查看)
 for (var i = 0; i < length; i++) {//循环输出预览图片
  $('.picList').append('<img src="'+window.URL.createObjectURL(obj.files[i])+'"/>');
  }
 }
}

FormData对象用以将数据编译成键值对,以便用XMLHttpRequest来发送数据。其主要用于发送表单数据,但亦可用于发送带键数据(keyed data),而独立于表单使用。如果表单enctype属性设为multipart/form-data ,则会使用表单的submit()方法来发送数据,从而,发送数据具有同样形式。

//点击表单upload按钮提交执行脚本
$.ajax({
 url: "upload.php",
 type: 'POST',
 cache: false,
 data: new FormData($("#uploadForm")[0]),
 processData: false,
 contentType: false,
 success: function (result) {
 },
 error: function (err) {
 }
 });

这里要注意几点:

  • processData设置为false。因为data值是FormData对象,不需要对数据做处理。
  • <form>标签添加enctype=”multipart/form-data”属性。
  • cache设置为false,上传文件不需要缓存。
  • contentType设置为false。因为是由<form>表单构造的FormData对象,且已经声明了属性enctype=”multipart/form-data”,所以这里设置为false。

upload.php页面

print_r($_FILES['file']);//打印下文件是否上传成功
move_uploaded_file//保存临时上传文件

有问题留言 哈

发表在 服务器 | 标签为 , | 留下评论

PHP流程控制的替代语法(冒号,endif,endwhile,endfor,endforeach以及endswitch)

PHP 提供了一些流程控制的替代语法,包括 if,while,for,foreach 和 switch。替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成 endif;,endwhile;,endfor;,endforeach; 以及 endswitch;。支持php所有版本。

为什么有这样的语法呢?我可以理解为在PHP和HTML代码混合的时候更加代码整齐,容易阅读,逻辑清晰?

<?php if ($a == 5): ?>
A is equal to 5
<?php endif; ?>

在上面的例子中,HTML 内容“A is equal to 5”用替代语法嵌套在 if 语句中。该 HTML 的内容仅在 $a 等于 5 时显示。

替代语法同样可以用在 else 和 elseif 中。下面是一个包括 elseif 和 else 的 if 结构用替代语法格式写的例子:

<?php
if ($a == 5):
    echo "a equals 5";
    echo "...";
elseif ($a == 6):
    echo "a equals 6";
    echo "!!!";
else:
    echo "a is neither 5 nor 6";
endif;
?>

Note:
不支持在同一个控制块内混合使用两种语法。

Warning

switch 和第一个 case 之间的任何输出(含空格)将导致语法错误。例如,这样是无效的:

<?php switch ($foo): ?>
    <?php case 1: ?>
     ... 
<?php endswitch ?>

而这样是有效的,因为 switch 之后的换行符被认为是结束标记 ?> 的一部分,所以在 switchcase 之间不能有任何输出:

<?php switch ($foo): ?>
<?php case 1: ?>
...
<?php endswitch ?>
发表在 服务器 | 标签为 | 留下评论

PHP使用mkdir函数创建目录权限问题

不记得从哪里复制了创建目录的php代码mkdir(‘my’, ‘777’,true);,在windows没问题,到了linux下就出现问题了,正确格式如下:

mkdir(‘my’, 0777,true);

常用创建目录函数mkdir第二个参数必须是数字类型,不能是字符串,默认的 mode 是 0777,意味着最大可能的访问权。注意也许想用八进制数指定模式,也就是说该数应以零打头。模式也会被当前的 umask 修改,可以用 umask() 来改变。,也可以用chmod(‘my’, 0777);来修改。

具体看官方文档
http://php.net/manual/zh/function.mkdir.php

 

发表在 服务器 | 标签为 , | 留下评论

linux推荐使用logrotate自动管理日志文件

最近发现在ubuntu或centos下使用logrotate管理分割nginx日志很方便,再也不用自己写shell了。

一般系统都自带了,如果没有就安装个,容易简单。

yum install logrotate
apt-get install logrotate

命令参数说明

# logrotate --help
Usage: logrotate [OPTION...] 
 -d, --debug 调试模式,输出调试结果,并不执行。隐式-v参数
 -f, --force 强制模式,对所有相关文件进行rotate
 -m, --mail=command 发送邮件 (instead of `/bin/mail')
 -s, --state=statefile 状态文件,对于运行在不同用户情况下有用
 -v, --verbose 显示debug信息

配置选项说明

compress:通过gzip 压缩转储旧的日志
nocompress:不需要压缩时,用这个参数
copytruncate:用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate:备份日志文件但是不截断
create mode owner group:使用指定的文件模式创建新的日志文件
nocreate:不建立新的日志文件
delaycompress:和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress:覆盖 delaycompress 选项,转储同时压缩。
errors address:专储时的错误信息发送到指定的Email 地址
ifempty:即使是空文件也转储,这个是 logrotate 的缺省选项。
notifempty:如果是空文件的话,不转储
mail address:把转储的日志文件发送到指定的E-mail 地址
nomail:转储时不发送日志文件
olddir directory:转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir:转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript:在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
postrotate/endscript:在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
sharedscripts:所有的日志文件都轮转完毕后统一执行一次脚本
daily:指定转储周期为每天
weekly:指定转储周期为每周
monthly:指定转储周期为每月
dateext在文件末尾添加当前日期 
rotate count:指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
size size:当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB

Q&A

1.如何测试logrotate程序执行的情况

答:/usr/sbin/logrotate -d /etc/logrotate.d/nginx

2.怎么查看log文件的具体执行情况

答:cat /var/lib/logrotate/status

3.使用-v或-d参数时,显示log does not need rotating

答:logrotate在对status未记录的文件进行转储时,会在status添加一条该文件的记录,并将操作时间设为当天。之后程序再次对此文件进行转储时发现这个文件今天已经操作过,就不再进行相关操作。

解决方法:
1. vi /var/lib/logrotate/status  更改相对应的文件操作日期
2. 使用-s指定状态文件

4.分割日志时报错:error: skipping “/var/log/nginx/test.access.log” because parent directory has insecure permissions (It’s world writable or writable by group which is not “root”) Set “su” directive in config file to tell logrotate which user/group should be used for rotation.

答:添加“su root list”到/etc/logrotate.d/nginx文件中即可

如下;ubuntu才有可能需要指定su root www,centos不用。

/data/logs/nginx/*.log {
 su root www
 daily
 rotate 21
 missingok
 dateext
 compress
 notifempty
 sharedscripts
 postrotate
  [ -e /data/logs/nginx/nginx.pid ] && kill -USR1 `cat /data/logs/nginx/nginx.pid`
 endscript
}

logrotate配置文件一般在:

/etc/logrotate.conf 通用配置文件,可以定义全局默认使用的选项。
/etc/logrotate.d/xxx 自定义服务配置文件

默认的logrotate被加入cron的/etc/cron.daily中作为每日任务执行。
如果有打开cron定时日志,查看的日志即可

# grep logrotate /var/log/cron
发表在 服务器 | 标签为 , , , | 留下评论

svn代码库重定位relocate更换服务器

今天因为更换svn代码库服务器所以本地和远程相关的地方都需要重新定位。

svn重定位操作可能的原因:

a)服务器的计算机名称修改,IP地址已更改

b) 协议已更改(比如从svn http: https:等切换)

c) 版本库在服务器的路径更改

进入版本库目录执行:svn info 查看相关信息

执行以下代码更换:第一个参数原地址,第二个参数新地址

svn switch --relocate http://192.168.0.1/svn http://192.168.0.2/svn

windows下的TortoiseSVN更新地址:右键点击版本库,选择Relocate,弹出窗口更换即可。

发表在 服务器 | 标签为 | 留下评论

AJax如何提交数据数组?

今天原先我是用form表单直接提交php数据。内容如下:

<form action="my/feedback-create" class="form-wrap" method="post" id="Feedback">
      <textarea name="Feedback[content]" class="fb-lang" id="content" placeholder="请输入您反馈的内容" maxlength="150"></textarea>
   <input type="button" class="btn-sub" value="提交">
</form>

php接受后就是个多维数组,可是项目需求不能通过post直接跳转地址,需要通过ajax来提交,查询后使用jquery提交data可以把表单序列化转换即可。

var data = $('#Feedback').serialize();
发表在 服务器 | 标签为 | 留下评论