로컬 환경을 이용하여 10만회, 100만회 캐시 읽기 및 쓰기를 테스트해 본 결과는 다음과 같습니다.
환경
<code>W<span>in</span>7 x64 AMD7750双核 内存<span>8</span>G Apache <span>2.4</span>.<span>9</span> PHP <span>5.5</span>.<span>12</span> ts vc11 memcache <span>2.2</span>.<span>7</span></code>
코드
<code><span><?php</span><span><span>function</span><span>convert</span><span>(<span>$size</span>)</span> {</span><span>$unit</span> = <span>array</span>(<span>'b'</span>, <span>'kb'</span>, <span>'mb'</span>, <span>'gb'</span>, <span>'tb'</span>, <span>'pb'</span>); <span>return</span> @round(<span>$size</span> / pow(<span>1024</span>, (<span>$i</span> = floor(log(<span>$size</span>, <span>1024</span>)))), <span>2</span>) . <span>' '</span> . <span>$unit</span>[<span>$i</span>]; } <span><span>function</span><span>cacheFile</span><span>(<span>$key</span>)</span> {</span><span>$dir</span> = <span>'cache'</span>; <span>if</span> (!is_dir(<span>$dir</span>) && !mkdir(<span>$dir</span>)) { <span>throw</span><span>new</span><span>Exception</span>(<span>" can't make dir $dir"</span>); } <span>$filepath</span> = <span>$dir</span> . DIRECTORY_SEPARATOR . sprintf(<span>'%x'</span>, crc32(<span>$key</span>)); <span>if</span> (!(file_exists(<span>$filepath</span>) && (<span>$data</span> = file_get_contents(<span>$filepath</span>)) && !<span>empty</span>(<span>$data</span>))) { <span>$data</span> = date(<span>'Y-m-d H:i:s'</span>); file_put_contents(<span>$filepath</span>, <span>$data</span>); } <span>return</span><span>$data</span>; } <span><span>function</span><span>cacheMem</span><span>(<span>$key</span>)</span> {</span><span>$mem</span> = <span>new</span> Memcache(); <span>$mem</span>->connect(<span>'127.0.0.1'</span>, <span>11211</span>); <span>$data</span> = <span>$mem</span>->get(<span>$key</span>); <span>if</span> (<span>empty</span>(<span>$data</span>)) { <span>$data</span> = date(<span>'Y-m-d H:i:s'</span>); <span>$mem</span>->set(<span>$key</span>, <span>$data</span>); } <span>return</span><span>$data</span>; } <span>$t1</span> = microtime(<span>true</span>); <span>$i</span> = <span>0</span>; <span>$limit</span> = <span>1000</span> * <span>100</span>; <span>//10 万次</span><span>$data</span> = <span>null</span>; <span>while</span> (<span>$i</span> < <span>$limit</span>) { <span>// $data = cacheFile($i);</span><span>$data</span> = cacheMem(<span>$i</span>); <span>$i</span>++; } <span>$timeUse</span> = microtime(<span>true</span>) - <span>$t1</span>; <span>$arr</span> = [ <span>'cost'</span> => sprintf(<span>'%.7fs'</span>, <span>$timeUse</span>), <span>'mem'</span> => convert(memory_get_usage()) ]; var_dump(<span>$arr</span>); </span></code>
결과 10,000개
<code> 花费时间 内存耗费 File <span>1.9</span><span>sec</span><span>250</span>kb Memcache <span>11</span><span>sec</span><span>250</span>kb</code>
결과 100,000개
<code> 花费时间 内存耗费 <span>File</span><span>94</span>s <span>251.18</span>KB Memcache 超时<span>120</span>s 报错 </code>
Memcache 실패 100,000 테스트를 하였는데 오류 메시지는 다음과 같습니다
<code>Warning: Memcache::connect(): <span>in</span> D:\localhost\speed.php <span><span>on</span><span>line</span><span>37</span></span> Warning: Memcache::<span>get</span>(): No servers added <span>to</span> memcache connection <span>in</span> D:\localhost\speed.php Warning: Memcache::<span>set</span>(): No servers added <span>to</span> memcache connection <span>in</span> D:\localhost\speed.php <span><span>on</span><span>line</span><span>41</span></span> Fatal error: Maximum execution <span>time</span><span>of</span><span>120</span><span>seconds</span> exceeded <span>in</span> D:\localhost\speed.php <span><span>on</span><span>line</span><span>38</span></span></code>
결론
memcache
캐싱을 위해 사용되지만 직접 파일 파일 캐싱만큼 빠르지는 않습니다. 이번 테스트를 하는 이유는, 인터뷰에서 이 멤캐시를 캐싱용으로 사용하지 않고 파일파일 캐싱(단일서버)을 직접 사용했다고 답변했기 때문입니다. 그 결과는 기술담당자가 很菜鸟
로 직접 인정받았기 때문입니다. 그런데 이 테스트를 통과했는데, win 상태인데도 Memcahe의 성능이 File만큼 좋지 않은 이유는 무엇입니까?
아니면 제가 테스트한 방식에 문제가 있는 걸까요? 솔루션 default.fu@foxmail.com
저작권: 이 글은 블로거의 원본 글이므로 블로거의 허락 없이 복제할 수 없습니다.
위에서는 Memcache 캐싱이 직접 파일 캐싱만큼 좋지 않다는 것을 소개했습니다. , 관련 내용을 포함하여 PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.