东东东 陈煜东的博客

置顶

腾讯云招人啦~

2016开始啦,社招、校招、实习继续啦~ http://www.qcloud.com/

联系我

联系我~ Mjg2Mjg4NDE3QHFxLmNvbQ==

如果对虚拟化技术感兴趣,就联系我吧,这里有很多不同的岗位,不要局限于以下几个~,找我内推啦~

相关的岗位有:

  • 类openstack
  • kvm虚拟化
  • SDN虚拟网络
  • web开发
  • 运营开发
  • 运维

更多岗位参考-> 腾讯云招聘

腾讯云计算平台研发工程师

岗位职责

  • 负责腾讯云主机业务后台server研发;
  • 负责腾讯云主机虚拟化控制平台的相关架构和研发;
  • 参与相关产品需求讨论以及系统架构的设计和优化工作。

岗位要求

  • 本科及以上学历;
  • 2年以上python开发经验,有C/C++经验者优先;
  • 精通TCP/IP协议,进程间通讯编程,多线程编程等,熟悉Linux常见网络服务器模型;
  • 了解libvirt、qemu等虚拟化组件的原理和代码逻辑优先;
  • 了解KVM虚拟化,熟悉openstack的架构和主要流程,有相关领域工作经验的优先;
  • 具备良好的沟通表能力及团队协作精神、有较强的主动性、责任心与执行能力,具备良好的分析解决问题能力。

运营开发工程师

岗位职责

  • 负责云平台虚拟化运营支撑系统的研发工作,工作内容主要:
  • 腾讯云的资源全景视图,从物理层面到具体云主机的分层视图,包含资源的库存管理,消耗分析,扩容流程等;
  • 云主机调度核心算法的可视化,体现不同云主机的售卖对资源池的影响,从而为主打机型,营销活动,扩充资源提供依据;
  • 虚拟机管理相关运维流程实现,如虚拟主机资源池管理、母机初始化、子机投放工具等;
  • 负责腾讯云Api的相关开发工作。

岗位要求

  • 本科及以上学历;
  • 2年以上B/S架构系统分析设计经验;
  • 精通PHP开发技术,熟悉python,shell等脚本语言;
  • 熟练掌握常用Linux命令,熟练掌握la(n)mp架构,能够熟练对la(n)mp进行架设及配置;
  • 熟悉ITIL体系和运维流程,有相关自动化运维系统开发经验者优先;
  • 有数据库开发,数据分析经验者优先;
  • 熟悉虚拟化技术者(XEN、KVM)优先。

高级系统运维工程师

岗位职责:

  • 负责对虚拟化疑难问题分析解决,形成方法论,提升团队技术能力;
  • 负责通过技术手段、流程制度提升虚拟化平台可用性;
  • 负责分析业务不合理、不高效地方,提出优化改进方案并推进实施;
  • 负责腾讯云虚拟化运维平台规划,建设,不断提升运维效率。

岗位要求:

  • 本科及以上学历;
  • 3年以上相关工作经验,精通linux,windows操作系统,对系统性能相关问题有较深刻理解;
  • 熟悉主流虚拟化技术原理(如kvm,xen,hyper-v,lxc),有实际的对虚拟化疑难问题trouble shooting经验;
  • 熟悉TCP/IP协议,了解SDN相关技术,能够定位linux虚拟化环境下网络异常;
  • 擅长shell,python,perl中一种或几种,熟练应用awk、sed、grep、strace、tcpdump、gdb等常用命令;
  • 有过kernel研究及开发经验者优先。

分类: 生活

sphinx doc正式支持中文搜索啦

之前Sphinx doc一直不支持web的中文搜索,一个牛逼的项目怎么能不支持中文搜索呢。看到现在这个项目的一个负责人是日本人,目前支持CJK的的搜索就是日本了,我觉得不应该呀,我大中华人杰辈出。果然在github上的pull request看到了台湾的enhao兄提交了繁体中文的搜索,看了代码的实现,里面是支持中文搜索的,于是在他的基础上修改了一些完善了简体中文的支持。

我一直觉得sphinx-doc这个项目很不错,可以写文档,写书,多多关注关注一下issue的列表。

上线发布

现在sphinx-doc的master或者v1.4版本后就支持中文(简体+繁体)搜索了。

sphinx-doc的中文搜索是依靠jieba这个开源的类库来实现的,这个类库就支持简体和繁体的切分,所以就很容易实现了。

