在php套接字中建立持久连接,以避免太多的apache实例



我有一个包含图片的页面。图片应该每秒钟刷新一次。我有一个socket.php文件,创建一个链接到一个c++程序,并要求图片,然后把它作为输出。我有一个js代码,要求socket.php每秒钟的图像。所以每隔一秒,客户端浏览器中的js代码会请求服务器端的socket.php向用户发送一张新图片,而socket.php会向我的c++代码发送一张图片,接收图片并将其传递给客户端浏览器。一切都很好。但是当我将间隔从1秒更改为50毫秒时,服务器上的"apache2"进程的数量确实增加了。我的意思是大约200个apache2进程,这在我的服务器上占用了太多的ram内存。

我的问题是:我应该怎么做才能使php和c++之间有一个持久的连接,所以对于来自用户的每个查询,一个新的连接不会创建?持久连接是否有助于避免这么多apache进程?

我的socket.php文件:

if(isset($_GET['message']))
        $message = $_GET['message'];
    else $message = "-1";
    $host    = "127.0.0.1";
    $port    = 12345;
    $socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socketn");
    $result = socket_connect($socket, $host, $port) or die("Could not connect to servern");    
    socket_write($socket, $message, strlen($message)) or die("Could not send data to servern");
    $b= '';
    $buf = '';
    while(true)
    {
        $bytes = socket_recv($socket, $buf, 2048, 0);
        if($bytes==0) break;
        $b .= $buf;
    }
    $im = imagecreatefromstring($b);
    header('Content-Type: image/jpeg');
    imagejpeg($im);
    imagedestroy($im);
这是我的js代码:
function updateImage()
{
if(!isPaused)
{
    if(newImage.complete) {
    document.getElementById("myimg").src = newImage.src;
    newImage = new Image();
    newImage.src = "socket.php?message=0&image" + count++ + ".jpg";
    }
    setTimeout(updateImage, 50);        
}
}

一分钟内调用60次,这没什么,也有200次。我认为问题是你不关闭插座。

最好的方法是让你c++更新mysql数据库每秒钟和页面应该要求更新的图像从数据库,这样你会获得灵活性。这时,你还可以对图像进行兑现此外,您还可以在不打开新套接字和不调用c++应用程序的情况下附加任意多的映像用户。

据我所知,除了数据库连接(例如PDO支持的所有连接)之外,确实无法持久保存从PHP的Apache实例(例如mod_php)到另一个服务的连接。@volkinc关于PHP如何执行的链接是一个很好的例子,它说明了PHP必须缓存/存储这样的持久链接,但不是。

最新更新