PHP 的脚本执行时间无效了是什么原因? php5.6 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
raysonlu
V2EX    PHP

PHP 的脚本执行时间无效了是什么原因? php5.6

  •  
  •   raysonlu 2017 年 7 月 13 日 5714 次点击
    这是一个创建于 3104 天前的主题,其中的信息可能已经有所发展或是发生改变。
    php 脚本执行没有了时间限制

    php.ini 里面已设置了 max_execution_time,也尝试过在 ini_set 或使用 set_limit_time,但就是无效,一直不停地执行( apache+php,用浏览器访问,脚本用死循环不报错,循环 echo 时间多少秒都 echo,没有用 sleep )

    网上搜到的都说是因为开启了安全模式,但我用 php5.6,应该是没有了安全模式了吧?

    究竟是什么原因?很疑惑,求指点!谢谢!
    28 条回复    2022-04-28 14:54:56 +08:00
    cxbig
        1
    cxbig  
       2017 年 7 月 13 日
    你这个死循环是经由 Apache 不断的访问某个 PHP 脚本?还是访问一次 PHP 不停的跑?
    如果是前者,max_execution_time 没有意义。
    cxbig
        2
    cxbig  
       2017 年 7 月 13 日
    如果是后者,试着在该脚本输出一下 phpinfo 或者 max_execution_time 看看实际的值。
    raysonlu
        3
    raysonlu  
    OP
       2017 年 7 月 13 日
    @cxbig 后者,实际值是 120,但我做一个 echo 时间测试,发现无效。源码如下:
    $now=time();
    $secOnd= 0;
    while($second<150){
    if(time()>$now){
    $n=time();
    echo ++$second."second";
    echo "<br>";
    }
    }
    studentht
        4
    studentht  
       2017 年 7 月 13 日
    你这段代码很短时间就跑完了把,你设置的 max_execution_time 值为多少?
    raysonlu
        5
    raysonlu  
    OP
       2017 年 7 月 13 日
    @studentht max_execution_time 在 php.ini 里面设置是 120
    raysonlu
        6
    raysonlu  
    OP
       2017 年 7 月 13 日
    经过一些测试,更新一下问题

    分别用 浏览器访问形式 与 服务器命令形式 运行 php 脚本:

    1、max_execution_time 完全无效,上面那段测试代码我设置$second<200,都给我完整输出所有结果不报错;
    2、set_time_limit 在命令形式下生效,附上一句 set_time_limit(10); 用命令执行以下,10 秒后就报错了,但浏览器访问仍然等待 10 秒以上并完整输出结果;

    疑惑仍然持续。。。。
    studentht
        7
    studentht  
       207 年 7 月 13 日
    @raysonlu 你代码又没有 sleep,$second<200 执行起来几秒就够,又不是用 200s
    raysonlu
        8
    raysonlu  
    OP
       2017 年 7 月 13 日
    @studentht 但在浏览器与命令形式上执行,的确是用了这么多时间,特别是命令模式,循环的 echo 是一秒一个现实出来的(注意我的$second 表示的意思应该是次数而不是实际时间的秒)
    jarhom
        9
    jarhom  
       2017 年 7 月 13 日
    满足 time()>$now 这个条件才会输出,也就是一秒输出一次了
    linoder
        10
    linoder  
       2017 年 7 月 13 日
    Web 情况下:

    ini_get 查看 max_execution_time 是否被重新设置
    一般 web 用
    ini_set('max_execution_time', s);

    Cli 情况下:
    没有超时
    只有溢出 或者 中断信号 才会退出
    studentht
        11
    studentht  
       2017 年 7 月 13 日
    我能骂人不?
    if( time()>$now ) 除了第一秒会卡住,后面时 time()总是大于$now 的,有什么问题!
    这段代码执行时间就费时几秒钟,根本不会等到 PHP 执行超时!!!

    PS:
    $n=time();
    这句,$n 是干什么用的?
    raysonlu
        12
    raysonlu  
    OP
       2017 年 7 月 13 日
    @studentht $n 其实是$now,贴上来的时候少改了这里,抱歉了
    cxbig
        13
    cxbig  
       2017 年 7 月 14 日
    @studentht
    和系统相关的操作,包括 sleep(),是不算在 max_execution_time 里的。这里有说明
    http://php.net/manual/en/function.set-time-limit.php
    cxbig
        14
    cxbig  
       2017 年 7 月 14 日
    @raysonlu 你的代码逻辑上没有问题
    我在 Mac 下试的结果,配置用的 5 秒:
    1second
    ...
    5second
    Fatal error: Maximum execution time of 5 seconds exceeded ...
    正常获得错误信息

    要不你在脚本里输出 max_execution_time 再看看?
    var_dump(ini_get('max_execution_time'));
    torbrowserbridge
        15
    torbrowserbridge  
       2017 年 7 月 14 日
    这段代码有点逗。
    raysonlu
        16
    raysonlu  
    OP
       2017 年 7 月 14 日
    @linoder
    @cxbig
    var_dump(ini_get('max_execution_time'));结果是
    string(3) "120"
    zhengwenk
        17
    zhengwenk  
       2017 年 7 月 14 日
    Your web server can have other timeout configurations that may also interrupt PHP execution. Apache has a Timeout directive and IIS has a CGI timeout function. Both default to 300 seconds. See your web server documentation for specific details.

    是因为这个么?
    raysonlu
        18
    raysonlu  
    OP
       2017 年 7 月 14 日
    @zhengwenk 用 apahce 的,timeout 设置了 30
    studentht
        19
    studentht  
       2017 年 7 月 14 日
    @raysonlu 操作系统,Apache 的版本都报一下,你 Apache 是在什么模式运行的,是用什么方式和 PHP 交互的(加载 PHP 模块的代码)
    raysonlu
        20
    raysonlu  
    OP
       2017 年 7 月 14 日
    @studentht apache2.4,普通的,使用 modules 加载 php,使用 event MPM,开启了 keepAlive
    studentht
        21
    studentht  
       2017 年 7 月 14 日
    Apache 使用 event MPM 模式的话,那么 PHP 这边是使用的 FPM 吧, 在 php-fpm 配置里设置 request_terminate_timeout 看看
    raysonlu
        22
    raysonlu  
    OP
       2017 年 7 月 14 日
    @studentht 没有使用 fastcgi 啊,跟 FPM 啥关系?而且服务器应该没有配置 php-fpm
    ihaveobj
        23
    ihaveobj  
       2017 年 7 月 14 日 via iPhone
    手机上回复,没有经过测试。
    你把 while 里的 echo 全注释,在循环结束输出下试试。

    印象中 max_execution_time 是控制脚本的响应,你循环中输出的字符可能已经被刷出缓冲区了。
    studentht
        24
    studentht  
       2017 年 7 月 18 日
    @raysonlu 那你是怎么加载 PHP 模块 /启动 PHP 进程
    raysonlu
        25
    raysonlu  
    OP
       2017 年 7 月 18 日
    @studentht
    LoadModule php5_module modules/libphp5.so
    raysonlu
        26
    raysonlu  
    OP
       2017 年 7 月 18 日
    @ihaveobj
    试了你说的,一样,不关输出缓冲吧,因为我测试代码中循环后面至少还有一个 echo "success"要执行
    awanganddong
        27
    awanganddong  
       2022 年 4 月 28 日
    遇到相同的问题,标记下
    awanganddong
        28
    awanganddong  
       2022 年 4 月 28 日
    配置指令 max_execution_time 只影响脚本本身执行的时间。任何发生在诸如使用 system()的系统调用,流操作,数据库操作等的脚本执行的最大时间不包括其中,当该脚本已运行。
    ```
    我在使用如下操作的时候,是可以报系统异常的。如果把循环内替换为 var_dump(),则一直死循环。在循环内添加 var_dump(),也是死循环。推测是如果牵扯到系统调用等操作,会把系统默认参数初始化。
    $dummy = 2;
    for ($i = 0; $i < 10000000000; $i++) {
    $dummy *= 2;
    }

    ```
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2642 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 39ms UTC 03:59 PVG 11:59 LAX 19:59 JFK 22:59
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86