使用

第一,你的系统需要安装jieba类库, pip install jieba

第二,接下来修改sphinx的conf.py文件,为项目设置为中文的搜索配置。

# Language to be used for generating the HTML full-text search index.
# Sphinx supports the following languages:
#   'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
#   'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh'
html_search_language = 'zh'

第三,可选配置

# A dictionary with options for the search language support, empty by default.
# 'ja' uses this config value.
# 'zh' user can custom change `jieba` dictionary path.
# html_search_options = {'dict': '/usr/lib/jieba.txt'}   # 根据需要设置jieba的词典路径

第四,接下来重新编译生成文档。make html

sphinx的基本搜索原理

在编译的时候:

  1. 先对文本进行切词,把中文切分,
  2. 然后制作一个大的map对象,把关键字做为key,url做为value,保存到js文件。
  3. 搜索的时候寻找对应的关键字key,拿到url作为列表展示。

后续计划

上线比较匆忙,还有一些中文搜索的计划

  • 支持python3的搜索
  • 添加测试的用例

分类: python

sphinx文档使用graphviz来画图

Sphinx是用来写文档的利器,虽然比Markdown来的麻烦一些,但是功能强大,用起来也还很不错。考虑到不同文档之间内的跳转,还有把文档从拆分成多个小文档,而且reStructuredText语言入门成本不高,所以用了sphinx-docs来做文档的编写。

Word来编写文档?呃。。。请赐我一刀。使用Word来进行编排文档,在多人协作的情况下,简直惨不忍睹,文档的格式乱七八糟。

reStructuredText再通过LeTax来编译生成pdf也是很方便的。

为什么要用graphviz来画图?

画图的软件并不是太多,一般的人会选择使用visio来进行画图,visio来画图确实可以,也无可厚非,所见即所得,容易上手。但是用于一个版本控制的文档,visio的版本控制就不是太好了。用文本来说就方便很多了。

有个ditaa使用ascii字符来画图的,http://ditaa.sourceforge.net/。很多工业界的IETF文档用它来画图

+--------+   +-------+    +-------+
|  cRED  | --+ ditaa +--> |       |
|  Text  |   +-------+    |diagram|
|Document|   |!magic!|    |  cGRE |
|     {d}|   | cYEL  |    |       |
+---+----+   +-------+    +-------+
    :                         ^
    |       Lots of work      |
    +-------------------------+

ditaa

但是和中文结合在一起排版就不是太好了。中文一个字符占两个英文字符的位置,导致原图不和谐。还有另外一个原因,感觉编译ditaa的速度有些慢。

下载安装Graphviz

Windows下载Graphviz,解压到一个路径下,然后把其bin目录加入到环境变量中。在cmd中dot -V来验证是否可以使用dot编译了。

Linux请使用系统自带的包管理程序来安装atp-get install graphviz,和Windows同样的验证方法。

Sphinx 配置文件修改

Sphinx项目也需要做一些变更,因为开启了Graphviz插件。修改conf.py

# 通过配置开启graphviz插件
extensions = ['sphinx.ext.graphviz']

# 设置 graphviz_dot 路径
graphviz_dot = 'dot'
# 设置 graphviz_dot_args 的参数,这里默认了默认字体
graphviz_dot_args = ['-Gfontname=Georgia', 
                     '-Nfontname=Georgia',
                     '-Efontname=Georgia']
# 输出格式,默认png,这里我用svg矢量图
graphviz_output_format = 'svg'

这里graphviz_dot的值是dot,为了不把绝对路径写到配置中,防止其他人的路径不一样,所以这里要求dot这个程序在环境变量中,能够直接使用。

graphviz_dot_args这个参数注意正确使用'-Gfontname=Microsoft YaHei',以下是错误的'-Gfontname="Microsoft YaHei"'。 通过-G, -N, -E 来设置全局的 graphnodeedge 属性。

开始使用Graphviz

好了,接下来就可以在sphinx文档中插入你的图片了。

例如:

.. graphviz::

    digraph abc{
        a;
        b;
        c;
        d;

        a -> b;
        b -> d;
        c -> d;
    }

demo图

简单的图形

或者通过

.. graphviz:: external.dot

这个使用一个dot文件内容。

测试一下你的graphviz能否支持好中文


