修改Docker默认存储路径

环境centos6.10,version: 1.7.1
修改docker默认存储路径防止镜像太多太大,也方便管理。
[root@hl-qy ~]# docker info
Containers: 0
Images: 0
Storage Driver: devicemapper
Pool Name: docker-253:1-1033069-pool
Pool Blocksize: 65.54 kB
Backing Filesystem: extfs
Data file: /dev/loop0
Metadata file: /dev/loop1
Data Space Used: 305.7 MB
Data Space Total: 107.4 GB
Data Space Available: 24.51 GB
Metadata Space Used: 729.1 kB
Metadata Space Total: 2.147 GB
Metadata Space Available: 2.147 GB
Udev Sync Supported: true
Deferred Removal Enabled: false
Data loop file: /var/lib/docker/devicemapper/devicemapper/data
Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
Library Version: 1.02.117-RHEL6 (2016-12-13)
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 2.6.32-358.6.2.el6.x86_64
Operating System: <unknown>
CPUs: 1
Total Memory: 1.96 GiB
Name: hl-qy
ID: CMYG:IGVE:WZM3:U22U:5S56:JQH3:VZO2:CH3G:WHBZ:XXRY:UXDR:ZP5A
[root@hl-qy ~]# yum list installed | grep docker
docker-io.x86_64 1.7.1-2.el6 @epel
[root@hl-qy ~]# docker version
Client version: 1.7.1
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 786b29d/1.7.1
OS/Arch (client): linux/amd64
Server version: 1.7.1
Server API version: 1.19
Go version (server): go1.4.2
Git commit (server): 786b29d/1.7.1
OS/Arch (server): linux/amd64

查到默认的信息后接下来修改

# mkdir /data

# /etc/init.d/docker stop

# cd /var/lib

# cp –rf docker /data

# rename ./docker/ ./docker_old ./docker/

# ln –s /data/docker  docker

# /etc/init.d/docker start

重启后再查询下

# docker info

Data loop file: /data/docker/devicemapper/devicemapper/data
Metadata loop file: /data/docker/devicemapper/devicemapper/metadata

恭喜已经修改成功

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

【原创】Laravel查看版本号的方法

laravel使用Application对象直接输出version属性。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\User;
use Illuminate\Foundation\Application;

class TestController extends Controller
{
    public function index()
   {
      echo Application::VERSION;
      exit;
   }
}

文件在扩展文件夹:vendor/laravel/framework/src/Illuminate/Foundation/Application.php

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

【原创】yii2官方imagine图片处理扩展支持水印、尺寸,略图,裁剪,旋转

最近写个yii2编辑器扩展用到了官方图片处理扩展,这里顺便说下。

首先安装:composer require –prefer-dist yiisoft/yii2-imagine

prefer-dist参数本地保存缓存,重新添加缓存读取。

扩展目录添加2个新目录

vendor/imagine
vendor/yiisoft/yii2-imagine

使用先引入:

use yii\imagine\Image;

$image=’@webroot/test-image.jpg’;

$quality=75;

//图片水印
Image::watermark($image, ‘@webroot/watermark.png’, [0, 0])->save($image, [‘quality’ => $quality]);

