服务器MySQL报错ERROR 1030 (HY000): Got error 28 from storage engine

当前位置:首页 » ThinkPHP
In 笔记  @2018-05-22

正在家里看美剧在,同事微信call我表示所有接口都不行了,服务器貌似崩了。

查找原因

查看后发现是MySQL报错:

ERROR 1030 (HY000): Got error 28 from storage engine

一番google后发现是由于系统磁盘临时空间不足导致。
在服务根目录下运行:

[root@iZ****tecZ /]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1       40G   38G   16M 100% /
tmpfs           1.9G     0  1.9G   0% /dev/shm

可以看到已经磁盘已经占用100%了。

解决方案:

清理服务器,腾出空间来。
先找出哪些文件文件夹占用空间比较多,一步一步找到,一般是日志文件或者定时备份的文件压缩包比较占空间。

这里涉及到查找文件夹或者文件占用空间的比较有用的命令,记录一下:

[root@iZ****tecZ /]# du -hm --max-depth=2 | sort -nr | head -12
38053   .
34432   ./var
31423   ./var/www
1815    ./var/log
1579    ./bak20160908
1334    ./usr
1086    ./var/lib
972 ./bak20160908/geo12345
444 ./usr/share
416 ./lib
354 ./bak20160908/test
330 ./lib/modules
  • 命令du -hm --max-depth=2 | sort -nr | head -12这个命令的意思是目录下占用空间从大到小排序,列出前12个。
  • du -h --max-depth=2 /var/www/html这个命令可以列出/var/www/html目录下子文件夹和文件占用空间大小,深度--max-depth=2根据需要调节,表示子文件夹层数。
  • ll -lh当前文件夹下所有文件的大小、权限、归属等信息。

经过一番查找,由于忘记关掉ThinkPHPlogs功能,导致在网站的RunTime/Logs里面存在大量日志文件占掉了大把的空间,占了磁盘总大小40G中的23G,删除后服务器恢复正常。

标签: , ,   评论: 抢沙发 

ThinkPHP3.2.3静态缓存的使用

当前位置:首页 » ThinkPHP
In 笔记  @2018-05-10

静态缓存可以大幅提升网站、接口的访问速度,对提升用户体验非常有帮助,刚好项目上也遇到这样的需求,在ThinkPHP3.2.3中实现前台页面静态缓存。

原理

静态缓存也就是将动态语言查询数据库然后渲染后的页面直接转换成文件(或者json)存储起来,当用户访问的时候,直接呈现给用户即可。

缓存前:

  • 根据用户请求页面解析到对应控制器、方法;
  • 查询数据库取出数据;
  • 数据处理;
  • 将数据渲染到模版输出;

缓存后:

  • 根据用户请求定位到静态文件;
  • 直接输出静态文件;

静态缓存通过简化处理流程(特别是连接数据库读取数据和数据处理),是可以大幅提升访问速度的。

实现步骤

1. 缓存配置:

在需要缓存的模块配置文件(如\Application\Home\Conf\config.php)中加入静态缓存配置:

    // 静态缓存配置
    'HTML_CACHE_ON'     =>    true,       // 开启静态缓存
    'HTML_CACHE_TIME'   =>    3600,       // 全局静态缓存有效期(秒)
    'HTML_FILE_SUFFIX'  =>    '.html',    // 设置静态缓存文件后缀
    'HTML_CACHE_RULES'  =>     array(     // 定义静态缓存规则
        // 定义整个文章控制器
        // 'Article:'      =>       'Article/{:action}_{id}',
        // 对商品进行缓存
        // 'Product:plist' =>       'Product/plist_{id}_{pid}',
        // 对单个操作进行缓存
        // 'Index:index'   =>       'Index/index',
        // 对Index控制器的所有操作缓存
        'Index:'           =>       'Index/{:action}_{id}',
        // 对Download控制器的所有操作缓存
        'Download:'        =>       'Download/{:action}_{id}',
        // 对Product控制器的所有操作缓存并设置缓存过期时间为7200秒
        'Product:'         =>       array('Product/{:action}_{id}', '7200'),
    ),

还有更多的静态缓存规则设置参考请官方文档。

2. 更新缓存

大部分情况下,我们不需要更新缓存,因为缓存到了缓存有效期就会自动失效,但有时候,修改模版布局,修改栏目或者更新文章后,需要马上更新缓存以便用户看到的是最新的效果,就需要在后台设置一个更新缓存的功能。

更新缓存的操作update_cache,当道控制器中供使用,其中HTML_PATHThinkPHP3.2.3定义的静态文件目录,默认是APP_PATH . 'Html/'

public function update_cache(){
    // 更新静态缓存文件
    if(del_file_under_dir(HTML_PATH)){
        $response = encode_return_data(0, '更新静态缓存成功');
    }else{
        $response = encode_return_data(10006, '更新静态缓存失败');
    }
    $this->ajaxReturn($response);
}

删除文件夹内的文件通用方法del_file_under_dir(),这个放到function.php

/**
 * 循环删除目录下的所有文件
 * @Author      hsu1943
 * @DateTime    2018-05-04T10:47:33+0800
 * @param    string                    $dirName 目录
 * @return   boolean                            是否删除成功
 */
function del_file_under_dir($dirName){
    if($handle = opendir( "$dirName" )) {
        while(false !== ($item = readdir($handle))){
            if($item != "." && $item != ".."){
                if(is_dir("$dirName/$item")){
                    del_file_under_dir("$dirName/$item");
                }else{
                    try {
                        unlink("$dirName/$item");
                    } catch (\Exception $e) {
                        echo $e->getMessage();
                    }
                }
            }
        }
        closedir($handle);
        return true;
    }else{
        return false;
    }
}
标签: , ,   评论: 抢沙发 

ThinkPHP3.2.3查询多次JOIN同一张表的处理

当前位置:首页 » ThinkPHP
In 笔记  @2018-05-09

问题:

在项目开发中遇到问题,要查询的一张主表post中有两个字段都关联了user表的id,需要取出useruser_name字段,那么应该怎么查询呢?

解决:

$posts_list = M()
    ->table('gc_post P')
    ->join('gc_user U ON P.author_id=U.id')
    ->join('gc_user U_M ON P.mentor_id=U_M.id')
    ->field('P.id, P.title, U.user_name as author_name, U_M.user_name as mentor_name,')
    ->order('P.gc_order desc')
    ->select();

这里是在ThinkPHP3.2.3下开发,给一张表取不同的别名,多次JOIN查询就可以正常取到数据了。

标签: , , ,   评论: 抢沙发