Slim Framework:如何尽早关闭客户端连接

时间:2017-09-18 13:41:01

标签: php asynchronous slim

对于一个纤薄的控制器,我有一个很长的任务,我想尽早将输出结束到客户端,然后继续进行后端细化。

$app->get("/test",function() use($app){
    $app->render("page.html"); //this is the client output
    $app->easlyStop(); //a slim hypothetical command to call
    $task=new MyTask();
    $task->longAsyncTask(); //this take a few, client don't have to wait.
});

是否有Slim的解决方案?

2 个答案:

答案 0 :(得分:0)

这里最简单的选择是调用带有系统调用的方法并在完成之前返回:

exec('/bin/php /path/to/a/script.php > /dev/null &');

请注意,这是一种简化,因为PHP是面向请求的,这意味着每个请求都会启动一个新进程,并且Web服务器会在请求完成后将响应发送给用户。您可以使用flush和其他技术,但这些技术容易出错并且也取决于Web服务器的配置。

答案 1 :(得分:0)

这是一个带有Json视图的Slim控制器的方法:

CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_insert2`(
    IN P_page_Id int(11) ,
    IN P_LanguageCode char,
    IN P_page_status int(11),
    IN p_created_by int(11),
    IN p_created_date datetime,
    OUT P_return int)
BEGIN
DECLARE v_isRecordExisting int;
DECLARE v_flags int;

SELECT
    COUNT(*)
INTO
    v_isRecordExisting 
FROM 
    tbl_cms_pages_languages2
WHERE 
    page_status in(0,1) 
AND
    page_id = p_page_Id 
AND 
    languagecode = P_LanguageCode;

IF 
    v_isRecordExisting = 0        
THEN
    INSERT INTO tbl_cms_pages_languages2 (
        page_Id,
        LanguageCode,
        page_status,
        created_by,
        created_date
    )
    VALUES( 
        P_page_Id,
        P_LanguageCode,
        P_page_status,
        P_created_by,
        p_created_date
    );

    SET 
        p_return = 0; 
    ELSE
        SET 
            p_return = 2; 
    END IF;
END

我认为这可以很容易地插入Slim插件中。这只适用于Json视图因为这是我的需要,但它可以与Twig或其他Slim视图一起使用ob * php函数输出而不是捕获Stop()异常。