生命之中的最大错误在于:终日担心犯错误。— 爱尔伯特·哈伯德 (Elbert Hubbard 1856-1915),《笔记》
Docker是个伟大的发明,以前,运维的理念是软件层次的,现在变成了功能层次的。

以前要开一个网站服务,需要安装php/mysql/nginx,自己编译,需要花时间收集下载地址或者文件,记录编译参数,做成批处理脚本减轻重复操作。好点的方式是有人做了个合集,比如lnmp的包,这个也让人省心不少,还有一些小激动,运行一个命令就安装好了。

如今,docker有各种各样的image,都配置好了软件,需要nginx,下载个nginx的image即可,运行就有,就两句话解决了。
需要php支持,安装一个php的image,一个个软件都变成了功能,自己组装,而且可以快速在另外一台服务器开启,环境是一模一样的,更加重要的是,每个功能都是独立容器运行的,不会威胁到系统安全,这个是非常让运维放心了。

比如,我们手机需要科学上网,几句话就解决了,下面在阿里云安装这个:

第一步,安装并运行docker

yum install docker


第二步,下载ikeV2的image

docker pull gaomd/ikev2-vpn-server


如果提示:
Using default tag: latest
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
可以运行 service docker start

第三步,运行

docker run -d --name ikev2-vpn-server --restart=always --privileged -p 500:500/udp -p 4500:4500/udp gaomd/ikev2-vpn-server


第四步,给iphone生成配置文件,换成自己的域名

docker run -i -t --rm --volumes-from ikev2-vpn-server -e "HOST=vpn.example.com" gaomd/ikev2-vpn-server generate-mobileconfig > ikev2-vpn-iphone.mobileconfig


第五步,把文件放网站,下载安装即可

iPhone里显示的名字比较古怪,需要自定义名字,可以修改mobileconfig里的定义 UserDefinedName,然后再下载
如果连接不上,那可能是阿里云的安全组,编辑vps的安全组,把500和4500的udp开放了即可

天哪,繁琐的IKEV2的安装就变成了几句话,非常的便利。
Tags: ,
从A表选出数据更新A表是不允许的,需要借助中间临时表操作

update table_A set department_id=1425
where user_id IN(
select id from (
select user_id as id from table_B
left join table_A using(m_id)
where l_id=143969
) as tmp
)


联合两个表查询做更新

UPDATE table_A t1 , (
select d_id,count(*) as cnt from table_B
where h_id = 143969
group by d_id
) t2
SET t1.d_cnt = t2.cnt
WHERE t1.d_id = t2.d_id;
如果要管理多个数据库,方便切换,可以在phpMyadmin里直接配置多个数据库
选择即可跳转到相应的数据库
要注意,这是明文保存密码在配置文件里的,所以需要注意安全

复制一份 config.sample.inc.php 为 config.inc.php

/**
* First server
*/
$i++;
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'cookie';
/* Server parameters */
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['AllowNoPassword'] = false;


可以看到这个是基于cookie来验证登录的
我们可以改为config方式,并且加上用户名和密码

/**
* First server
*/
$i++;
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'config';
/* Server parameters */
$cfg['Servers'][$i]['host'] = 'localhost';
$cfg['Servers'][$i]['user'] = 'user';
$cfg['Servers'][$i]['password'] = 'password';
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['AllowNoPassword'] = false;


把user和password配置好即可
复制多个即可增加多个server,同时访问phpMyadmin会出现下拉选择框,选择即可跳转到另外的数据库
在github上发现了个不错的项目
https://github.com/chaegumi/cxpcms

我一直还说着要做一个管理框架来着,有人做了就拿下看看
结果在本地配置好之后,一直都登录提示验证码错误,这个倒是开始怀疑人生了

1 验证码错误?

反复确认了Captcha.php里生成的和我输入的是一致的
然后确认对比流程,发现提交的是对的,但本地读取的是空值
另外查看session目录的文件,每次访问都产生新的session文件
说明session会话根本没有跟踪到,每次访问都是当做新用户看待,所以比对失败

2 那为什么每次都是新的session呢?

CI根据cookie里的ci_session值作为session_id
做了个简单的页面,打印cookie和session,每次这两个值都在变
另外做了个原生页面的,这个值是不会变的

3 那肯定是CI的问题

直接查看文件
system/libraries/Session/Session.php
检查session的处理流程:

    print_r($_COOKIE);
    echo $this->_config['cookie_name'].'//'.$this->_sid_regexp.'//';
    if (isset($_COOKIE[$this->_config['cookie_name']])
      && (
        ! is_string($_COOKIE[$this->_config['cookie_name']])
        OR ! preg_match('#\A'.$this->_sid_regexp.'\z#', $_COOKIE[$this->_config['cookie_name']])
      )
    )
    {
      echo 'del//';
      unset($_COOKIE[$this->_config['cookie_name']]);
    }


调试起来发现,总是进入del的流程,cookie被删掉了
导致后面会重新设置cookie
很明显是这个导致的
preg_match('#\A'.$this->_sid_regexp.'\z#', $_COOKIE[$this->_config['cookie_name']]


4 表达式在做什么

    if (PHP_VERSION_ID < 70100)
    {
      if ((int) ini_get('session.hash_function') === 0)
      {
        ini_set('session.hash_function', 1);
        ini_set('session.hash_bits_per_character', $bits_per_character = 4);
      }
      else
      {
        $bits_per_character = (int) ini_get('session.hash_bits_per_character');
      }
    }
    elseif ((int) ini_get('session.sid_length') < 40 && ($bits_per_character = (int) ini_get('session.sid_bits_per_character')) === 4)
    {
      ini_set('session.sid_length', 40);
    }

    switch ($bits_per_character)
    {
      case 4:
        $this->_sid_regexp = '[0-9a-f]{40,}';
        break;
      case 5:
        $this->_sid_regexp = '[0-9a-v]{40,}';
        break;
      case 6:
        $this->_sid_regexp = '[0-9a-zA-Z,-]{40,}';
        break;
    }


我们看到表达式是 [0-9a-f]{40,} 而cookie长度是26个字符,所以总是不能符合要求
打印出来配置,发现也一直是26,ini_set也不起作用

5 如何修复

我们看到新版本的CI已经修复了这个问题
    // Yes, 4,5,6 are the only known possible values as of 2016-10-27
    switch ($bits_per_character)
    {
      case 4:
        $this->_sid_regexp = '[0-9a-f]';
        break;
      case 5:
        $this->_sid_regexp = '[0-9a-v]';
        break;
      case 6:
        $this->_sid_regexp = '[0-9a-zA-Z,-]';
        break;
    }


简单升级替换system文件夹即可解决

项目更新在 https://github.com/hqlulu/cxpcms
在旧工程里有很多文件是使用了短标签标记php片段
但默认安装的php环境,现在都把短标签关闭
php.ini 里
short_open_tag = OFF


文件里如果有短标签的代码,会不解析的
所以可以做一次批量替换
<\?(?!php|=) 替换成 “注意留个空格,防止 这样的语句
sublime下可以直接替换,命令行sed貌似不支持 ?!修饰符
分页: 1/362 第一页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]

阅读推荐

服务器相关推荐

开发相关推荐

应用软件推荐

排列三计算器 北京pk10官网 北京11选5神奇码 体彩快中彩玩法 山西十一选五推荐号码
双色球大奖 宁夏十一选五第40期 澳彩网 浙江11选5攻略秘籍 爱彩乐 江苏11选5