PHP的max_execution_time实际上是在衡量什么?

3
我有一个网页,上面有一个按钮,点击它会执行一个单一的php函数。
当用户点击它时,需要51081ms才能返回页面。其中51376ms被Firefox开发者工具中的网络选项卡归类为“等待”。
我在php.ini文件中声明的max_execution_time是30。我也可以在phpinfo文件中看到这个设置。
我的问题是,为什么我的脚本没有在30秒后超时?max_execution_time实际上是在衡量什么?
编辑以包括代码;
public function getSlotsByUser (Request $request) {

    $event_id = $request->event_id;
    $user_id = substr($request->user, 4);

    $event = Event::find($event_id);

    $user = User::find($user_id);

    $slots = TimeSlot::where('event_id',$event_id)->get();

    $userSlots = $user->slots;

    foreach($userSlots as $userSlot) {

       $guest = Guest::where('slot_id',$userSlot->id)->where('user_id',$user->id)->first();

       if($guest) {
            $userSlot->guest_id = $guest->id;
            $userSlot->guest_name = $guest->name . ' ' . $guest->surname;
        }
        else {
            $userSlot->guest_id = NULL;
            $userSlot->guest_name = NULL;
        }

        $userSlotIds[] = $userSlot->id;

    }

    $days = new DatePeriod(
         new DateTime($event->start_time),
         new DateInterval('P1D'),
         (new DateTime($event->end_time))->modify('+1 day')
    );

    return view('admin.calendar',compact('event','slots','user','userSlots','userSlotIds','days'));

}

我了解哪些部分使用Eloquent表示查询。那么我的代码是这样的吗;
PHP执行
PHP执行
数据库查询
数据库查询
数据库查询
PHP执行...等等?
有人能向我解释一下“引擎盖下面”发生了什么吗?

你确定你的代码中没有调用 set_time_limit 吗? - Nico Haase
是的,我非常确定。 - Jordan D
1个回答

3

set_time_limit函数说明:

max_execution_time只影响脚本本身的执行时间,脚本外部的所有活动消耗的时间,例如使用system()进行系统调用、流操作、数据库查询等都不会被包括在确定脚本运行的最长时间时。但在Windows上,实际测量的时间是真实的。

因此,在Linux上只有用于执行PHP代码的时间才会被计算。

网络选项卡中的“等待”仅告诉您迄今为止尚未从Web服务器收到任何响应。


谢谢,我进一步阐述了我的问题,因为我仍然不确定到底发生了什么。 - Jordan D
@JordanD 好的,那些 Event::find ... 都是数据库查询。我不知道 $userSlots 中有多少个用户,但所有这些数据库查询总共可能需要从 21376 毫秒到 50000 毫秒。因此,PHP脚本的实际执行时间可能少于一秒钟。您应该检查您使用的DB库是否具有一些分析选项,以查看每个脚本发出了多少个查询以及它们总共持续了多长时间。 - t.niese
好的,我的代码确实执行了; PHP 执行, PHP 执行, 数据库查询, 数据库查询, 数据库查询, 然后是 PHP 执行?我的代码中实际上有 6 次 PHP 执行吗? - Jordan D
@JordanD 你不能把 PHP 执行次数算作垃圾代码的数量。因为一方面,每个 ::where 调用在查询数据库之前和之后都会执行更多的 PHP 代码行,另一方面,你如何定义垃圾代码呢?可以将其想象成你需要在家里做一些事情,有人正在测量你所需的时间。大部分时间都在家里(PHP)进行,但有时你需要去硬件商店(数据库查询)取东西,当你离开房子的主门时,测量时间的人会暂停计时。 - t.niese

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接