php同时作为server端和client端(soapclient)的超时时间设置小结

http://blog.sina.com.cn/s/blog_475429950101bt7x.html

场景
A通过HTTP请求B,同时B通过soap请求C(webservice),然后B得到C的返回内容后,再响应回A;

=================================
client A -> server B -> clientA
server B ->server C ->server B
=================================

前提
B为lamp架构
A的请求超时时间为30秒

问题
B的超时时间如何设置

分析:
1 总体原则:

链式结构的超时时间在各子系统设计时,可不考虑网络延迟问题进行设置。
由前端到后端的超时时间呈现递减设计较为合理。
2 设计思路及实现方法
2.1 A的request timeout为30s

实现方法:根据A的实现方法来实现。

2.2 B的执行时间应<30s,暂设置为28s
实现方法1

--php--
ini_set('max_execution_time',28);
set_time_limit(28);

...
--php--
注:针对max_execution_time的计时原来请务必先查看:http://blog.sina.com.cn/s/blog_475429950101btcu.html

实现方法2
vi php.ini
...
; Maximum execution time of each script, in seconds
; http://php.net/max-execution-time
; Note: This directive is hardcoded to 0 for the CLI SAPI
max_execution_time = 28
...

同时注意:执行时间还会受到apache的Timeout指令的影响,此时间一般默认为300s;
关于apache的Timeout指令(更多见:http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/core.html#timeout):
--------------------------------------------------------------------------------
TimeOut 指令
说明 

    服务器在断定请求失败前等待的秒数
语法      TimeOutseconds
默认值      TimeOut300
作用域      serverconfig
状态      核心(C)
模块      core

TimeOut指令用于设置Apache等待以下三种事件的时间长度:
      接受一个GET请求耗费的总时间。
      POST或PUT请求时,接受两个TCP包之间的时间。
      应答时TCP包传输中两个ACK包之间的时间。

我们计划在发展里程中,逐步把它们分别变得更易配置。计时器在1.2版本之前的默认值为1200,而现在已经设置为300了,但对于绝大多数情况来说仍是足够的。没有把它默认值设的更小的原因在于代码里还有点问题:有时发送一个包之后,计时器没有复位。
--------------------------------------------------------------------------------

2.3 B请求C的过程应该<28s,暂设置为26s,这意味着
B通过soap请求C(webservice)时,我没有找到一个总的timeout的设置方法,只找到了soap连接和数据响应分别的设置方案,基于不考虑网络延迟的前提设计思路,将数据响应超时时间设置为26s即可:

--php--
//数据响应超时时间设置
ini_set(' default_socket_timeout',26);      //限制等待aswebservice的响应的最大时间
//可参考 http://cn2.php.net/manual/zh/filesystem.configuration.php#ini.default-socket-timeout

//soap连接超时时间设置
$options = array(
      ' connection_timeout'=>10,            //会使连接请求限定在10秒内,但已连接上的慢速传输不受时间限制
      );
$soap_client=new SoapClient($aswebservice,$options);
--php--

你可能感兴趣的:(php同时作为server端和client端(soapclient)的超时时间设置小结)