.. graphviz::
   
   digraph idp_modules{
     fontname = "Microsoft YaHei";
     rankdir = TB;
     fontsize = 12;
     
     node [fontname = "Microsoft YaHei", fontsize = 12, shape = "record" ];
     edge [fontname = "Microsoft YaHei", fontsize = 12 ];
     
         subgraph cluster_sl{
             label="IDP支持层";
             bgcolor="mintcream";
             node [shape="Mrecord", color="skyblue", style="filled"];
             network_mgr [label="网络管理器"];
             log_mgr [label="日志管理器"];
             module_mgr [label="模块管理器"];
             conf_mgr [label="配置管理器"];
             db_mgr [label="数据库管理器"];
         };
     
         subgraph cluster_md{
             label="可插拔模块集";
             bgcolor="lightcyan";
             node [color="chartreuse2", style="filled"];
             mod_dev [label="开发支持模块"];
             mod_dm [label="数据建模模块"];
             mod_dp [label="部署发布模块"];
         };
     
     mod_dp -> mod_dev [label="依赖..."];
     mod_dp -> mod_dm [label="依赖..."];
     mod_dp -> module_mgr [label="安装...", color="yellowgreen", arrowhead="none"];
     mod_dev -> mod_dm [label="依赖..."];
     mod_dev -> module_mgr [label="安装...", color="yellowgreen", arrowhead="none"];
     mod_dm -> module_mgr [label="安装...", color="yellowgreen", arrowhead="none"];
   }

如果你的graphviz能够对上面的片段能够输出全部的中文,那么你的graphviz就对中文支持很好了。如图:

中文识别不太好

如果使用Windows的可能node节点里面的文字会看不见,而Linux下的graphviz可以工作的很好。

在中文label的前面增加一个空白字符,要使用以下的:

.. graphviz::
   
   digraph idp_modules{
     fontname = "Microsoft YaHei";
     rankdir = TB;
     fontsize = 12;
     
     node [fontname = "Microsoft YaHei", fontsize = 12, shape = "record" ];
     edge [fontname = "Microsoft YaHei", fontsize = 12 ];
     
         subgraph cluster_sl{
             label=" IDP支持层";
             bgcolor="mintcream";
             node [shape="Mrecord", color="skyblue", style="filled"];
             network_mgr [label=" 网络管理器"];
             log_mgr [label=" 日志管理器"];
             module_mgr [label=" 模块管理器"];
             conf_mgr [label=" 配置管理器"];
             db_mgr [label=" 数据库管理器"];
         };
     
         subgraph cluster_md{
             label=" 可插拔模块集";
             bgcolor="lightcyan";
             node [color="chartreuse2", style="filled"];
             mod_dev [label=" 开发支持模块"];
             mod_dm [label=" 数据建模模块"];
             mod_dp [label=" 部署发布模块"];
         };
     
     mod_dp -> mod_dev [label="依赖..."];
     mod_dp -> mod_dm [label="依赖..."];
     mod_dp -> module_mgr [label="安装...", color="yellowgreen", arrowhead="none"];
     mod_dev -> mod_dm [label="依赖..."];
     mod_dev -> module_mgr [label="安装...", color="yellowgreen", arrowhead="none"];
     mod_dm -> module_mgr [label="安装...", color="yellowgreen", arrowhead="none"];
   }

修正后,可以更好的支持中文了。

修正后,中文识别的更好

参考

分类: 实用技巧

Sublime Text预览Graphviz图

经常用Sublime Text来进行画Graphviz图,如果每次用命令行来进行预览就麻烦了。这个时候当然要利用热心的网友提供的插件了。

下载安装Graphviz

Windows下载Graphviz,解压到一个路径下,然后把其bin目录加入到环境变量中。在cmd中dot -V来验证是否可以使用dot编译了。

Linux请使用系统自带的包管理程序来安装atp-get install graphviz,和Windows同样的验证方法。

自动安装插件不兼容Windows

打开Package Control来搜索了一下graphviz,还真的发现了一个插件GraphvizPreview。于是安装它,发现并不能用。使用快捷键win + shift + g 出现

Graphviz: Could not open PDF, only works for Mac… fork this repo for your OS!’

什么情况,插件只能支持Mac,不支持Windows。

上官方的github的issue搜索看了下,有人已经提交了Windows版本的修复,可是Package Control的版本还是很老的,没有把master的版本进行更新。所以通过release版本下载的是2014年4月份的v0.1.1版本,而Windows的修复版本是在2015年2月份。

