多个HTTP请求到单个文件

问题描述:

目前,我试图调用一个名为'sniffer.php'的PHP文件。 我正在做这个异步使用javascript到一个PHP文件。我目前遇到的问题是,在PHP代码中,我随机添加了一个睡眠函数(以加载页面的方式运行)。这个问题是两个或更多的函数调用该页面,它仍然等待,直到其中一个页面完成,然后停止启动另一个请求。 EG:一人睡5秒,另一人睡6秒。第一个在5秒内完成,下一个在11秒完成。我正在寻找的是5秒内完成的,而下一个完成后的一秒钟。我不确定是否只是“睡眠”引起问题,或者因为睡眠而导致文件被“锁定”。多个HTTP请求到单个文件

感谢您的任何帮助/反馈。

我的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

PHP会话锁定并发请求。检查你是否在你的PHP代码中启动任何会话,这将解释它。 – jorgonor

+0

不幸的是,睡眠会延迟当前会话的执行,而不仅仅是当前的请求。 – ADyson

+0

你说得对。我正在开始一个会议。我假设没有办法绕过这一点。如果它是睡眠以外的东西(EG SQL进程),它仍然会话锁定? – Deadweight

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

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

因此,如果一个脚本试图在其他地方打开会话的时候,会有一个锁,因为第一个脚本可能会很好地改变会话信息。一旦第一个脚本关闭了会话,下一个脚本就可以保留它并继续。

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

documentation

后脚本终止而不 需要调用session_write_close(会话数据通常存储)但由于会话数据被锁定为 以防止并发写入,因此只有一个脚本可以随时在会话 上运行。

而且好像你是不是唯一的一个:

你可以开心有趣调试它与睡眠)什么(如果 你有一个会话仍然有效。例如,一个页面发出ajax请求,其中ajax请求轮询服务器端事件(并且 可能不会立即返回)。

如果ajax函数没有执行session_write_close(),那么您的外部 页面将挂起,并且在新选项卡中打开其他页面 也会停止。

+0

这解释了很多,谢谢。 – Deadweight