創建一個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慢。