所以只能通过下载master来进行手动安装。

手动安装步骤

第一步:下载https://github.com/munro/SublimeGraphvizPreview/archive/master.zip 第二步:打开Preferences -> Packages Settings -> Packages Control -> Settings User,来确认一下installed_packages没有GraphVizPreview。并且增加"remove_orphaned": false防止Sublime Text 把手动安装的插件包给删除了。

{
    "bootstrapped": true,
    "in_process_packages":
    [
    ],
    "installed_packages":
    [
        "EncodingHelper",
        "Package Control",
        "Theme - Spacegray"
    ],
    "remove_orphaned": false
}

第三步:打开Preferences -> Browse Packages...进入到Sublime Text的插件包下Packagas

第四步:解压zip文件到Packagas下,并且更改文件夹SublimeGraphvizPreview-masterGraphVizPreview

第五步:重启Sublime Text。

效果图预览

参考

分类: 实用技巧

sudo保持前用用户的env环境变量

在虚拟机里安装了一个Ubuntu,在局域网下,需要设置代理才能访问网络和安装程序。很自然的给sudo vim /etc/bash.bashrc添加代理。

# 设置代理
export http_proxy=http://web-proxy.oo.com:8080
export https_proxy=http://web-proxy.oo.com:8080
export no_proxy=localhost,.oo.com,.local

然后很愉快的sudo apt-get update发现根本无法连接服务器。如果切换到sudo su的root用户下,是可以的执行的。

研究了半天,原来是sudo在切换成root用户的时候,env并不会去保留这些环境变量,需要特别的指明才可以。

通过visudo命令来设置,需要保留的环境变量,新增下面的第10行。Defaults env_keep="http_proxy https_proxy ftp_proxy no_proxy DISPLAY XAUTHORITY"。这样就可以继续愉快的访问网络了。

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        env_keep="http_proxy https_proxy ftp_proxy no_proxy DISPLAY XAUTHORITY"
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

友情提示。只能通过visudo命令来更新,不能修改/etc/sudoers文件,会被覆盖的。

分类: 未分类

发现一个漂亮的IDE皮肤spacegray

偶然经过WEB开发的座位,发现的他的编辑器很漂亮,问了一下是什么编辑器。原来是Sublime Text,求问是什么皮肤,回答是spacegray

Sublime Text 中的spacegray

sublime text spacegray theme

sublime text spacegray theme

个人在皮肤上做了一些设置。使得更适合我

{
    "color_scheme": "Packages/User/base16-eighties.dark (SL).tmTheme",
    "theme": "Spacegray.sublime-theme",

    "highlight_line": true,

    "spacegray_sidebar_font_xlarge": true,
    "spacegray_sidebar_tree_large": true,
    "spacegray_tabs_auto_width": true,
    "spacegray_tabs_font_large": true,
    "spacegray_tabs_xlarge": true,

    "line_padding_bottom": 3,
    "line_padding_top": 3
    ....
}

获取地址:http://kkga.github.io/spacegray/

jetbrains系列中的spacegray设置

spacegray-pycharm 经过我修改后的样式

spacegray-pycharm 经过我修改后的样式

我是从https://github.com/abhimanyusharma003/phpstorm-spacegray上面下载,并根据自己的喜好做了一些变化的。因为默认的颜色有的地方感觉不好看。

我的变更:

  • 当前光标行高亮
  • 选中文字颜色默认是白色,我把它去除了
  • 选中的背景色太亮,把它调的更灰一些。
  • 普通变量文字颜色太灰,和注释的一些灰,不好区分,调的更白色一些

我的配置设置下载myspacegray-pycharm.jar

另外还有一个ocean的皮肤我也觉得很漂亮,http://www.ideacolorthemes.org/themes/96/但是有些颜色也不容易区分。

从jar包导入配置的方法

jetbrains系列从jar包导入配置的方法。

  1. 选择编辑器FileImport Setting
  2. 重启
  3. 在设置中EditorColors and fonts,选择一个主题

分类: Programming

uwsgi python home设置

运行uwsgi,发现500错误,一看uwsgi的log。

ImportError: No module named random

一看就奇怪了,标准的python的类库,怎么就不支持呢?

一看原来以前的uwsgi配置里面有个,现在没有了。

./uwsgi ./uwsgi.ini -H /usr/local/services/python

