Muxx


  • 首页

  • 归档

  • 标签

  • 关于

  • 搜索

理解OpCache

发表于 2017-11-30

概念

OpCache通过对opcode的缓存和优化来提升php执行速度。在php5.5及以上版本已内置,编译安装时使用—enable-opcache即可。

当解析器完成对脚本代码的分析后,便将他们生成可直接运行的中间代码,也称之为操作码(operate code,opcode).opcode缓存的目的是避免重复编译,减少cpu和内存开销。如果动态内容的性能瓶颈不在于cpu和内存而在于I/O操作,比如数据库查询带来的I/O开销,那么opcode cache的性能提升是非常有限的。

现代操作码缓存器(opcache,apc等)使用共享内存进行存储,并可以直接从中执行文件

开启方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
; 开关打开
opcache.enable=1
; cli缓存开关 默认开启
opcache.enable=0
; 最大缓存的文件数目, 命中率不到 100% 的话, 可以试着提高这个值
opcache.max_accelerated_files=5000
; Opcache 会在一定时间内去检查文件的修改时间, 这里设置检查的时间周期, 默认为 2, 单位为秒
opcache.revalidate_freq=240
; 可用内存, 酌情而定, 单位 megabytes
opcache.memory_consumption=256
; interned string 的内存大小, 也可调
opcache.interned_strings_buffer=8
; 是否快速关闭, 打开后在PHP Request Shutdown的时候回收内存的速度会提高
opcache.fast_shutdown=1
; 不保存文件/函数的注释
opcache.save_comments=0

检查安装

1
2
3
4
5
6
php -v
PHP 5.5.3-1ubuntu2.2 (cli) (built: Feb 28 2014 20:06:05)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies
with Zend OPcache v7.0.3-dev, Copyright (c) 1999-2013, by Zend Technologies

20171130151204709840651.png

清除缓存

通过opcache_reset()函数清除缓存。该函数将重置整个字节码缓存。调用opcache_reset()后,所有脚本将会重新载入并在下次点击时重新解析

注意!通过cli模式和http访问产生的字节码是分开存储的,也就是说在cli下执行opcache_reset只能清除cli模式下的缓存。
如果要在命令行下清除http字节码,可以使用curl

1
2
3
4
5
WEBDIR=/var/www/html/
RANDOM_NAME=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13)
echo "<?php opcache_reset(); ?>" > ${WEBDIR}${RANDOM_NAME}.php
curl http://localhost/${RANDOM_NAME}.php
rm ${WEBDIR}${RANDOM_NAME}.php

参考

使用 OpCache 提升 PHP 性能

dig命令

发表于 2017-11-30

说明

dig,和nslookup作用有些类似,都是DNS查询工具。
dig,其实是一个缩写,即Domain Information Groper。

使用

基本格式
dig @dnsserver name querytype

如果没有设置@dnsserver,那么dig就会依次使用/etc/resolv.conf里的地址作为DNS服务器
type:

  • A 查询A记录
  • CNAME CNAME
  • NS NS记录 表示将子域名交给指定的DNS服务商解析

通过谷歌DNS获取百度的A记录
dig @8.8.8.8 www.baidu.com A

//输出最精简的CNAME信息和A记录
dig www.baidu.com +short
20171129151195709751597.png

//dig非常常用的一个选项,当使用这个选项时,dig会从根域查询一直查询到最终结果,并将整个过程信息输出
dig www.baidu.com +trace

//默认dns查询使用udp,如果想使用tcp
dig www.baidu.com +tcp

参考

http://roclinux.cn/?p=2449

令人头疼的DNS问题

发表于 2017-11-29

问题描述

原本是同事一个项目,特此记录一下。项目部署在阿里云上,项目中会调用公司机器的接口,发现运行日志中间歇性出现500错误。

解析

经过排除法,最终判定是DNS超时导致。那么有什么好的方法呢?同事的做法是这样的。
在项目机器上通过dig命令定期获取对应服务机器的ip信息并保存到/dev/shm/target_site_host.txt,调用接口时读取该文件获取ip,直接通过ip访问。

这里要说一下/dev/shm目录,这个目录和普通目录不同,是放在内存中的,也就是说相当于直接在进行内存操作,所以读取速度非常快,不过缺点是每次机器重启数据都会丢失。同理可以放到redis等内存数据库中。

递归

发表于 2017-11-21

递归

什么是递归

简单说,当函数直接或间接地调用了自己,则发生了递归
递归不一定适用于所有情况,很多情况用迭代比递归更有效,其次,相对来说递归的效率通常要低于迭代得实现,同时,内存占用也会更大。

实现递归的方法

Paul Graham提到一种方法
1.当n是0、1时,结果正确
2.假设函数对于n是正确的,函数对n+1结果也正确

如果两点成立,我们知道这个函数对于所有可能的都是正确的

递归的问题

阅读全文 »

apache虚拟主机空白页的问题

发表于 2017-11-07

直接解答,mac中brew services服务不靠谱,使用brew services restart httpd N次,一次都没重启,坑爹。使用apachectl restart直接操作解决

tcpdump基本使用

发表于 2017-10-30

基本用法

阅读全文 »

设计模式

发表于 2017-10-28

什么是设计模式

设计模式是历经检验的OO设计经验。

设计原则

1.封装变化,将变化的部分取出并封装起来。在
设计系统时,预先考虑哪些地方蔚来可能需要变化,提前代码中加入这些弹性。
2.针对超类型(接口、抽象类)编程,而不是针对实现编程
3.多用组合,少用继承
通过组合建立的系统具有很大弹性,组合用于很多设计模式中
4.为了交互对象之间的松耦合设计而努力
5.类应该对扩展开放,对修改关闭
通过一些聪明的OO技巧允许在不修改原有代码的情况下进行功能扩展
遵循开放-关闭原则通常会引入新的抽象层次,增加代码的复杂度,每个地方都采用开放-关闭原则是一种浪费,也没必要,需要把经理集中在设计中最有可能改变的地方。

阅读全文 »

go结构体的值方法与指针方法

发表于 2017-10-23

碰到的问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
type myHandler struct{}
func (_ *myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello,this is version 2"))
}
func main(){
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("nihao"))
})
mux.Handle("/user", myHandler{})
}

报错cannot use myHandler literal (type myHandler) as type http.Handler in argument to mux.Handle: myHandler does not implement http.Handler (ServeHTTP method has pointer receiver)

阅读全文 »
1…252627…29
Mu

Mu

230 日志
53 标签
© 2021 Mu
由 Hexo 强力驱动
主题 - NexT.Pisces