Etag Cache-Control Expires Last-Modified 这四者的区别?
答:Ctrl+F5 强制刷新,不使用本地cache,故对上述四者均无效。
F5 对Etag(If-None-Match)和Last-Modified(If-Modified-Since)有效,会向服务器发起询问文件是否过期,如果没有过期会返回304,如果过期会返回200
Expires 只对通过链接跳转和通过地址栏“转到”按钮有效。这样不会像服务器发起询问,只会扫描本地cache并返回给浏览器。这样速度是最快的。
Cache-Control用来记录max-age,这种标记是在HTTP1.1中出现的,用来弥补本地时间和服务器时间的不同导致缓存失效,max-age依据本地时间来进行cache,这样有效的保证了过期时间的确定性
sendfile--->直接将文件所在磁盘的特定部分传送给客户端的socket描述符
APC -->opcode缓存:(php.ini:apc.cache_by_default=on)是php转换后的解释代码直接做cache,这样做性能非常好。
Xcache
Xdebug-->WinCacheGrind(一款可以读取xdebug输出的profiler信息的工具)
Apache缓存
--> mod_disk_cache 和 mod__mem_cache(官方已放弃,原因为apache多进程模型下共享内存缓存的开销较大)
-->apache缓存可以识别:Last-modified 和expires
--> 可以通过设置:CacheIgnoreHeaders Set-cookie来避免有cookies的页面形成cache。
-->缓存文件描述符,apache可以通过:CacheFile /data/www/index.html 的方式来指定在apache cache中记录文件描述符,提升查找文件的速度。(当文件更新后,必须重启apche才能刷新cache。)
提高web服务和mysql服务在同一台主机上的性能:
通常教科书是让我写
mysql_connect("127.0.0.1","xxxx","xxxx");
是的这样的连接方式是在同一台主机上形成tcp连接,但是这样的tcp握手是非常消耗资源的。我们为何不用mysql的另外一种连接方式socket来提升php与mysql的连接性能呢?
PHP手册中有提到socket的连接方式:
// we connect to localhost and socket e.g. /tmp/mysql.sock
//variant 1: ommit localhost
$link = mysql_connect('/tmp/mysql', 'mysql_user', 'mysql_password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully';
mysql_close($link);
// variant 2: with localhost
$link = mysql_connect('localhost:/tmp/mysql.sock', 'mysql_user', 'mysql_password');
if (!$link) {
die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully';
mysql_close($link);
?>
Note:只要将 server 指定为 "localhost" 或 "localhost:port",MySQL 客户端库会越过此值并尝试连接到本地套接字(Windows 中的名字管道)。如果想用 TCP/IP,应该用 "127.0.0.1" 代替 "localhost"。如果 MySQL 客户端库试图连接到一个错误的本地套接字,则应该在 PHP 配置中设定 MySQL 的正确路径并把 server 留空。
从这里可以知道写成localhost php还是会自动连接套接字,如果写成127.0.0.1的话就用TCP/IP模式连接了
对于静态网页可以从以下几点进行优化:
1. 支持epoll
2. 非阻塞I/O
3. 异步I/O
4. 使用sendfile系统调用
5. 单进程
6. 使用高速磁盘
7. 使用RAID分区
8. 购买足够的带宽
MySQL一些小记:
innodb_flush_log_at_trx_commit:
0: Innodb 中的Log Thread 每隔1 秒钟会将log buffer中的数据写入到文件,同时还会通知文件系统进行文件同步的flush 操作,保证数据确实已经写入到磁盘上面的物理文件。但是,每次事务的结束(commit 或者是rollback)并不会触发Log Thread 将log buffer 中的数据写入文件。所以,当设置为0 的时候,当MySQL Crash 和OS Crash 或者主机断电之后,最极端的情况是丢失1 秒时间的数据变更。事务提交后不立即将事务写入磁盘,而是每隔一秒写入磁盘一次,并刷新到磁盘,同时更新数据和索引。mysql崩溃内存中的事务日志缓冲区最近一秒的数据将会丢失,无法恢复。
1: 这也是Innodb 的默认设置。我们每次事务的结束都会触发Log Thread 将log buffer 中的数据写入文件并通知文件系统同步文件。这个设置是最安全的设置,能够保证不论是MySQL Crash 还是OS Crash 或者是主机断电都不会丢失任何已经提交的数据。
2: 事务提交后立即将事务日志写入磁盘,但是不刷新磁盘,而是每隔一秒刷新到磁盘一次,同时更新数据和索引,这种情况下mysql crash后数据是可以恢复的,但是系统挂了就恢复不了最后一秒的数据。
写入磁盘:表示写入物理内存中的内核缓冲区。
刷新磁盘:表示将内核缓冲区的数据真正写入磁盘。
增加mysql线程数量:my.cnf--->thread_cache_size=100 增加到100个线程