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

时间:2014-05-19 10:13:02

标签: php apache sockets

我有一个包含图片的页面。图片应该每秒刷新一次。我有一个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 socket\n");
    $result = socket_connect($socket, $host, $port) or die("Could not connect to server\n");    
    socket_write($socket, $message, strlen($message)) or die("Could not send data to server\n");
    $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);        
}
}

2 个答案:

答案 0 :(得分:1)

一分钟就有60个电话,没什么,也是200个电话。我觉得问题是你不关闭套接字。

最好的方法是让你每秒c ++更新mysql数据库,页面应该从DB请求更新的图像,这样你就会获得灵活性。 此时,您还可以兑现图像 此外,您可以根据需要附加尽可能多的图像用户,而无需打开新套接字并且无需C ++应用程序调用。

答案 1 :(得分:0)

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