对单个文件的多个HTTP请求

时间:2017-09-13 15:03:29

标签: javascript php

目前,我正在尝试调用名为' sniffer.php'的单个PHP文件。 我正在使用javascript对PHP文件进行异步。我目前遇到的问题是,在PHP代码中,我随机添加了一个睡眠函数(就像加载页面一样)。问题是两个或多个函数调用该页面它仍然等待,直到其中一个页面完成,然后停止启动另一个请求。 EG:一个人睡5秒钟,另一个人睡6秒钟。第一个在5秒内完成,下一个在11秒完成。我要找的是一个在5秒内结束,下一个结束后的一秒钟。我不确定它是否只是“睡觉”。导致问题或文件被锁定'因为睡觉

感谢您提供任何帮助/反馈。

我的PHP文件如下所示:

$c = rand(2,10);
sleep($c);
$html .= $c;
echo json_encode(array('html'=>$html,'status'=>1));
exit;

我的javascript类看起来像这样:

var path = '/';

var polling = {
    add : function(name, obj) {
        this[name] = new xAjax(obj);
        return this;
    }
};

function xAjax(options) {

    var consti = {
    };
    var defaults = {
        url: path + 'sniffer.php',
        method: 'POST',
        responseType: 'json',
        async: true,
        timeout: 30000,
        success: function(response) {console.log(response);},
        done: function() {},
        beforeSend: function() {},
        error: function(e) {console.log(e);},
        abort: function() {}
    };
    var settings = Object.assign({}, defaults, options, consti);
    var xhr = null;

    this.run = function() {
        xhr = new XMLHttpRequest();

        settings.beforeSend();
        xhr.responseType = settings.responseType;
        xhr.open(settings.method, settings.url, settings.async);
        xhr.timeout = settings.timeout;
        xhr.onreadystatechange = function() {
            if ( xhr.readyState == XMLHttpRequest.DONE ) {
                if ( xhr.status === 200 ) {
                    settings.success(xhr.response);
                } else {
                    settings.error(xhr.response);
                }
                settings.done();
                xhr = null;
            }
        };
        xhr.send();
        return this;
    };

    this.abort = function() {
        xhr.abort();
        xhr = null;
        settings.abort();
        return this;
    };

    this.isRunning = function() {
        return xhr != null;
    };

    this.set = function(options) {
        settings = Object.assign({}, defaults, options, consti);
        return this;
    };
}

我的创作/致电sniffer.php:

polling.add('x');
polling.x.run();
polling.add('y');
polling.y.run();

1 个答案:

答案 0 :(得分:1)

这是因为会话而发生的。如果脚本需要时间,它会在有或没有睡眠的情况下发生。

开始会话时会发生什么? PHP必须确保会话数据是最新的并且它不会改变,它还必须确保它所更改的数据在下次执行时可用。

因此,如果一个脚本在其他地方打开时尝试打开会话,那么就会锁定,因为第一个脚本可能会很好地更改会话信息。第一个脚本关闭会话后,下一个脚本可以暂停并继续。

您可以调用session_write_close()关闭会话以进行写入,从而删除锁定。当会话关闭时,仍然可以访问它的值,但它将是任何后续脚本更改任何内容之前的值(如果第二个脚本在第一个脚本结束之前发生了某些变化,则无法知道)。此外,如果您将新数据写入会话,则不会保存...

来自documentation

  

会话数据通常在脚本终止后存储   需要调用session_write_close(),但会话数据被锁定   为了防止并发写入,只有一个脚本可以在会话上运行   在任何时候。

似乎你不是唯一一个:

  

如果有的话,你可以通过sleep()调试任何有趣的乐趣   你的会话仍然有效。例如,一个页面   ajax请求,其中ajax请求轮询服务器端事件(和   可能不会立即返回。)

     

如果ajax函数没有执行session_write_close(),那么你的外   页面将显示为挂起,并在新选项卡中打开其他页面   也失速了。