多数大学生出来选择的工作和专业无关
首页 > 专业知识

PHP程序加速探索之服务器负载测试

时间:2018-03-13 17:38:50 [来源]:郑州PHP培训学校

   PHP程序加速探索之服务器负载测试

  服务器负载太大而影响程序效率也是很常见的,我们需要对此进行测试。这里我以目前最常用的Apache服务器为例。
  Apache服务器自带有一个叫AB(ApacheBench)的工具,在bin目录下。使用这个轻巧的工具我们可以对服务器进行负载测试,看看在重负荷之下服务器的表现如何。ApacheBench 可以针对某个特定的 URL 仿真出连续的联机请求,同时还可以仿真出同时间点数个相同的联机请求,因此利用 ApacheBench 可帮助我们在网站开发期间仿真实际上线可能的情况,利用仿真出来的数据作为调整服务器设定或程序的依据。
  在命令行下输出:
  ./ab -n number_of_total_requests\
  -c number_of_simultaneous_requests\
  http://your_web_server/your_php_app.php
  例如:
  ./ab -n 1000 -c 50 http://www.domain.com/myapp.phpAB将同时向http://www.domain.com/myapp.php发出50个并发请求,共发出1000次。
  测试结果将可能是这样的:
  Server Software: Apache/2.0.16
  Server Hostname: localhost
  Server Port: 80
  Document Path: /myapp.php
  Document Length: 1311 bytes
  Concurrency Level: 50
  Time taken for tests: 8.794 seconds
  Complete requests: 1000
  Failed requests: 0
  Total transferred: 1754000 bytes
  HTML transferred: 1311000 bytes
  Requests per second: 113.71
  Transfer rate: 199.45 kb/s received
  Connection Times (ms)
  min avg max
  Connect: 0 0 5
  Processing: 111 427 550
  Total: 111 427 555
  myapp.php每秒钟可以处理的请求数为113.71个。将请求数增加,看看服务器能否处理更大的压力。你也需要调节Apache的MaxClients,ThreadsPerChild,MaxThreadsPerChild等参数,基于你的httpd.conf中的MPM模块选择。
  如果你想得到更详细的信息,请到www.apache.org上查阅一些更深入的文档,包括模块和第三方的提高效率的工具。修改httpd.conf后,要重启Apache服务器,然后再用AB测试。你会看到每秒请求数增加或减少。
  记下每次的参数,最后选择最佳效率的那种配置。
  要指出的是,除了AB,还有许多优秀的服务器性能测试软件。另外,如果你的服务器不是Apache,请自行寻找测试方法。
 
  PHP避免表单的重复提交的方法
  你是否遇到过“重复提交”的问题?要解决这个问题其实并不难。这里有一个简单的方法避免同一表单的重复提交。
  首先,我们可以定义一个session变量用来保存一个表单的提交序列号。这里我定义为“$userLastAction”。
  然后在表单里加入一个hidden变量,把值设为$userLastAction+1:
  >
  最后,在处理提交之前判断表单是否已被提交过:
  if($lastAction>$userLastAction and inputIsValid(...)){$userLastAction++; // 序列号加1
  // 处理表单数据
  }
  Avoid multiple form. submissions
  Submitted By: Douglas E. Cook
  Date: 07/26/00 19:46
  Does your database suffer from "duplicate post" syndrome? The cure isn't too difficult. Here is a simple way to prevent users from submitting the same form. multiple times.
  First, declare a session variable to store a serial number for each form. I call mine "$userLastAction." Then, in every form. where duplicate submission is a problem, include a hidden field, and set the value to $userLastAction+1:
  >
  Finally, verify that the form. has not been previously submitted before acting on the submission:
  if($lastAction>$userLastAction and inputIsValid(...)){$userLastAction++; // Increment serial number// Act on form. here
  }
  这只是一个小技巧,用来避免一个表单的重复提交。这样多少可以防止一些灌水的现象,另外有时候由于网络状况等原因用户不知道提交是否成功,也会再次提交同一份表单。
  这个技巧的主要原理是不允许用户回退后再次提交,也就是说回退后修改再提交也是不允许的,而且也不能避免Ctrl-C/Ctrl-V的灌水办法。究竟有没有用,还是看各位站长的喜好了。
  php调用存储过程返回结果集
  php调用存储过程返回结果集,解决can't return a result set in the given context错误的方法需要php调用存储过程,返回一个结果集,发现很困难,找了半天,终于在老外的论坛上找到解决方案,这里本地化一下。
  关键就是两点
  1)define('CLIENT_MULTI_RESULTS', 131072);2)$link = mysql_connect("127.0.0.1", "root", "",1,CLIENT_MULTI_RESULTS) or die("Could not connect: ".mysql_error());下面就可以正常使用了,以下是例子程序。
  define('CLIENT_MULTI_RESULTS', 131072);
  $link = mysql_connect("127.0.0.1", "root", "",1,CLIENT_MULTI_RESULTS) or die("Could not connect: ".mysql_error());mysql_select_db("vs") or die("Could not select database");?>
  $result = mysql_query("call get_news_from_class_id(2)") or die("Query failed:" .mysql_error());while($row = mysql_fetch_array($result, MYSQL_ASSOC)){
  $line = ''.$row["title"].'('.$row["page_time"].')'.'';echo $line;
  printf("\n");
  }
  mysql_free_result($result);
  ?>
  mysql_close($link);
  ?>
 

上一篇:PHP上传图片三个步骤详细分析

下一篇:PHP强制对象类型之instanceof操作符