2013-04-28 135 views
0

我有过这种情况。Php会话锁定等待超时

我有一个代理网站,我的共享主机帐户允许我的帐户最多有25个进程。 我刚刚开始使用会话锁定从sinlge用户的多个请求排队。这意味着如果已经有请求或者用户已经在流式传输视频,那么他的下一个请求将会等到流式传输结束。 (我不得不申请这个功能,因为用户已经开始使用下载器一次下载多个视频,下载器做的更糟糕的事情是,他们通常要求单次下载4次,这样,只有一个用户正在使用我的所有资源。 )

目前的问题是,正在等待的第二个请求也会采取单独的过程。这样,只有两个用户可以达到我的最大进程限制。

我正在寻找PHP配置有类似会话锁等待超时,在此之后(如:20秒),PHP应该关闭与任何消息或某事的连接。所以我们可以发布正在等待的流程。

请告诉我,如果有人知道任何Linux解决方案。

是否有任何Linux命令来获取所有进程运行PHP脚本和哪些处于等待模式?

在此先感谢。

+0

+1如果进程无法锁定会话文件,PHP不应该永久挂起 – Jerem 2013-11-11 03:41:42

回答

0

找不到任何PHP选项“会话锁定超时”

要列出访问的会议文件,尝试lsof |grep session

你应该得到这样的 enter image description here

与该线输出16uW是锁定实际会话文件的PHP进程

1

对于提出这个问题的人来说可能太迟了,但会话可以在scr之前解锁ipt使用函数session_write_close()结束。你可以这样做:

<?php 
session_start(); 
// ... use and/or update session data 

session_write_close(); 

// begin streaming 
header("Content-Type: foo/bar"); 

$f=fopen("hundred-meg-video.mp4","rb"); 
fpassthru($f); 
fclose($f); 
?> 

或者,您可以重新打开会话在流结束。我们用这个来限制每个用户下载的并发数:

<?php 
$limit=4; 

session_start(); 

if ($_SESSION["concurrent_downloads"]>$limit) { 
    header("HTTP/1.1 500 Internal Server Error"); 
    echo "too many concurrent downloads"; 
    die; 
} 

ignore_user_abort(1); // if the user aborts the script, we still want it to continue running on the server 
// otherwise the $_SESSION["concurrent_downloads"] would not decrease at its end 

$_SESSION["concurrent_downloads"]++; 
session_write_close(); 

// begin streaming 
header("Content-Type: foo/bar"); 

$f=fopen("hundred-meg-video.mp4","rb"); 
fpassthru($f); 
fclose($f); 

// resume using session 
@session_start(); // @ used to suppress "headers already sent" message 
$_SESSION["concurrent_downloads"]--; 
?>