我有一个包含图片的页面。图片应该每秒刷新一次。我有一个socket.php文件,它创建一个到c++程序的链接,并请求一张图片,然后将其作为输出。我有一个js代码,每秒都会向socket.php请求一张图片。因此,我的js代码在客户端浏览器中每秒都会请求服务器上的socket.php向用户发送一张新图片,而socket.php则向我的c++代码请求一张图片,接收图片并将其传递给客户端浏览器。一切都很好。但是,当我将时间间隔从1秒改为50毫秒时,我的服务器上的"apache2“进程的数量真的增加了。我的意思是大约200个apache2进程,这在我的服务器上占用了太多的内存。
我的问题是:我应该怎么做才能在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);
}
}发布于 2014-05-19 19:26:02
一分钟内打60个电话算不了什么,也就是200个。我认为问题是你没有关闭套接字。
最好的方法是让你的c++每秒更新一次mysql DB,页面应该从DB请求更新图像,这样你就可以获得灵活性。在这一点上,您还可以对镜像进行变现,还可以在不打开新套接字和不调用C++应用程序的情况下附加尽可能多的镜像用户。
发布于 2016-02-06 07:34:00
据我所知,除了数据库连接(例如,mod_php支持的所有数据库连接)之外,人们真的不能持久化从PHP的Apache实例到另一个服务的连接。@volkinc的PHP如何执行的链接是一个很好的例子,它说明了PHP必须缓存/存储这种持久链接的地方,但不是这样。
https://stackoverflow.com/questions/23735096
复制相似问题