javascript 被提取调用两次的PHP脚本被阻塞

ejk8hzay  于 2023-02-11  发布在  Java
关注(0)|答案(2)|浏览(123)

我有2个fetch函数调用同一个PHP脚本。PHP脚本的全部内容如下:

<?php

session_write_close();
sleep(10);

session_write_close();仅用于确保会话确实关闭。但是,第一个脚本在约10秒后完成,第二个脚本在约20秒后完成:

为什么脚本1阻止脚本2?
为了完整起见,下面是JavaScript:

async function test() {
    fetch('api/v1/test')
    fetch('api/v1/test')
}
test();
v440hwme

v440hwme1#

对于其他面临同样问题的人:如果在内置Web服务器上进行本地开发,则需要以下设置:PHP_CLI_SERVER_WORKERS
目前不支持Windows,需要PHP〉=7.4。
文档链接:Documentation

b1zrtrql

b1zrtrql2#

根据上面的评论,我无法复制你提到的blocking行为。
使用本质上相同的函数并向PHP端点(在本例中为同一页面)发送一个最小的GET请求,该端点的操作本质上与原始请求相同,所有请求几乎都返回相同的内容。

<?php
    $t=10;

    if( $_SERVER['REQUEST_METHOD']=='GET' && isset( $_GET['task'], $_GET['seq'], $_GET['func'] ) && $_GET['task']=='test' ){
        session_write_close();
        sleep( $t );
        
        exit( 'ok: sequence: ' . $_GET['seq'] . ' func: ' . $_GET['func'] . ' date: ' . date( DATE_ATOM )  );
    }
    
?>
<!DOCTYPE html>
<html lang='en'>
    <head>
        <meta charset='utf-8' />
        <title>Blocking or not-blocking?</title>
    </head>
    <body>
        <div id='results'><div>
        
        <script>
        
            const callback=(r)=>{
                document.getElementById('results').innerHTML += `${r}<br />`;
            }
            
            const test=()=>{
                fetch('?task=test&seq=1&func=1')
                    .then(r=>r.text())
                    .then(callback);
                    
                fetch('?task=test&seq=2&func=1')
                    .then(r=>r.text())
                    .then(callback);
                    
            };
            async function test2() {
                fetch('?task=test&seq=1&func=2')
                    .then(r=>r.text())
                    .then(callback);
                    
                fetch('?task=test&seq=2&func=2')
                    .then(r=>r.text())
                    .then(callback);    
            }
            
            callback(`Begin Tests: ${new Date()}`);
            test();
            test2();
        </script>
    </body>
</html>

例如,这产生:

Begin Tests: Thu Feb 09 2023 12:18:59 GMT+0000 (Greenwich Mean Time)
ok: sequence: 1 func: 1 date: 2023-02-09T12:19:09+00:00
ok: sequence: 2 func: 1 date: 2023-02-09T12:19:09+00:00
ok: sequence: 1 func: 2 date: 2023-02-09T12:19:09+00:00
ok: sequence: 2 func: 2 date: 2023-02-09T12:19:09+00:00

相关问题