`学习笔记`分类下的文章

学习笔记

mysql中几种Log和打开方法

Mysql中常见的log有:错误日志log_error慢查询日志slow_query_log二进制日志bin_log通用查询日志general_log

错误日志(error_log)

这个日志记载mysql服务器的启动和关闭以及运行过程中发生的故障或异常情况,如果你发现mysql无法正常启动,那么你首先应该查看这个日志。

配置:

1
log_error = error.log

服务器上查询log位置:show variables like 'log_error'

慢查询日志(slow_query_log)

为了改善数据库性能,需要减少慢查询SQL的使用次数,那么哪些SQL需要改善呢?通过这个日志可以更清楚如何去改善。

配置:

1
2
3
slow_query_log = 1
lone_query_time = 10
slow_query_log_file = slow_query.log

二进制查询日志(bin_log)

Mysql的binlog日志作用是用来记录mysql内部增删改查等对mysql数据库有更新的内容的记录(对数据库的改动),对数据库的查询select或show等不会被binlog日志记录;主要用于数据库的主从复制以及增量恢复。

配置:

1
log_bin = mysql_bin.log

通用查询日志(general_log)

会记录mysql运行期间的所有sql语句

配置:

1
2
3
log_output=[none|file|table|file,table]  #通用查询日志输出格式
general_log=[on|off] #是否启用通用查询日志
general_log_file[=filename] #通用查询日志位置及名字

阅读剩下更多

默认配图
学习笔记

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:”

阅读剩下更多

默认配图
学习笔记

【干货】本地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属性中(没有做逆处理)–>渲染页面,渲染的页面源码如下:
  

阅读剩下更多

默认配图
学习笔记

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

阅读剩下更多

默认配图
学习笔记

Learning-Markdown

MarkDown的学习

这里面就是一些简单的MarkDown语法,提供给我自己看一下,刚开始还是需要不断练习来接受这种语法,必然能够在码字的过程中体验乐趣!

下面开始啦:

阅读剩下更多

默认配图
学习笔记

我是如何将mac OS X(10.11.6)的PHP版本升级到5.6.29的


由于项目和学习的需要,本机曾经升级到了5.5.38已经不够折腾了,所以时候升级一波5.6了(没必要到7的时候,我是不会去升级的)。
首先直接去搜索引擎找便捷的方法呗,直接就选中了一款来自“简书”的文章,因为它就简单的一条命令:

1
curl -s http://php-osx.liip.ch/install.sh | bash -s 5.6

看到这个地址,我心里就放心了!因为上一个版本也是liip的。
我首先看了一下这个install.sh的内容,确定没有什么危险,里面其实就是检测一下设备的系统版本和cpu类型是否可以升级。
环境检测没问题就去下载了一个叫做“packager.tgz”的压缩包,然后解压,运行里面的pythony脚本。

1
2
#TYPE = 5.6-10.10
sudo packager.py install $TYPE-frontenddev

阅读剩下更多

默认配图
学习笔记

You have new mail - Mac OS

奇了怪了,莫名其妙!平时打开终端都没怎么注意,今天发现打开终端的时候,除了常规的上次登录提示,居然有一句“You have new mail”紧接着在下面出现了。
平时都不用自带的邮件.app的 打开邮件,却没有啥。
好的,本着好奇的心理,开始摸索。

阅读剩下更多

默认配图
返回顶部