增加一个PYTHONHOME的环境变量,

export PYTHONHOME=/usr/local/services/python

就可以把这个配置给取消了。

因为这个python不是标准的安装,所以这些都没有设置。

git与svn 共舞

Git好用,但无奈历史原因,整个项目还得继续使用svn,但是又想使用Git的特性,所以尽力地去追求Git与svn的协作。

git svn命令

Git 中所有 Subversion 桥接命令的基础是 git svn 。所有的命令都从它开始。相关的命令数目不少,本文不过多介绍git svn的命令使用,只简单的说明一下最常用的几个,更多的知识参考书记pro git。

整理用户名与Email的映射

在 Subversion,每个提交者在都在主机上有一个用户名,记录在提交信息中。如果想让已有的信息更好的映射到 Git 作者数据里,则需要 从 Subversion 用户名到 Git 作者的一个映射关系,因为Git是用邮箱来标识一个提交者的。建立一个叫做 user.txt 的文件,每行一条svn作者 = 作者昵称 <邮箱地址>,用如下格式表示映射关系

schacon = Scott Chacon <schacon@geemail.com>
selse = Someo Nelse <selse@geemail.com>

SVN代码的所有提交者的作者名可以通过以下命令获得:

svn log --xml | grep "^<author" | sort -u |  \
         awk -F '\<author\>' '{print $2}' | awk -F '\</author\>' '{print $1}' > user.txt

得到以下文本,然后根据以上的格式编辑作者的邮件信息等。

schacon
selse

这样我们的把有svn的提交记录的作者、邮箱user.txt都准备好了,接下来就克隆svn的地址。

克隆svn的trunk到本地

git svn clone http://example.com/path/to/project-x/trunk   \ 
              --authors-file=users.txt  project-x
  • http://example.com/path/to/project-x/trunk是svn的项目地址,这里用了trunk的目录。
  • --authors-file=users.txt是指明svn的作者信息,git要用到。
  • project-x是文件夹名字
  • --no-metadata参数可以不要svn的信息,适合迁移的时候使用,不适合git svn共用,见下面的小节

如果你的项目很大,这一步是非常缓慢的。因为Git会去把整个提交记录遍历过去,然后对svn的每次提交多做一个补丁,产生一个git提交。特别是到了84000的时候感觉是假死的情况,其实只要慢慢等待就可以了。

no-metadata去除不爽的git与svn的关联信息

使用这个参数,请认真阅读本片段。

如果没有使用 --no-metadata来克隆svn项目,那么如果输入git log将会看到一堆“没用的东西”:

commit 37efa680e8473b615de980fa935944215428a35a
Author: schacon <schacon@4c93b258-373f-11de-be05-5f7a86268029>
Date:   Sun May 3 00:12:22 2009 +0000

    fixed install - go to trunk

    git-svn-id: https://my-project.googlecode.com/svn/trunk@94 4c93b258-373f-11de-
    be05-5f7a86268029

如果使用--no-metadata参数,那么得到的提交信息是这样的:

commit 03a8785f44c8ea5cdb0e8834b7c8e6c469be2ff2
Author: Scott Chacon <schacon@geemail.com>
Date:   Sun May 3 00:12:22 2009 +0000

    fixed install - go to trunk

是不是变得清爽了呢?那么git-svn-id这个东西到底是做什么用的呢?

原来git-svn-id是记录git的提交与svn的提交的关联关系。如果没有这个,那么你只能在git上的提交,无法提交到svn。

建议:如果是你想向svn提交,那么不要使用这个参数。如果你只是迁移svn的历史记录到Git中,那么请开启这个参数。

设置Git的参数

之前我们把svn的代码拉取到本地来了,接下来要设置一下远程仓库的配置

cd project-x

# 设置远程仓库的url地址,如果你的是ssh的方式,又可能不一样了。
git remote add origin http://git.code.com/url/project-x.git

# 设置git的提交用户名和邮箱
# --global参数是全局设定,如果是想当前项目设置,那么去除这个参数
git config --global user.name youname
git config --global user.email email@email.com

从svn获取更新

刚刚我们git svn clone下载了svn的源码,但是如果有人提交了svn的代码,那么我们这个时候还要继续拉取svn的代码。

# 从svn拉取代码。这个事实拉取代码到本地,并没有合并到本地的分支来。
git svn fetch
git checkout master
git svn rebase
# svn update = git svn fetch + git svn rebase

