V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
raysonlu
V2EX  ›  PHP

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

  •  
  •   raysonlu · 2017-07-13 11:17:07 +08:00 · 5191 次点击
    这是一个创建于 2683 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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-07-13 14:11:00 +08:00
    你这个死循环是经由 Apache 不断的访问某个 PHP 脚本?还是访问一次 PHP 不停的跑?
    如果是前者,max_execution_time 没有意义。
    cxbig
        2
    cxbig  
       2017-07-13 14:12:58 +08:00
    如果是后者,试着在该脚本输出一下 phpinfo 或者 max_execution_time 看看实际的值。
    raysonlu
        3
    raysonlu  
    OP
       2017-07-13 15:21:51 +08:00
    @cxbig 后者,实际值是 120,但我做一个 echo 时间测试,发现无效。源码如下:
    $now=time();
    $second = 0;
    while($second<150){
    if(time()>$now){
    $n=time();
    echo ++$second."second";
    echo "<br>";
    }
    }
    studentht
        4
    studentht  
       2017-07-13 16:25:01 +08:00
    你这段代码很短时间就跑完了把,你设置的 max_execution_time 值为多少?
    raysonlu
        5
    raysonlu  
    OP
       2017-07-13 16:33:10 +08:00
    @studentht max_execution_time 在 php.ini 里面设置是 120
    raysonlu
        6
    raysonlu  
    OP
       2017-07-13 16:37:38 +08:00
    经过一些测试,更新一下问题

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

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

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

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

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

    PS:
    $n=time();
    这句,$n 是干什么用的?
    raysonlu
        12
    raysonlu  
    OP
       2017-07-13 23:00:01 +08:00
    @studentht $n 其实是$now,贴上来的时候少改了这里,抱歉了
    cxbig
        13
    cxbig  
       2017-07-14 06:38:13 +08:00
    @studentht
    和系统相关的操作,包括 sleep(),是不算在 max_execution_time 里的。这里有说明
    http://php.net/manual/en/function.set-time-limit.php
    cxbig
        14
    cxbig  
       2017-07-14 06:44:49 +08:00
    @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-07-14 08:27:00 +08:00
    这段代码有点逗。
    raysonlu
        16
    raysonlu  
    OP
       2017-07-14 09:04:11 +08:00
    @linoder
    @cxbig
    var_dump(ini_get('max_execution_time'));结果是
    string(3) "120"
    zhengwenk
        17
    zhengwenk  
       2017-07-14 09:39:19 +08:00
    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-07-14 10:29:31 +08:00
    @zhengwenk 用 apahce 的,timeout 设置了 30
    studentht
        19
    studentht  
       2017-07-14 13:41:19 +08:00
    @raysonlu 操作系统,Apache 的版本都报一下,你 Apache 是在什么模式运行的,是用什么方式和 PHP 交互的(加载 PHP 模块的代码)
    raysonlu
        20
    raysonlu  
    OP
       2017-07-14 14:20:29 +08:00
    @studentht apache2.4,普通的,使用 modules 加载 php,使用 event MPM,开启了 keepAlive
    studentht
        21
    studentht  
       2017-07-14 14:52:26 +08:00
    Apache 使用 event MPM 模式的话,那么 PHP 这边是使用的 FPM 吧, 在 php-fpm 配置里设置 request_terminate_timeout 看看
    raysonlu
        22
    raysonlu  
    OP
       2017-07-14 17:30:16 +08:00
    @studentht 没有使用 fastcgi 啊,跟 FPM 啥关系?而且服务器应该没有配置 php-fpm
    ihaveobj
        23
    ihaveobj  
       2017-07-14 21:49:38 +08:00 via iPhone
    手机上回复,没有经过测试。
    你把 while 里的 echo 全注释,在循环结束输出下试试。

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

    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1093 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 23:32 · PVG 07:32 · LAX 15:32 · JFK 18:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.