PHP finally block aborts on autoload

参考: http://stackoverflow.com/questions/26204315/php-finally-block-aborts-on-autoload

Person.php

 

main.php

解决办法:

  1. 升级PHP
  2. 提前加载,如: class_exists(“Person”); 但是,如果Person相关方法执行起来需要自动加载其它类,依然失败,所以,此法基本不可行
  3. 不使用finally

 

docker run 之 -it 选项

docker run -it 的这个选项是啥意思?

一半来讲,如果启动的1号进程是 /bin/bash (或者类似程序)的话, -i 是交互的意思,如果没有 -i 选项,/bin/bash 不需要交互就没事干,会立即退出,然后容器就会退出; -t是分配终端,如果没有-t ,则 docker attach 进去的话,就没法和/bin/bash 进行交互,当然,如果你压根儿不知道attach或者压根儿没用过attach的话,你可能永远不知道这个-t有啥用;

所以说, -it 选项是和 /bin/bash    attach 有直接关系

ssh 慢的问题

解决办法: https://injustfiveminutes.com/2013/03/13/fixing-ssh-login-long-delay/

ssh时候,服务器端可能需要进行域名解析,这个过程可能会比较慢,抓包如下:

 

strace 的部分结果:

查问题的过程:

  1. 问题定位到: dns查询时,一个请求同时查询A记录和AAAA记录而服务器端只返回一个响应所致
    可能是dns不靠谱,也可能是协议定义有缺陷
  2. 一般来讲,dns查询是有底层的libnss实现的,直接使用host 来查询应该也是相同效果吧? 结果不是
    host 查询时发现,A记录和AAAA记录虽然都查询了,但是是两次请求完成的; 看来二者用的库可能不一样
  3. google search “ sshd dns resolve ipv6” 发现文章: https://injustfiveminutes.com/2013/03/13/fixing-ssh-login-long-delay/
    可以通过在/etc/resolve.conf中添加

    来使得A和AAAA分作两次请求; 问题解决
  4. 一般来讲,我们只要使得ssh配置UseDNS no就可以了,但是,我们这里的情况是登录时使用了ldap(通过域名访问)认证,所以,域名解析就避不开了
  5. 遗留问题: 为什么client一次请求查询A和AAAA时,client不能和server好好配合呢?

其他参考: http://xxrenzhe.blog.51cto.com/4036116/1340103

记录salt的一个问题

现象:

cpu使用 接近100%

strace 跟踪结果

 

进程调用栈:

 

从调用栈来看,就算有bug也是libzmq的bug

 

关于redis短连接问题

场景:

PHP通过phpredis(https://github.com/phpredis/phpredis)循环执行如下操作:

 

 

发现connect会出现大量超过1s的情况,甚至超过3s;但是,如下图抓包所示:两次请求之间间隔了3s才发送syn请求,并且没有失败,也就是说,并非syn丢包所致,而是因为某种原因导致根本没有发送syn包;但是外部表现却是connect花费了很多时间(3s);

所以,从此推断,连接超时未必就一定是网络的问题,你们究竟会是什么原因导致client端3s后才发送syn的呢?

 

阅读源码发现: redis的connect用的是php提供的connect方法:php_stream_xport_create

其实,fsockopen用的也是该方法,如此的话,不放通过如下脚本直接测试connect:

结果如下:

  1. connect超过1s的还挺不少的
  2. 前面300多次的时候连续出了好几次超过1s的,你们怎么会从374到13489一直没出错呢?而且,运行程序的时候也能感觉到,从第374到第13489花费时间很短的,难道这个区间根本没有发生真正的连接? strace 跟踪统计发现,确实connect了,就是说,一般情况下,connect是很快的
  3. 该问题可能发生在PHP中,也可能发生在glibc中,也可能发生在系统层面,排查办法:
    1. 写一个C的,如果不出现问题,那么就是PHP的问题;如果依然如此,很可能是系统问题

让go get 支持gitlab

参考文章: https://baokun.li/archives/go-get-proxy/

在你的nginx中添加配置:

注意:修改你自己的域名

另:

  1. 可能你自己的gitlab没有配置https,那么可以给go get 添加 -insecure 选项即可
  2. 可能你的gitlab仓库需要输入用户名和密码,那么你可以改成public的就好了