//文字水印
Image::text($image, ‘netpc.com.cn测试’, ‘@vendor/netpc/yii2-ueditor/assets/fonts/Alibaba-PuHuiTi-Heavy.otf’, [0,0], [‘color’ => ‘#000000’, ‘size’ =>16])->save($image, [‘quality’ => $quality]);

//修改尺寸
$image = Image::resize($image, 600, 0)->save($image, [‘quality’ => $quality]);

//裁剪
Image::crop($image, 120 , 120, [0, 0])->save($image, [‘quality’ => $quality]);

//略图
Image::thumbnail($image, 120, 120 ,\Imagine\Image\ManipulatorInterface::THUMBNAIL_INSET)->save($image, [‘quality’ => $quality]);

//旋转
Image::frame($image, 5, ‘666’, 0)->rotate(-8)->save($image, [‘quality’ => $quality]);

其它可以参考我的写的composer require netpc/yii2-ueditor扩展或查看官方源码

@see https://github.com/yiisoft/yii2-imagine

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

【原创】框架使用class_exists()检查类是否存在要注意

今天使用class_exists检查是否安装yii2官方扩展yiisoft/yii2-imagine类的时候

if(class_exists('Image')){}

这样无论怎么检查都是flash

原来框架里需要使用完整命名空间路径

use yii\imagine\Image;
if(class_exists('yii\imagine\Image')){}

这样才能正确检查类是否有效。

 

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

【原创】GridView使用kartik扩展yii2-export导出ExportMenu文档前后加内容

今天yii2表格GridView使用kartik扩展yii2-export导出excel文档的时候需要在表格内容前面或后面加一些说明内容,结果官方文档说明也不是很清楚,查看vendor\kartik-v\yii2-export\src\ExportMenu.php源码发现有contentBefore和contentAfter两个属性可以用,尝试下果然可以,代码如下:

<?php echo  ExportMenu::widget([
   'dataProvider' => $dataProvider,
   'columns' => $columns,
   'showColumnSelector' => false,
   'asDropdown' => false,
   'exportConfig' => [
      ExportMenu::FORMAT_HTML => false,
      ExportMenu::FORMAT_CSV => false,
      ExportMenu::FORMAT_TEXT => false,
      ExportMenu::FORMAT_PDF => false,
      ExportMenu::FORMAT_EXCEL => false,
      ExportMenu::FORMAT_EXCEL_X => [
         'icon' => '',
         'iconOptions' => ['class' => ''],
         'label' => '<button id="download">导出</button>',
         'options' => ['class' => 'btn btn-primary', 'style' => 'display:none'],
      ],
   ],
   //导出excel内容前面加内容
   'contentBefore' => [
      ['value' => 'v1'],
      ['value' => 'v2'],
   ],
   //导出excel内容后面加内容
   'contentAfter' => [
      ['value' => 'v1'],
      ['value' => 'v2'],
   ],
   'filename' => date('YmdHi'),
]);

导出如图:
yii2 excel 导出

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

【原创】Github修改用户名

今天想起之前github的名称命名有问题需要修改,但是这样要注意,会影响之前的所有仓库项目发布,因为地址会发生改变。在Setting-Account Setting-Change username处修改用户名即可,如图:
Github修改用户名
Github修改用户名
Github修改用户名
Github修改用户名

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

【原创】Github删除项目仓库

今天发现github有个之前保存的旧项目需要删除,查看了下,如图登陆账号进入项目点击setting页面,拉到最下面点Delete this repository,弹出删除确认对话框,根据提示输入项目名称,点击提交即可。

Github删除项目仓库
Github删除项目仓库

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

【原创】yii2配置各种监控日志发送邮件及时处理

yii2日志自动发送邮件网上已经有很多例子了,这里会把踩坑和别的说说。

同样先把基本的说说,先配置项目公用邮箱配置common/config/main-local.php,自己用qq邮箱开通smtp就可以了。

'components' => [
   'db' => [
      'class' => 'yii\db\Connection',
      'dsn' => 'mysql:host=localhost;dbname=yii2advanced',
      'username' => 'root',
      'password' => 'root',
      'charset' => 'utf8',
   ],
   'mailer' => [
      'class' => 'yii\swiftmailer\Mailer',
      'viewPath' => '@common/mail',
      // send all mails to a file by default. You have to set
      // 'useFileTransport' to false and configure a transport
      // for the mailer to send real emails.
      //if ($this->useFileTransport) {
      // $isSuccessful = $this->saveMessage($message);
      //} else {
      // $isSuccessful = $this->sendMessage($message);
      //}
      'useFileTransport' => false,//这句一定有,false发送邮件,true只是生成邮件在runtime文件夹下,不发邮件
      'transport' => [
         'class' => 'Swift_SmtpTransport',
         'host' => 'smtp.qq.com',  //每种邮箱的host配置不一样
         'username' => 'admin@netpc.com.cn',
         'password' => 'xxx',
         'port' => '465',
         'encryption' => 'ssl',
      ],
      'messageConfig' => [
         'charset' => 'UTF-8',
         'from' => ['admin@netpc.com.cn' => 'admin']
      ],
   ],
],

以上配置成功后就能发送邮件了,

$mail= Yii::$app->mailer->compose();
$mail->setTo('admin@netpc.com.cn');
$mail->setSubject($title);
//$mail->setTextBody('text');   //发布纯文字文本
$mail->setHtmlBody("<br>商品:<a href='".$url."' target='_blank'>地址</a>");    //发布可以带html标签的文本
if($mail->send())
   return "success";
else
   return "failse";

这样只是自己能发邮件,但是日志错误是不会自动发送的,这时候需要配置项目内容,这里用api项目举例,文件api/config/main.php。

'log' => [
   'traceLevel' => YII_DEBUG ? 3 : 0,
   //'flushInterval' => 1,
   'targets' => [
      [
         //'class' => 'yii\log\EmailTarget',//默认邮件处理类
         'class' => 'api\components\EmailTargetKen',//自定义日志处理类
         //'levels' => ['error', 'warning', 'trace', 'info'],//各种等级区分,根据需要使用
         'levels' => ['error'],
         'categories' => ['email_log'],
         'mailer' => 'mailer',
         'message' => [
            'from' => ['admin@netpc.com.cn' => 'admin'],
            'to' => ['admin@netpc.com.cn'],
            'subject' => 'Log message',

         ],
         'except' => ['yii\web\HttpException:404'],  // 排除404,不然的话你会发现你的邮箱里全塞满了这些邮件
         'exportInterval' => 1,//阀值一个错误的时候就执行输出
         'logVars' => [],
      ],
      [
         'class' => 'yii\log\FileTarget',//默认文件处理类
         'levels' => ['error', 'warning'],
         'exportInterval' => 1,
         'categories' => ['myinfo'],
         //'categories' => ['yii\*'],//$categories the message categories to filter by. If empty, it means all categories are allowed.
         'logVars' => ['*'],//记录最基本的 []赋值也可以
         //'logFile' => '@runtime/logs/order.log'.date('Ymd'),//用日期方式记录日志
      ],
   ],
],

这里说说坑了,假如你配置了categories这个属性,那么只有在自己代码里面执行Yii::error这样代码才能触发文件记录和发送邮件错误日志,而且是必需程序能正常完全执行完毕才能触发,例如代码有个语法输错array(少了一个括号,有没有配置一个全局没有categories分类的日志配置,那么以下Yii::error的日志都不会被触发,除非加多一个没有categories的全局配置。

Yii::error('error_test1');
Yii::error('error_test2','myinfo');//只会记录到myinfo分类文件日志里
Yii::error('error_test3','email_log');//只会记录到email_log分类邮件日志里

我就是按照网上配置了categories这个属性,结果没有用YII:error去触发错误,一直都没办法查看到日志和邮件。

我建议如果你需要分类保存日志,也需要配置一个全局的,因为只有全局没有限制分类的存在才能记录到所有的错误,那怕你没有配置分类,也能传分类参数用分类记录日志。

接下来说说api\components\EmailTargetKen这个自定义处理类,看看源码包括数据库记录什么都可以自己搞出来加工处理整合在一起。

我为什么做处理是因为在做测试的时候,故意写错语法,界面提示{“name”:”PHP Parse Error”,”message”:”syntax error, unexpected ‘]'”,”code”:4,”type”:”yii\\base\\ErrorException”,”file”:后面省略,可是日志文件里面却记录的不一样,少了”name”:”PHP Parse Error”这句语法错误提示,翻看源码后发现记录和提示的确是不一样。所以只能自己加工了。

namespace api\components;
public function export()
{
    // moved initialization of subject here because of the following issue
    // https://github.com/yiisoft/yii2/issues/1446
    if (empty($this->message['subject'])) {
        $this->message['subject'] = 'Application Log';
    }

    $error = Yii::$app->errorHandler->exception;
    $messages = array_map([$this, 'formatMessage'], $this->messages);

    //不喜欢它70个字符截断换行的方式    
    //$body = wordwrap(implode("\n", $messages), 70);
    //如果捕获的到错误就加上错误名称
    if($error){
        $body = $error->getName().implode("\n", $messages);
    }else{
        $body = implode("\n", $messages);
    }
    $message = $this->composeMessage($body);
    if (!$message->send($this->mailer)) {
        throw new LogRuntimeException('Unable to export log through email!');
    }
}

这样就能带上错误名称,有名称一看提示就能清楚大概是什么问题导致的。

yii2自动发送错误日志邮件有什么问题给我留言。

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

谷歌浏览器https证书过期更新后依然错误

今天有个域名的免费https证书过期了,然后重新申请更新后,谷歌浏览器上显示不安全,可是火狐没问题。

谷歌按F12,然后切换到“Security”,查看该网站使用的ssl证书情况,显示页面不安全。

This page is not secure.
Active content with certificate errors
You have recently allowed content loaded with certificate errors (such as scripts or iframes) to run on this site.

网上https过期,一般就是查看证书是否过期,电脑时间是否正确,最后我测试用一个文本文件访问都出现同样的错误提示,那样肯定没有脚本或框架。

考虑应该是证书缓存,晚上找了删除方法,还是不行。

最后很简单,什么问题都没有,就是重启下浏览器,哎,表示无语,重启重启重启,3遍。

 

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

[原创]yii2搭建restful风格api接口强制返回json数据格式

yii2搭建了一个restful风格api接口,想要通过配置文件直接就强制所有action直接返回json数据格式,结果发现移动只要继承use yii\rest\ActiveController;控制器配置文件bootstrap和response的配置就会失效。最后看源码发现ActiveController继承\vendor\yiisoft\yii2\rest\Controller.php控制器里面通过behaviors行为重写了返回信息的数据格式。那么如果选择继承ActiveController控制器的话就只能在当前的行为重写返回数据格式规则,这样就需要每个控制器都去写规则了,如果想全局只能从配置文件里在response里执行到最后截取要出去数据根据自己的需求定义再输出,但是这样又不够灵活,自己看着办吧。参考如下配置内容根据自己需要修改:

return [
   'id' => 'app-api',
   'basePath' => dirname(__DIR__),
   'controllerNamespace' => 'api\controllers',
   'bootstrap' => [
      'log',
      [
         'class' => 'yii\filters\ContentNegotiator',
         'formats' => [
            'application/json' => yii\web\Response::FORMAT_JSON,
            //'text/html' => yii\web\Response::FORMAT_JSON,
            //'application/xml' => yii\web\Response::FORMAT_XML,
         ],
      ]
   ],
   'modules' => [
      'v1' => [  //module 与gii生成module配置的ModuleID 一致
         'class' => 'api\modules\v1\Module',
      ],
   ],
   'components' => [
      'request' => [
         'csrfParam' => '_csrf-api',
         'parsers' => [  //返回的数据格式为json
            'application/json' => 'yii\web\JsonParser',
            'text/json' => 'yii\web\JsonParser',
         ],
      ],
      //'response' => [
      // 'on beforeSend' => function($event) {
      //    if(is_array($event->sender->data)){
      //       $event->sender->format = 'json';
      //    }
      // },
      //],
      'response' => [
         'format' => 'json',//全局controller 返回json 不包括 ActiveController 会被行为重写
         //'charset' => 'UTF-8',
      ],
      'response' => [
         'format' => 'json',
         'formatters' => [
            \yii\web\Response::FORMAT_JSON => [
               'class' => 'yii\web\JsonResponseFormatter',
               'prettyPrint' => YII_DEBUG, // use "pretty" output in debug mode
               'encodeOptions' => JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE,
               // ...
            ],
         ],
      ],
      'response' => [
         'class' => 'yii\web\Response',
         'on beforeSend' => function ($event) {
            $response = $event->sender;
            $response->data = [
               'success' => $response->isSuccessful,
               'code' => $response->getStatusCode(),
               'message' => $response->statusText,
               'data' => $response->data,
            ];
            $response->statusCode = 200;
         },
      ],

在当前控制器里重写ActiveController控制器里的行为内容,参考着用。

class DefaultController extends ActiveController
{
   /**
    * Renders the test view for the module
    * @return string
    */
   //public function behaviors()
   //{
   // return [
   //    [
   //       'class' => 'yii\filters\ContentNegotiator',
   //       'only' => ['view', 'index'],  // in a controller
   //       // if in a module, use the following IDs for user actions
   //       // 'only' => ['user/view', 'user/index']
   //       'formats' => [
   //          'application/json' => Response::FORMAT_JSON,
   //       ],
   //       'languages' => [
   //          'en',
   //          'de',
   //       ],
   //    ],
   // ];
   //}
   public function behaviors()
   {
      $behaviors = parent::behaviors();
      $behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_JSON;
      //print_r($behaviors);exit;
      return $behaviors;
   }
发表在 服务器 | 标签为 | 留下评论