创建一个tmpfs
mount tmpfs /data/app/www/tmpfs_www/ -t tmpfs -o size=50m
讲php文件放到该目录下,然后对比php执行效果,用xhprof获取运行数据
使用tmpfs
关apc
Total Incl. Wall Time (microsec): 34
Total Incl. CPU (microsecs): 26
Total Incl. MemUse (bytes): 2311
Total Incl. PeakMemUse (bytes):2304
开apc
Total Incl. Wall Time (microsec): 26
Total Incl. CPU (microsecs): 16
Total Incl. MemUse (bytes): 786
Total Incl. PeakMemUse (bytes):798
不用tmpfs
关apc
Total Incl. Wall Time (microsec): 33
Total Incl. CPU (microsecs): 26
Total Incl. MemUse (bytes): 2310
Total Incl. PeakMemUse (bytes):2304
开apc
Total Incl. Wall Time (microsec): 22
Total Incl. CPU (microsecs): 16
Total Incl. MemUse (bytes): 786
Total Incl. PeakMemUse (bytes):798
得出结果,在只读环境中,是否启用tmpfs区别不大,应该和linux的内存管理方式有关
分别进行php读取tmpfs和普通目录的文件测试,
循环100w次file_get_contents:
在tmpfs下的文件
用时28s
在普通目录下的文件
用时29s
100w次file_exists:
tmpfs下
19s
普通目录
20s
100w次file_put_contents,几十字节
在tmpfs下的文件
用时41s
在普通目录下的文件
用时415s
100w次error_log写入指定文件,几十字节
在tmpfs下的文件
用时29s
在普通目录下的文件
用时36s
结论,tmpfs在写入数据时由于是内存操作,会非常快速度
发现file_put_contents和error_log在循环调用写入文件的时候,性能差距非常大。。。
看了下两个函数的源码,都是利用 php_stream_write实现文件写入,但file_put_contents的功能更多,源码里有对锁,stream,数据类型的不同处理,可能是这些原因导致性能比error_log慢。