最近动态

学习笔记

skip-name-resolve可以解决远程连接mysql数据库时候的缓慢或超时

  咳咳,迁了新的机器,全新的机器但是环境还是跟以前一样,基本没变过什么配置。但是远程连接mysql却很慢,甚至10s超时都还没连上!!! 当然,仅仅只是建立连接的时候,连接成功后一切操作都行如流水。

  所以最快最简单的方法就是直接在数据库的配置文件my.cnf|my.ini中添加一行skip-name-resolve来解决。

  其实mysql在用户登录建立连接的时候,会对客户端进行DNS反查,如果遇到服务器的DNS解析出现问题,那么就可能导致客户端迟迟连接不上。此方法可禁止mysql进行DNS反查从而解决了这个问题。

阅读剩下更多

默认配图
学习笔记

Laravel5.5 发送邮件遇到Connection could not be established with host xxxxx

Laravel输出的错误页面如下图:
Laravel异常捕获-mail

服务器:阿里云香港节点(B区) CentOS6.8 64bit

lamp环境:PHP7.2.1

Laravel .env mail部分:

1
2
3
4
5
6
7
8
MAIL_DRIVER=smtp
MAIL_HOST=hwsmtp.exmail.qq.com
MAIL_PORT=465
MAIL_USERNAME=noreply@0x4f5da2.cn
MAIL_PASSWORD=XXXXXXXX
MAIL_FROM_ADDRESS=noreply@0x4f5da2.cn
MAIL_FROM_NAME=noreply
MAIL_ENCRYPTION=ssl

问题发生前景:本地测试完全正常,相同配置在服务器上就被抛出异常。

因为之前遇到过由于端口没有放行而造成无法建立连接的问题,在此问题上我也做了一样的尝试,在安全组配置里面对465端口进行放行(无论是出口还是入口)。但是结果表示并不是这个问题,而我在没有配置放行的情况下,telnet host:port 是通的。

经过大约两天的间接性排查和尝试,最终提交工单咨询阿里,他们给了我处理意见:尝试他们的Demo!

尝试阿里云提供的Demo测试发件是没有问题的,这就令我很纳闷的,于是我去看该Demo是如何建立连接的。

通过一步一步的探索,发现该Demo也是同样使用了stream_socket_client方法来建立连接,那为什么它可以,Laravel内的却不行?说明不是该环境的问题!

问题逐渐定位到了stream_socket_client这个方法上,查询PHP.NET来认识一下它。

1
resource stream_socket_client ( string $remote_socket [, int &$errno [, string &$errstr [, float $timeout = ini_get("default_socket_timeout") [, int $flags = STREAM_CLIENT_CONNECT [, resource $context ]]]]] )

方法描述上,只有一个参数可能会不一样,就是最后那个$context,它是一个Resource,由stream_conntext_create方法创建并返回。

我注意到Laravel中使用的Swift_Mailer所引用的StreamBuffer类中,在stream_socket_client方法前面加上了@符号来屏蔽error,而在下面自己判断来抛出异常。

那么我果断将@符号去掉! 真正的错误爆出来了!!!!

1
2
stream_socket_enable_crypto(): SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed

乍眼一看,证书校验失败????

上面的废话只是简单描述我遇到这个问题是如何应对的

解决方案来了! 既然是走SSL协议(465端口),且程序抛出错误为证书校验失败,那么就去直接搜索有关Laravel/SwitEmailer的证书校验问题。

在stackOverflow上找到两个相关的问题:

  1. localhost and “stream_socket_enable_crypto(): SSL operation failed with code 1”
  2. how to fix stream_socket_enable_crypto(): SSL operation failed with code 1

他们都提出了一个配置:

1
2
3
4
5
6
7
8
9
//	在/config/mail.php中增加

'stream' => [
'ssl' => [
'allow_self_signed' => true,
'verify_peer' => false,
'verify_peer_name' => false,
],
],

然后测试,Bingo!!!

当然,既然是SSL必然使用校验才是最安全的,但是我这里仅满足能够发件即可,至于如何进行证书校验,请移步:使用PHPMailer 中的报错解决 “Connection failed. Error #2: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages:”

阅读剩下更多

默认配图
Linux

