0

这里有一个奇怪的。我刚刚完成了一个 Silex 应用程序,但是在触发 $app->finish 时遇到了问题。这是我的代码:

<?php
require_once __DIR__ . '/../vendor/autoload.php';

$app = new Silex\Application();

$app->get('/', function (Request $request) {
    $batchProcess = function () {
        long_process();
    };
    $app->finish($batchProcess);

    return $app->json("ok", 200);
};

$app->run();

所以这里的问题是:批处理永远不会运行!为了找到错误,我在 Silex\Application 的“on”函数中添加了一个 var_export:

/**
 * Adds an event listener that listens on the specified events.
 *
 * @param string   $eventName The event to listen on
 * @param callable $callback  The listener
 * @param integer  $priority  The higher this value, the earlier an event
 *                            listener will be triggered in the chain (defaults to 0)
 */
public function on($eventName, $callback, $priority = 0)
{
    $this['dispatcher'] = $this->share($this->extend('dispatcher', function ($dispatcher, $app) use ($callback, $priority, $eventName) {
        $dispatcher->addListener($eventName, $callback, $priority);

        return $dispatcher;
    }));
    var_export($this['dispatcher']);
}

当 var_export 在那里时,一切正常(尽管内核在发送任何数据之前运行批处理)。当 var_export 被注释掉时,“ok”它立即返回并且批处理过程永远不会运行。

我究竟做错了什么?为什么内核在不执行我的进程的情况下终止?

4

1 回答 1

0

请参阅Igor Wiedler 的评论

可能有一种方法可以通过对 Response 类进行两次更改来实现它。

  • 第一个是在inob_flush()之前添加。flush()Response::send()
  • 二是设置content-length标题。

我能够在不修改Response类的情况下达到相同的效果。首先,您需要将您在finish中间件中设置的回调移动到get方法之外,并手动检查路由('GET_'在这种情况下响应'/'路径):

$app->finish(function() {
    if ('GET_' === $request->attributes->get('_route')) {
        long_process();
    }
});

那么你的get方法应该是这样的:

$app->get('/', function(Request $request) use ($app) { 
    $content = json_encode(array(
        'status' => 'ok',
    ));
    $response = new Response($content, 200);
    $response->headers->set('Content-Type', 'application/json');
    $response->headers->set('Content-Length', strlen($content));
    $response->send();
    ob_flush();

    return $response;
});

设置 content-length 很重要,否则 JSON 内容会被发送两次,因为在方法中返回 $response,并由 Silex 发送。

于 2013-08-16T08:37:13.163 回答