使用本地的环境测试10万次和 100万次 缓存的读写,测试环境和结果如下。
环境
<code>Win7 x64 AMD7750双核 内存8G Apache 2.4.9 PHP 5.5.12 ts vc11 memcache 2.2.7 </code>
代码
<?php function convert($size) { $unit = array('b', 'kb', 'mb', 'gb', 'tb', 'pb'); return @round($size / pow(1024, ($i = floor(log($size, 1024)))), 2) . ' ' . $unit[$i]; } function cacheFile($key) { $dir = 'cache'; if (!is_dir($dir) && !mkdir($dir)) { throw new Exception(" can't make dir $dir"); } $filepath = $dir . DIRECTORY_SEPARATOR . sprintf('%x', crc32($key)); if (!(file_exists($filepath) && ($data = file_get_contents($filepath)) && !empty($data))) { $data = date('Y-m-d H:i:s'); file_put_contents($filepath, $data); } return $data; } function cacheMem($key) { $mem = new Memcache(); $mem->connect('127.0.0.1', 11211); $data = $mem->get($key); if (empty($data)) { $data = date('Y-m-d H:i:s'); $mem->set($key, $data); } return $data; } $t1 = microtime(true); $i = 0; $limit = 1000 * 100; //10 万次 $data = null; while ($i < $limit) { // $data = cacheFile($i); $data = cacheMem($i); $i++; } $timeUse = microtime(true) - $t1; $arr = [ 'cost' => sprintf('%.7fs', $timeUse), 'mem' => convert(memory_get_usage()) ]; var_dump($arr);
结果 1万次
<code> 花费时间 内存耗费 File 1.9 sec 250kb Memcache 11 sec 250kb</code>
结果 10万次
<code> 花费时间 内存耗费 File 94s 251.18KB Memcache 超时120s 报错 </code>
Memcache 10万次测试失败,报错内容如下
<code>Warning: Memcache::connect(): in D:\localhost\speed.php on line 37 Warning: Memcache::get(): No servers added to memcache connection in D:\localhost\speed.php Warning: Memcache::set(): No servers added to memcache connection in D:\localhost\speed.php on line 41 Fatal error: Maximum execution time of 120 seconds exceeded in D:\localhost\speed.php on line 38</code>
结论
memcache
用来做缓存却还没有 直接File文件缓存快,之所以做这个测试,是因为面试的时候我回答自己并没有使用这个memcache 来做缓存,直接使用File文件缓存,结果直接被技术官认定为是初级程序员
。但我通过这样的测试,虽然是在win下面,可为什么Memcahe性能还不如File ?
还是说我测试的方式存在错误?
2015-8-21 20:52:17
改进后,真的速度快了N倍! 10万毫无压力。17.18 sec
265KB内存
<code>function cacheMem($key) { static $mem = null; if ($mem === null) { $mem = new Memcache(); $mem->connect('127.0.0.1', 11211); } $data = $mem->get($key); if (empty($data)) { $data = date('Y-m-d H:i:s'); $mem->set($key, $data); } return $data; } </code>
回复内容:
使用本地的环境测试10万次和 100万次 缓存的读写,测试环境和结果如下。
环境
<code>Win7 x64 AMD7750双核 内存8G Apache 2.4.9 PHP 5.5.12 ts vc11 memcache 2.2.7 </code>
代码
<?php function convert($size) { $unit = array('b', 'kb', 'mb', 'gb', 'tb', 'pb'); return @round($size / pow(1024, ($i = floor(log($size, 1024)))), 2) . ' ' . $unit[$i]; } function cacheFile($key) { $dir = 'cache'; if (!is_dir($dir) && !mkdir($dir)) { throw new Exception(" can't make dir $dir"); } $filepath = $dir . DIRECTORY_SEPARATOR . sprintf('%x', crc32($key)); if (!(file_exists($filepath) && ($data = file_get_contents($filepath)) && !empty($data))) { $data = date('Y-m-d H:i:s'); file_put_contents($filepath, $data); } return $data; } function cacheMem($key) { $mem = new Memcache(); $mem->connect('127.0.0.1', 11211); $data = $mem->get($key); if (empty($data)) { $data = date('Y-m-d H:i:s'); $mem->set($key, $data); } return $data; } $t1 = microtime(true); $i = 0; $limit = 1000 * 100; //10 万次 $data = null; while ($i < $limit) { // $data = cacheFile($i); $data = cacheMem($i); $i++; } $timeUse = microtime(true) - $t1; $arr = [ 'cost' => sprintf('%.7fs', $timeUse), 'mem' => convert(memory_get_usage()) ]; var_dump($arr);
结果 1万次
<code> 花费时间 内存耗费 File 1.9 sec 250kb Memcache 11 sec 250kb</code>
结果 10万次
<code> 花费时间 内存耗费 File 94s 251.18KB Memcache 超时120s 报错 </code>
Memcache 10万次测试失败,报错内容如下
<code>Warning: Memcache::connect(): in D:\localhost\speed.php on line 37 Warning: Memcache::get(): No servers added to memcache connection in D:\localhost\speed.php Warning: Memcache::set(): No servers added to memcache connection in D:\localhost\speed.php on line 41 Fatal error: Maximum execution time of 120 seconds exceeded in D:\localhost\speed.php on line 38</code>
结论
memcache
用来做缓存却还没有 直接File文件缓存快,之所以做这个测试,是因为面试的时候我回答自己并没有使用这个memcache 来做缓存,直接使用File文件缓存,结果直接被技术官认定为是初级程序员
。但我通过这样的测试,虽然是在win下面,可为什么Memcahe性能还不如File ?
还是说我测试的方式存在错误?
2015-8-21 20:52:17
改进后,真的速度快了N倍! 10万毫无压力。17.18 sec
265KB内存
<code>function cacheMem($key) { static $mem = null; if ($mem === null) { $mem = new Memcache(); $mem->connect('127.0.0.1', 11211); } $data = $mem->get($key); if (empty($data)) { $data = date('Y-m-d H:i:s'); $mem->set($key, $data); } return $data; } </code>
错在你不该在while里写connect...哪有每次都去连接的?
首先,建立一个到Memcached的TCP连接的开销肯定要比打开一个本地文件大,而在你的cli测试中,反复建立了上万次连接,而在Web上(比如PHP-FPM,MOD_PHP),可以使用到Memcached的持久连接,也就是一个PHP-FPM工作进程保持一个Memcached的长连接,用于处理多个不同的请求:
http://php.net/manual/zh/memcached.construct.php
<code><?php $mc = new Memcached('story_pool');</code></code>
其次,操作系统会缓存本地文件到内存(就是Linux上的buffers/cache),读性能肯定是不错的,但是频繁的写性能肯定没有Memcached好,因为Memcached读写操作都保证在内存中完成。
另外,Memcached能实现分布式(由客户端实现,比如PHP的PECL扩展memcached),这个也是本地文件缓存不具备的优势。Memcached的分布式体现在将不同的键保存到不同的服务器上。
http://php.net/manual/zh/memcached.addserver.php
注意:PHP有两个针对Memcached的PECL扩展,一个叫做memcache,一个叫做memcached:
http://php.net/manual/zh/intro.memcache.php
http://php.net/manual/zh/intro.memcached.php
其中基于libmemcached的扩展memcached实现了分布式,而memcache则没有实现。
上面说的对,你的测试方法是错误的,因为memcache已经达到最大连接数了,所以报错
不过我想知道你用的是什么磁盘,SSD or FIO or SAS,IOPS是多少;说明一下,memcache中key最大值为250B,value最大值为1M,一般情况下value大于1M,也就是超过memcache中page的大小时候,memcache也就无能为力了,不过你可以通过更改源代码来实现或者换redis(value最大值512M)
其实也不必测试,memcache数据全部放在内存中,然而内存和磁盘不是一个级别,我们可以分析一下:
1纳秒等于10亿分之一秒,= 10 ^ -9 秒
<code>Numbers Everyone Should Know L1 cache reference 读取CPU的一级缓存 0.5 ns Branch mispredict(转移、分支预测) 5 ns L2 cache reference 读取CPU的二级缓存 7 ns Mutex lock/unlock 互斥锁\解锁 100 ns Main memory reference 读取内存数据 100 ns Compress 1K bytes with Zippy 1k字节压缩 10,000 ns Send 2K bytes over 1 Gbps network 在1Gbps的网络上发送2k字节 20,000 ns Read 1 MB sequentially from memory 从内存顺序读取1MB 250,000 ns Round trip within same datacenter 从一个数据中心往返一次,ping一下500,000 ns Disk seek 磁盘搜索 10,000,000 ns Read 1 MB sequentially from network 从网络上顺序读取1兆的数据 10,000,000 ns Read 1 MB sequentially from disk 从磁盘里面读出1MB 30,000,000 ns Send packet CA->Netherlands->CA 一个包的一次远程访问 150,000,000 ns</code>
我们关注一下内存和磁盘的访问速度,上面是指随机访问,那么相差1000 000倍,但如果是顺序访问的话大约为 7倍
楼主应该好好看看设计模式,你的面试官没说错你。。。可能初级程序员都懂得缓存对象吧。。谁会每次循环都连接一次memcached?
如果用file存的话, 100w 请求,你去看下服务器的硬盘读写。服务器早挂掉了。
磁盘IO延迟和资源开销和文件系统开销也挺大得。
我只想问哈楼主是用什么测出PHP运行时间的?
事实证明 你就是1、2年的初级。 但是当时面试官否认掉你 没跟你讲明原因吗?
还有给你 也是给所有人一个忠心的建议,切忌不要太浮躁! 或是自我膨胀,以当前时间为节点来看,自己永远是井底之蛙,不经历一些事情有可能不会明白。