这里检出master分支,去做一次拉取svn并合并代码的操作,理想的情况下使用其他的分支,不一定是master分支。 然后用rebase把提交记录应用到分支上,构成一个线性的提价记录。

我有好多个分支怎么办?

我们一开始都默认值选择了一个分支,我如果想获取多个分支怎么处理呢?

向svn提交代码

假设你在分支feature分支上做开发,没有提交到master分支上。那么有两种方法提交到svn。

  • 保留feature分支所有的提交记录
  • 压缩feature分支的提交记录,变成一个提交记录。

保留个人的提交记录

svn和git分支概念不一样,你要把git的提交推动到svn的代码库中也非常的简单。只需要使用rebase命令到跟踪svn的那个分支上就可以了。然后执行dcommit提交到svn服务器。

git checkout master  # 先拉取svn的代码
git svn rebase
git checkout feature123  # rebase 到master分支上
git rebase master
git checkout master
git merge feature123   # 使用fast-forward合并,让master指针指向最新的提交
git svn dcommit        # 推送到svn服务器

压缩个人的提交记录

和上一种提交没有什么区别。唯一的区别就是在如果你拉取了一个分支feature123,并且没有人在master上面做任何的提交,那么可以使用merge来进行fast-forward快速合并(这样子是不会压缩为一个提交记录的)。然后提交到服务器。

另外一种情况是,他人在svn的分支上提交代码了,你也在master的基础上提交代码了。这个时候git没办法进行fast-forward快速合并,只能进行merge 三方合并。这个时候会把之前的提交记录变成一个提交。然后推送到服务器上。

git checkout master  # 先拉取svn的代码
git svn rebase
git merge feature123     # 这里可能是fast-forward合并,也可能是三方合并。
git svn dcommit          # 推送到svn服务器

使用心得

git与svn协同,这种方式用的比较麻烦,又要使用svn又要使用git。只是有这种需求的人,都是项目还在svn管理。建议将整个项目使用git提交信息,但是最后推送到svn的tag目录下。

参考

分类: 实用技巧

laravel session的使用,填一下坑

用Laravel开发应用,把原有的代码copy过来,以前的代码session使用了$_SESSION,本以为移植过来可以很好的运行的,因为没有依赖其他的组件,结果出现了这个

Undefined variable: _SESSION

Laravel的session的配置文件配置在 app/config/session.php 中,使用时可以看看 session 配置文件中可用的选项设定及注释。

Laravel 默认使用 file 的方式来实现 session的。她并不用php原生的$_SESSION(php原生的session要看php.ini的位置),所以忽略php相关的session函数,例如session_start(), $_SESSION。Laravel在运行过程中会在app/storage/session/目录写入session的信息,所以这个目录需要有写权限,否者session就无法写入成功。

Laravel除了使用默认的file作为session的实现,还支持cookie, Memcached, Redis数据库的后端驱动作为session的实现。必要的时候还需要自己实现一个session的实现方式,比如在微信公众账号和用户的交互,这中session就无法直接使用,因为每次都是微信服务器来请求,无法通过请求的来源来辨别用户。

laravel的session简要API

Session的API还是比较简单的,大家看看中文文档也大概知道是怎么个意思。但是有那么几个还不太好理解。

//session的永久保存(在不过期范围内)
Session::put('key', 'value');

//等同于PHP的原生session
$_SESSION['key'] = 'value';

//get操作
$value = Session::get('key', 'default');

//去除操作并删除,类似pop概念
$value = Session::pull('key', 'default');

//检测是否存在key
Session::has('users');

//删除key
Session::forget('key');

这个对应只要session不过期,基本上是永久保存,下次http请求也是存在的。不同于下面的flash概念。

laravel的session中flash概念

但是Laravel出了个快闪flash的概念,把我一下子给搞混了。这个flash两次请求有效(本次和下次请求有效),与本次请求取操作多少次无关。

//保存key,value
Session::flash('key', 'value');

//取值方法还是一样的
Session::get('key');

//刷新快闪数据时间,保持到下次请求
Session::keep(array('username', 'email'));

这个flash的概念和上面的put的概念不太一样。

  • put :这个对应只要session不过期,基本上是永久保存,下次请求也是存在的。
  • flash :保存的值,本次请求可以使用,下次http请求可以使用,再下一次就不存在了。

