代码之家  ›  专栏  ›  技术社区  ›  Andrei Herford

如何在不同的请求中运行PHP后台操作/处理方法?

  •  0
  • Andrei Herford  · 技术社区  · 7 年前

    Symfony 2.8 基于web应用程序。基本上,对服务器的每个请求都由三个步骤处理:

     1. User/Browser sends request to the server
     2. Server handles the request and performs any number of operations
     3. Server sends back the result as response to the user
    

     2. Server handles the request and performs any number of operations
         2a. Necessary work to answer the request
         2b. Maintenance work 
    

    如果代码跳过所有这些步骤,只运行创建响应所必需的代码,那么用户将得到完全相同的响应。

    这在PHP中是可能的还是可能使用Symfony特性?

    更准确地说: 当然 “我的代码运行一堆代码,这只是维护…” 并不意味着每个请求需要30秒来处理,删除维护代码将减少这几毫秒。

    这是一个关于“如何将不需要处理请求的大量维护工作转移到后台”的一般性问题。这在PHP中有可能吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Padam87    7 年前

    来自其他语言这可能是奇怪的,但它是非常自然的PHP和Symfony。

    PHP生命周期本身初始化,并在每个请求时关闭所有内容。这对安全性很好(一个请求中的错误不会影响其他请求),但对速度影响不大。

    因此,这同样适用于Symfony。一个请求进入,一个响应被服务,所有的东西都关闭(需要被记录,刷新等等)。(旁注:Sf能够处理多个请求——看看PHP-PM)

    幸好Symfony有一个 kernel.terminate 事件,它允许您在发送响应后运行代码。 http://symfony.com/doc/current/components/http_kernel.html#the-kernel-terminate-event

    一个很好的例子是电子邮件的内存假脱机: https://symfony.com/doc/current/email/spool.html

    Symfony会在收到回复后延迟电子邮件的发送。

    你也可以为你的用例做同样的事情,只需要一个 内核.terminate 听众。你提到了一些请求。。。这将是一个伟大的地方创造和保存。

    你还提到了日志:我不会太担心。在prod模式下,只有错误会被记录下来,这要感谢手指交叉处理程序。 https://symfony.com/doc/2.0/cookbook/logging/monolog.html#handlers-and-channels-writing-logs-to-different-locations

    monog还为登录prod环境提供了一个强大的内置处理程序:FingersCrossedHandler。它允许您将消息存储在缓冲区中,并且仅当消息到达操作级别(标准版中提供的配置中的错误)时才将消息转发给另一个处理程序来记录它们。

        2
  •  0
  •   Mayank Kumar    7 年前

    假设你想逃跑 index.php 2a . 你的要求是你不想等待 index.php 在发送响应之前完成。

    $cmd="php index.php";
    if (substr(php_uname(), 0, 7) == "Windows"){
        pclose(popen("start /B ". $cmd, "r"));
    } else {
        exec($cmd . " > /dev/null &");
    }
    
    推荐文章