在使用Java和C#等语言作为Server端语言时,常常需要考虑多用户并发访问的问题,特别是我们经常会用到单例模式,所有的用户都会访问同一个实例,这个时候必须对修改实例状态的并发操作做同步,保护那些临界资源。那么在PHP中如何呢?最近由于需要实现一个系统运行时切换数据库的需求,特别实验了一下Apache+PHP(LoadModule方式),时对于多用户并发访问的支持以及是否支持内存缓存数据的试验,记录一下实验的过程和结果。
实验思想很简单,模拟一个耗时操作,在多用户并发访问的环境下查看各个用户的执行时间片。
1.书写例程:
做成一个测试用的PHP文件代码如下:
<?php //为了测试是否多个用户访问的时候这个值是公用的,即:是否临界资源 $count = 0; //循环十次,消耗十秒,模拟一个费时操作 for ($i=1; $i<=10; $i++,$count++) { echo getTime()." i is $i and count is $count.</br>"; sleep(1); } /** * 获得当前时间,返回字符串,包含毫秒数 * 格式:yyyy-MM-dd HH:mm:ss.fff */ function getTime() { $currentTime = Date('Y-m-d H:i:s');//Get currentTime str $milisecond = microtime(); $splitmiliTime = explode('.', $milisecond); $milisecond = $splitmiliTime[1]; $milisecond = substr($milisecond, 0,3); $currentTime = $currentTime.'.'.$milisecond; return $currentTime; } ?>
2.把上面做成的文件Copy到Apache的发布目录(一般是Htdocs,但是可以配置)
3.打开两个浏览器同时访问发布PHP页面
分别得到如下结果
浏览器1
2013-03-25 14:55:42.128 i is 1 and count is 0. 2013-03-25 14:55:43.138 i is 2 and count is 1. 2013-03-25 14:55:44.152 i is 3 and count is 2. 2013-03-25 14:55:45.169 i is 4 and count is 3. 2013-03-25 14:55:46.180 i is 5 and count is 4. 2013-03-25 14:55:47.194 i is 6 and count is 5. 2013-03-25 14:55:48.208 i is 7 and count is 6. 2013-03-25 14:55:49.222 i is 8 and count is 7. 2013-03-25 14:55:50.236 i is 9 and count is 8. 2013-03-25 14:55:51.250 i is 10 and count is 9.
浏览器2
2013-03-25 14:55:41.286 i is 1 and count is 0. 2013-03-25 14:55:42.296 i is 2 and count is 1. 2013-03-25 14:55:43.310 i is 3 and count is 2. 2013-03-25 14:55:44.324 i is 4 and count is 3. 2013-03-25 14:55:45.339 i is 5 and count is 4. 2013-03-25 14:55:46.355 i is 6 and count is 5. 2013-03-25 14:55:47.367 i is 7 and count is 6. 2013-03-25 14:55:48.402 i is 8 and count is 7. 2013-03-25 14:55:49.645 i is 9 and count is 8. 2013-03-25 14:55:50.658 i is 10 and count is 9.
4.结论
从上面的试验结果可以得到如下结论,因为两组测试数据中的时间犬牙交错,两个用户在耗时操作中并没有出现某一个用户长时间占用执行时间片的情况。说明Apache+Php(loadmodule)是支持多用户并行操作的。另外全局变量Count在两个用户同时访问的时候都是以全新的状态出现的,因此Apache+Php(loadmodule)不支持内存缓存数据,也就是说在多用户并发访问的情况下每次访问都会开辟新的内存。那么如果需要对多用户的操作做同步,只能使用文件锁的方式来实现了。