也就是说下一次的请求用完就被销毁了,不会让session的值变的越来越大,可以保存一些临时的数据。

这中情况的使用场景比如有:

  • 用户请求了页面,出现错误信息,重定向到一个新的页面,需要展示之前的数据。(虽然可以通过url参数来传递,处理不好可能会有xss漏洞)。
  • 用户访问了一个页面,过滤器发现没权限,保存当前页面url,重定向到登录页面,登录成功,取出值,重定向到原先的页面。(这里可能需要刷新保存的快闪数据)

session落地的时间

我天真的以为使用了Session::put函数就能保存这个变量了。于是我的代码这样写:

class LoginController {

    public function login(){
        Session::put('key','value'); 
        print_r( Session::all() ); //取出来看看是否put成功
        exit;   //习惯性的调试都exit,不执行后续代码
        //return Redirect::to(/); 框架在return后还会有后续的代码执行的
    }
}

结果下次请求就是找不到本次的Session,而且看app/storage/session目录就是没有文件生成。总感觉不对劲啊。

后来看到网络上有个方法Session::save(),于是我也用了下,居然发现成功的生成了session的文件。于是我感觉到,Laravel不用php原生的session,那么在controller之后应该做了一些事情,将session写入到文件中,而不是每次put操作都写操作,这样会IO操作太频繁的,影响性能的。

查看调用相关的代码。laravel编译后,在bootstrap/compiled.php

class Middleware implements HttpKernelInterface
{
    ...
    public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
    {
        $this->checkRequestForArraySessions($request);
        if ($this->sessionConfigured()) {
            $session = $this->startSession($request); // 启动session
            $request->setSession($session);
        }
        $response = $this->app->handle($request, $type, $catch); // 调用controller的method
        if ($this->sessionConfigured()) {
            $this->closeSession($session);         //关闭session
            $this->addCookieToResponse($response, $session);
        }
        return $response;
    }
    ...

    protected function closeSession(SessionInterface $session)
    {
        $session->save();    // 保存session
        $this->collectGarbage($session);
    }
}

小提示:如果不知道函数调用情况,可以在controller中throw new Exception();,然后在/config/app.php的debug更改为debug=>true。可以看到函数的调用关系。

可以看见,在调用完controller之后,调用了session->save()的方法,来主动的保存session。这样session才能落地保存起来,如果在controller或者view里面写了exit;,那么session是不会被保存的,除非主动的写Session::save()才能手工的保存起来。因此在debug调试的时候千万要注意啊。

分类: PHP

mysql执行SQL导出数据

访问MySQL数据库除了可以使用phpmyadmin、第三方数据库客户端,也可以使用命令行的MySQL客户端,因为敲命令不太方便,所以被很多人给抛弃呀。

但有时候没办法,phpmyadmin不能用,只能使用命令行模式了,不过用多了,感觉命令行的也不错,除了写SQL比较慢。

基本命令

mysql -h hostip -P port -u usernmae -p passwd dbname -A
    -h mysql的ip
    -P 端口
    -u 用户名
    -p 密码
    dbname 数据库名    直接进入数据库,不用use dbanem了
    -A   ,--no-auto-rehash 不自动重新进行哈希运算。
               该选项使mysql启动得更快,但果你想要完成表和列名,你必须发出rehash命令。

登录MySQL

# 访问本地的test数据库 
mysql -h127.0.0.1 -P3306 -uroot -proot test  -A     

对数据库执行sql文件,导入数据

# 执行sql.sql文件,一般做导入数据使用
mysql -h hostip -P port -u usernmae -p passwd dbname < sql.sql

执行sql导出数据到文件

# 执行sql.sql文件里的sql语句,然后将数据导出到/tmp/data文件中
# 数据tab分隔,没有列名
cat sql.sql | mysql -h hostip -P port -u usernmae -p passwd dbname > /tmp/data

导入excel使用tab分隔数据就可以了。

将MySQL交互的文本保存到文件

# 将mysql客户端输出的文本保存到文件
mysql> tee /tmp/textdata  # 设置要保存的文件
Logging to file '/tmp/textdata'
mysql> select * from user;
cat /tmp/textdata

这样在/tmp/textdata就可以看到刚刚输出的文本,通过这种方式也能导出数据。

分类: Programming

« 较早的 文章

Copyright © 2016 东东东 陈煜东的博客 粤ICP备13059639号-1

SITEMAP回到顶部 ↑