代码之家  ›  专栏  ›  技术社区  ›  D-Rock

在PHP中完成HTTP请求后执行代码?

  •  4
  • D-Rock  · 技术社区  · 17 年前

    PHP提供了一种注册关闭函数的机制:

    register_shutdown_function('shutdown_func');
    

    问题是,在PHP的最新版本中,此函数仍然在请求期间执行。

    我有一个平台(在Zend Framework中,如果需要的话),在这个平台上,整个请求中的任何代码都可以注册一个条目以登录到数据库中。我没有在整个请求中使用大量的insert语句,从而降低页面速度,而是将它们排队,以便在请求结束时插入。我希望能够在用户完成HTTP请求后执行此操作,以便登录或执行任何其他清理任务的时间长度不会影响用户对页面的感知加载时间。

    4 回复  |  直到 17 年前
        1
  •  4
  •   Gary Richardson    17 年前

    如果您真的关心MySQL的插入时间,那么您可能是在解决症状,而不是原因。

    如果遇到性能问题,则需要从PHP/Apache执行中消除繁重的工作。如果你有很多清理任务在进行,那么你正在烧掉宝贵的Apache进程。

    我会考虑将你的条目记录到一个文件中,并让一个CrutAB将这些加载到你的数据库之外。如果您有其他繁重的任务,请使用排队/作业处理系统在带外完成工作。

        2
  •  1
  •   Eran Galperin    17 年前

    除了register_shutdown_function()之外,没有用于确定脚本何时退出的内置方法。但是,Zend框架有几个钩子用于在分派过程中的特定点运行代码。 对于您的要求,最相关的是行动控制器的 post-dispatch hook 它发生在一个动作被分派之后,并且 dispatchLoopShutdown event

    编辑:我想我没有完全理解。从这些钩子中,您可以以某种形式分叉当前进程。 PHP有几种分叉进程的方法,您可以在下面的手册中阅读 program execution . 我建议您阅读pcntl扩展名 this blog post 查看分叉子进程以在后台运行的示例。

        3
  •  0
  •   Nicholas Piasecki    17 年前

    this random guy's blog 听起来和你想要的差不多。如果标题技巧不起作用,该博客上的一条评论建议 exec() 如果您的Web主机的配置允许这样做的话,您可以使用一个单独的PHP脚本在后台运行。

        4
  •  0
  •   Mike Keen    17 年前

    这可能有点不合你的口味,但这将是一个有效而简单的解决办法。

    前任:

    <?php
    mysql_query('INSERT INTO queue ('instructions') VALUES ('something would go here');
    echo('<iframe src="/yourapp/execute_queue/id?' . mysql_insert_id() . '" />');
    ?>
    

    框架会做一些类似的事情

    前任:

    <?php
    $result = mysql_query('SELECT instructions FROM queue WHERE id = ' . $_GET['id']);
    // From here, simply execute some instruction based on the "instructions" field, then delete the instruction from the database.
    ?>
    

    干杯