Apache设置目录的访问权限(用户名和密码)

  最近重新搞了个阿里云香港ECS用来科学上网,另外使用LAMP一键安装包搭环境,搭建完成后开放云盾端口即可通过IP访问到web默认页,这默认页有些实用的小工具,如:探针、MyAdmin啥的。如图:

  

  然后我想让这默认页只有我自己能看到,其他人最好不要看到,毕竟其他人看到也没啥用,最多给服务器施压而已,然后就想弄个如下图的效果:

  

  下面来讲讲如何实现此效果的步骤,假设需要设置权限的目录(DIR)为”/data/www/default”

  • 修改apache的配置文件(可以是httpd.conf,也可以是具体的vhost的单独配置文件),内容如下:

    1
    2
    3
    4
    5
    6
    <Directory "/data/www/default">
    Options Indexes
    AllowOverride AuthConfig
    Order allow,deny
    Allow from all
    </Directory>
  • 在DIR下新增.htaccess文件,内容如下

    1
    2
    3
    4
    AuthName "sys"
    AuthType Basic
    AuthUserFile /data/www/default/.htpasswd
    require user username
  • 使用Apache的htpasswd创建.htpasswd文件

    1
    2
    /usr/local/apache/bin/htpasswd -c /data/www/default/.htpasswd username
    ##这里会提示你输入两次密码##

  完成上述步骤后,重启Apache即可

阅读剩下更多

默认配图
网络安全

解决Chrome更新到63后.dev/.app后缀域名强制HTTPS的问题

  又是周一,上班的日子总是来的太快,来到公司的第一件事,打开IDE并更新代码库。看看上周做到哪里了,还有什么BUG是待修复的?

  然鹅,意想不到的事情就这么发生了,为什么本地环境访问不了?
请求被拒绝

  localhost能访问,本地服务器没问题;其他的本地域名可以访问,Apache配置没动过应该不是这个问题;试了试公司项目的其他域名,都是同样的报错;然后我注意了一下URL,被加上了https协议,去掉s再回车没解决;换个浏览器,行了?? 好吧,可能谷歌抽风了,我试了清空缓存和浏览历史,完全不行。后来发现问题没那么简单,网上也很难找到相关的结果,发现自己遇到了难题。

  然后我发现了SegmentFault有人问了相同的问题,才在回答里面找到了答案:

Chrome update news

  原文地址:Chrome 63 now forces .dev domains to HTTPS

  既然如此,强大的谷歌对自己拥有的顶级域名(.dev和.app)进行了合法干涉,那么我们也只能认怂了吧。 默默的把原来的.dev改成了.local后缀。

  但是有强迫症的我有点不甘心,相信有很多人跟我一样,都是执着的没事干的人!不找出一个能在chrome上用.dev的后缀的方法,心里面还是稍微有那么一点难受的(^_-!)

  在github上有一个工具:Fishdrowned的自签泛域名证书MacOS用户可以使用我FORK过来的修改版(原作者已做兼容2018/01/02)

  咱们可以自己在本地生成一个xxx.dev的域名证书来直接让TA支持https访问!!!! 具体的使用方法在上面链接有介绍

  服务器端如何配置支持https自行搜索,这里不做解释了。

  最终实现.dev的https访问,如图:

url地址栏

浏览器证书   

阅读剩下更多

默认配图
PHP

Pazzle on array_column

  在PHP中内置的对数组操作的方法(函数)有一个叫做’array_column’的非常实用,它可以用作返回一个二维数组的指定列。

  先介绍一下它!

  好比这样一个用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$students = array(
array(
'id'=>1,
'name'=>'Jerry'
),
array(
'id'=>3,
'name'=>'Tom'
),
array(
'id'=>6,
'name'=>'Lily'
),
array(
'id'=>11,
'name'=>'Bob'
),
);
$student_names = array_column($students,'name');
var_dump($student_names);

输出结果:

1
2
3
4
5
array (size=4)
0 => string 'Jerry' (length=5)
1 => string 'Tom' (length=3)
2 => string 'Lily' (length=4)
3 => string 'Bob' (length=3)

  这样就得到了一个所有名字的数组,想必对于一个PHPER来说并不陌生。但是今天要讲的重点是array_column的另外一个用法,如果给它第三个参数,那么它将以第三个参数对应的数组中的值作为返回数组的键,用例如下:

阅读剩下更多

默认配图
学习笔记

【干货】本地git对应多个远程仓库

当Githuber发现GitOSChina能发布项目演示,想把自己的项目也同步到OSChina上去时,同时维护两个本地仓库或者remote显得太过麻烦

提要

  首先,为本地git仓库添加远程仓库,我们使用命令:git remote add origin [url],这样一来,本地仓库就对应有了一个远程仓库的地址,包括pushfetch源,如下图所示:

remote-v

  但是,我们如何才能做到既能将本地git仓库PUSH到Github,也能够PUSH到OSChina上呢?

  可能有以下方式是你想到的:

  1. 本地创建两个仓库,一一对应(你不嫌麻烦的话的确可行)
  2. 添加多个远程库,即git remote add [another-origin](那每次都要PUSH两次咯?)

  其实,git的一个远程库本来就可以配置成多个地址,即一个origin拥有多个url。

