0

我有wiered情况。

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

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

我在 PHP 配置中寻找类似 Session Lock Wait time out 的东西,在那之后(比如:20 秒),PHP 应该关闭与任何消息或其他东西的连接。所以我们可以释放正在等待的进程。

还请告诉我是否有人知道任何 linux 解决方案。

是否有任何 linux 命令可以让所有进程为 php 脚本运行并且处于等待模式?

提前致谢。

4

2 回答 2

1

对于提出这个问题的人来说可能为时已晚,但是可以在脚本结束之前使用函数 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"]--;
?>
于 2015-11-09T14:04:31.570 回答
-1

Couldn't find any PHP option 'session lock timeout'

To list the session files accessed, try lsof |grep session

You should get a output like that enter image description here

The line with the 16uW is the PHP process that locks the actual session files

于 2013-11-11T03:46:59.970 回答