php set_time_limit()用法测试详解「建议收藏」

php set_time_limit()用法测试详解

大家好,又见面了,我是全栈君。

一个php脚本通过crontab每5分钟执行一次,考虑到脚本执行时间会超过5分钟,特意用set_time_limit(290)来控制脚本在290秒退出。某天突然发现后台有多个该脚本的进程在执行,也就是说set_time_limit(290)没有起作用。为了证明,特意使用如下代码测试

 代码如下
1 set_time_limit(5);
2 for ($i = 0; $i < 100; $i++) {

    echo date(‘Y-m-d H:i:s’) . “n”;
    sleep(1);
}

无论是在web还是CLI下,上述脚本并没有在5秒钟后退出。后来加上ini_set(‘max_execution_time’, 5)测试,结果一样。那是不是说明set_time_limit函数根本就没有用呢?其实不然,在 http://stackoverflow.com/questions/5874950/set-max-execution-time-in-php-cli 这里找到根源所在,其实是上面的写法有问题,例如使用下述代码:

 代码如下
1 set_time_limit(5);
2 for (;;) {

}

执行后,大概5秒钟就可以看到”Fatal error: Maximum execution time of 5 seconds exceeded in”类似这样的错误提示。说明set_time_limit是起作用的。现在在去看看官方文档(http://www.php.net/manual/en/function.set-time-limit.php)上关于此函数的说明,在Note中写到:

The set_time_limit() function and the configuration directive max_execution_time only affect the execution time of the script itself. Any time spent on activity that happens outside the execution of the script such as system calls using system(), stream operations, database queries, etc. is not included when determining the maximum time that the script has been running. This is not true on Windows where the measured time is real.

 

 代码如下
1 //set_time_limit(0);
$i=1500;
include (“inc/conn.php”);
while($i>0)
{
$sql=”INSERT INTO php (php)
VALUES (‘$i’)”;
if ($conn->execute($sql)===flase)
{
//echo “数据插入错误”.$conn->errormsg();
}
else
{
$phpid=$conn->Insert_ID();
echo $i.”已经存入数据库,编号:”.$phpid;
}
$i–;
echo ”


“;
}
?>

注意:sleep函数暂停的时间也是不计入脚本的执行时间的。所以也是第一个测试失败的原因。

当你的页面有大量数据时,建议使用set_time_limit()来控制运行时间,默认是30s,所以需要你将执行时间加长点,如 set_time_limit(300)  ,其中将秒数设为0 ,表示持续运行!

如:set_time_limit(0)表示长时间链接运行!

注意:这个函数的运行需要你关闭安全模式,在php.ini中将safe_mode = Off 安全模式设置为Off,否则将会出现下面错误:

Warning: set_time_limit() [function.set-time-limit]: Cannot set time limit in safe mode in

再次注意的是:

在php.ini可以通过定义max_execution_time来设置PHP页面的最大执行时间,比如下面:

 代码如下
1 set_time_limit(900);

这个函数指定了当前所在php脚本的最大执行时间,
虽然设定值是900秒,实际上
最大执行时间=php.ini里的max_execution_time数值 - 当前脚本已经执行的时间 + 设定值
假如php.ini里的max_execution_time=30,当前脚本已经执行10秒,则:
最大执行时间=30-10+900=920秒。

php中设置set_time_limit不起作用的解决方法:

set_time_limit用来设置脚本的超时时间,用法如下:

set_time_limit(秒数); 
规定从该句运行时起程序必须在指定秒数内运行结束, 
超时则程序出错退出. 
但是有时候设置set_time_limit没有效果,set_time_limit函数最好是在linux下执行,windows执行可能也无效 
解决方法: 
修改php.ini里的max_execution_time = 30了。这个默认是30秒,修改为max_execution_time = 300.重新启动apache服务器。这样超时设置为300秒就有提示信息了.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112115.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PyTorch学习之归一化层(BatchNorm、LayerNorm、InstanceNorm、GroupNorm)[通俗易懂]

    PyTorch学习之归一化层(BatchNorm、LayerNorm、InstanceNorm、GroupNorm)[通俗易懂]BN,LN,IN,GN从学术化上解释差异:BatchNorm:batch方向做归一化,算NHW的均值LayerNorm:channel方向做归一化,算CHW的均值InstanceNorm:一个channel内做归一化,算H*W的均值GroupNorm:将channel方向分group,然后每个group内做归一化,算(C//G)HW的均值…

    2022年6月10日
    599
  • 睿智的目标检测7——yolo3详解及其预测代码复现

    睿智的目标检测7——yolo3详解及其预测代码复现睿智的目标检测7——yolo3详解及其预测代码复现学习前言代码下载实现思路1、yolo3的预测思路(网络构建思路)2、利用先验框对网络的输出进行解码3、进行得分排序与非极大抑制筛选实现结果学习前言对yolo2解析完了之后当然要讲讲yolo3,yolo3与yolo2的差别主要在网络的特征提取部分,实际的解码部分其实差距不大。代码下载本次教程主要基于github中的项目https://git…

    2022年6月18日
    37
  • MySQL insert or update sql

    MySQL insert or update sqlMySQL一条sql实现数据保存变更  insertorupdate  ,如果没有执行insert,有就update需要有主键 PRIMARY或唯一索引UNIQUEMySQL中的INSERT…ONDUPLICATEKEYUPDATE语句,该语句是基于唯一索引或主键使用ONDUPLICATEKEYUPDATE后面可以放多个字段,用英文逗号分割。使用…

    2025年6月12日
    2
  • 解决Php控制台和phpinfo版本号不一致问题

    解决Php控制台和phpinfo版本号不一致问题

    2022年2月12日
    50
  • DropDownList绑定及修改

    DropDownList绑定及修改一、DropDownList:1、选项值保存到数据库:Hashtableht=newHashtable();//这里用Hashtableht.Add(“字段名”,DropDownListID.SelectedItem.Text.ToString());//保存选项Textht.Add(“字段名”,DropDownListID.SelectedItem….

    2022年10月16日
    2
  • linux服务器 抓包命令 tcpdump

    linux服务器 抓包命令 tcpdumptcpdump-iany-s0-w/home/tcp.pcap单独总结tcpdump抓包的常用命令主要语法过滤主机/IP:  tcpdump-ieth1host172.16.7.206 抓取所有经过网卡1,目的IP为172.16.7.206的网络数据    过滤端口:  tcpdump-ieth1dstport1234 抓取所有经…

    2022年8月20日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号