敲黑板了(实现)

  前提条件是,我们已经为本地仓库添加了一个origin远程库(没有添加的自行添加,方法前面说了)。我们现在为本地库继续添加url地址:https://git.oschina.net/anthony_box/hitools.git

  这个命令是:git remote set-url --add origin [url](url替换成如上地址)

set-url

擦黑板了(原理)

  其实该条命令执行就是在git项目的config文件里的[remote "origin"]配置新增一条记录,我们打开config文件看看,输入git config -e(文件路径:[repo]/.git/config):

config-e

  所以说,执行git remote set-url -add origin和编辑config文件,一码子事。

阅读剩下更多

默认配图
学习笔记

神奇的空格符

  当我通过表单提交带空格的数据并保存到数据库,然后通过再次渲染出的页面修改该数据,意想不到的事情发生了,再也不同通过这个值检索到这条数据了。

  首先,我们先写一个PHP的测试文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
if(isset($_POST['model'])){
echo $_POST['model'];
echo "<br>";
echo str_replace(' ','&nbsp;',$_POST['model']);
echo "<br>";
echo urlencode($_POST['model']);
}
?>
<form method='post'>
<input name='model' value='' />
<button type='submit'>ttttt</button>
</form>

  可以看到,这里面有个表单,提交到自己这个页面,然后由PHP获取到POST过来的参数model,第一行直接输出它的值,第二行输出防SQL注入对空格的转化后的值,第三行输出encode之后的值(为什么?我们最后说TA的用途^_^)。

  我们现在试着输入并提交Sumsang S8

结果1

  由此可见,后台获取到的是一个Sumsang+空格+S8,第二行跟上面一样(显示一样,源码不一样),第三行空格变成加号是urlencode后的转义,那么看下源码:

源码1

  当然,很多情况下,为了防止SQL注入,我们会将空格转化成&nbsp;存库,然后取数据的时候在逆回来。


  紧接着,我们模拟数据的修改,基本过程是:从数据库取出这条数据–>填充到input标签的value属性中(没有做逆处理)–>渲染页面,渲染的页面源码如下:
  

阅读剩下更多

默认配图
杂谈

毕业了

转眼间,青春不再年华

  其实,很早就要写这样一篇文章的,只是一直都不知道如何表达,即使现在也还是一样。

  毕业,经历也不止那么一两次了,从来都没有感觉到有什么特别。人们总说,离别是伤感的,因为知道以后的相逢是微乎其微的,因为不知道的,太多了。我从来都没有想到,竟然在我即将离开校园的那一天,舍友一个个从宿舍离开的那一天,我热泪盈眶,竟说不出话来。一想到平日里我们朝夕相处,如今却落得个你南我北他中原。

  正式步入社会,成为万千就业者中的一员,也就是说,我们不得不考虑和选择更多的事情。入京工作已过半年之久,以前从未想过会来京都工作,我永远都会记得每一次面试当面试官问我想去哪个城市工作时,我的回答只强调了一个重点,那就是“除了北京”。原因很简单,离家太远和空气环境差,我更愿意去上海、深圳、成都甚至是长沙。但最终我实习和工作的地方,就是北京。Orz…

  既然来了,便也学会适应并努力完善自我,尽管生存环境不尽人意。相信自己能够在这个不曾向往的地方体现自我价值,创造人生价值。

两年,或许是个新开始

  是的,不管怎么样,我决定至少认真的对待这两年,其实两年对于一个刚刚毕业的菜鸟是很重要的一个过渡期,这意味着今后的路将怎么走,应当展望一个什么样的未来,找到自己所处的位置和自己将要达到的下一个高度。我希望两年后,我会是一个全新的我,完全从现在的自己蜕变而出,所及之处无遗憾,稳而渐入佳境。

总有那么一个时刻,你背负着Newbie的称号。

阅读剩下更多

默认配图
学习笔记

The Problems When Python2.6 to 2.7 on CentOS6.5

当Python从2.6升级到2.7后,pip找不到了?

  对的,基本上都能遇到这个问题。我很暴力的直接去下载一个pip然后用Python去安装它。

1
python setup.py install

  却被告知ImportError: No module named setuptools,想通过yum直接给安装,却出现下图所示:

  没办法,去下载一个setuptools的包自己来装吧(我试过了下载setuptools-35.0.1.zip,这个不适用)。所以下面的这个亲测有效:

1
2
wget https://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg  --no-check-certificate
sh setuptools-0.6c11-py2.7.egg

阅读剩下更多

默认配图
返回顶部