PHP用于构建动态网站,其核心功能包括:1.生成动态内容,通过与数据库对接实时生成网页;2.处理用户交互和表单提交,验证输入并响应操作;3.管理会话和用户认证,提供个性化体验;4.优化性能和遵循最佳实践,提升网站效率和安全性。

PHP在数据库操作和服务器端逻辑处理中使用MySQLi和PDO扩展进行数据库交互,并通过会话管理等功能处理服务器端逻辑。1)使用MySQLi或PDO连接数据库,执行SQL查询。2)通过会话管理等功能处理HTTP请求和用户状态。3)使用事务确保数据库操作的原子性。4)防止SQL注入,使用异常处理和关闭连接来调试。5)通过索引和缓存优化性能,编写可读性高的代码并进行错误处理。

在PHP中使用预处理语句和PDO可以有效防范SQL注入攻击。1)使用PDO连接数据库并设置错误模式。2)通过prepare方法创建预处理语句,使用占位符和execute方法传递数据。3)处理查询结果并确保代码的安全性和性能。

PHP和Python各有优劣,选择取决于项目需求和个人偏好。1.PHP适合快速开发和维护大型Web应用。2.Python在数据科学和机器学习领域占据主导地位。

PHP在电子商务、内容管理系统和API开发中广泛应用。1)电子商务:用于购物车功能和支付处理。2)内容管理系统:用于动态内容生成和用户管理。3)API开发:用于RESTfulAPI开发和API安全性。通过性能优化和最佳实践,PHP应用的效率和可维护性得以提升。

PHP可以轻松创建互动网页内容。1)通过嵌入HTML动态生成内容,根据用户输入或数据库数据实时展示。2)处理表单提交并生成动态输出,确保使用htmlspecialchars防XSS。3)结合MySQL创建用户注册系统,使用password_hash和预处理语句增强安全性。掌握这些技巧将提升Web开发效率。

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

PHP仍然具有活力,其在现代编程领域中依然占据重要地位。1)PHP的简单易学和强大社区支持使其在Web开发中广泛应用;2)其灵活性和稳定性使其在处理Web表单、数据库操作和文件处理等方面表现出色;3)PHP不断进化和优化,适用于初学者和经验丰富的开发者。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

SublimeText3汉化版
中文版,非常好用

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

Dreamweaver Mac版
视觉化网页开发工具

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。