PHP中长连接的实现,长连接的兑现剖析

各种PHP脚本都限制了试行时间,所以我们须求通过 set_time_limit
来安装二个剧本的实施时间为Infiniti长;然后采用 flush() 和 ob_flush()
来祛除服务器缓冲区,随时输出脚本的重回值。

php能够通过set_time_limit(0);来撤消php脚步超时间限制制,进而完结长连接的服从。

眼前遇上PHP程序在实行大气数量的时候唤醒超时,于是采取了set_time_limit()函数来安装PHP页面包车型大巴最小运行时刻。
安装允许脚本运转的秒数。假如那是默许的,该脚本再次来到一个沉重的失实。默许限制为30秒,或然也能够在在php.ini定义max_execution_PHP中长连接的实现,长连接的兑现剖析。time来安装PHP页面包车型客车最大实行时间。
在调用时,set_time_limit()函数从零重新运维超时计数器。换句话说,假如超时暗中认可的30秒,25秒到剧本的实施参数恐怕set_time_limit,如设置超时时间为(20),该脚本将运转45秒时才会晚点。
set_time_limit(900)那些函数钦命了眼下所在php脚本的最大实行时间,就算设定值是900秒,实际上最大推行时间=php.ini里的max_execution_time数值
- 当前脚本已经实施时间 + 设定值。
假如php.ini里的max_execution_time=30,当前脚本早就实施10秒,则:
最大实施时间=30-10+900=920秒。
由此那样修改后,PHP脚本成功更新200000条记下。

第一是首页,满含叁个文书输入和贰位作品呈现聊天内容的iframe,还恐怕有贰个遮蔽iframe用来交给form表单:

如下边这段脚本:

事例代码如下:

历次我们拜候PHP脚本的时候,都是当全数的PHP脚本推行到位后,大家才拿走重回结果。尽管大家须求一个本子持续的运作,那么大家将要通过php长连接的形式,来达到运转目标。

复制代码 代码如下:

复制代码 代码如下:

复制代码 代码如下:

各种PHP脚本都限制了实践时间,所以大家供给通过 set_time_limit
来设置三个本子的实践时间为Infiniti长;然后使用 flush() 和 ob_flush()
来祛除服务器缓冲区,随时输出脚本的再次回到值。

<?php
//chat.php
header(‘cache-control: private’);
header(‘Content-Type: text/html; charset=utf-8’);
?>
<html>
<script type=”text/javascript”>
function submitChat(obj) {
obj.submit();
document.getElementsByName(‘content’)[0].value = ”;
}
</script>
<iframe src=”./chat_content.php” height=”300″
width=”100%”></iframe>
<iframe name=”say” height=”0″ width=”0″></iframe>
<form method=”POST” target=”say” action=”./say.php”
onsubmit=”submitChat(this)”>
<input type=”text” size=”30″ name=”content” /> <input
type=”button” value=”say” onclick=”submitChat(this.form)” />
</form>
</html>

<?php
header(“Content-Type: text/plain”);
set_time_limit(0);

<?php

<?php
header("Content-Type: text/plain");
set_time_limit(0);

$infoString = "Hello World" . "\n";
while( isset($infoString) )
{
echo $infoString;
flush();
ob_flush();
sleep(5);
}
?>

另外叁个正是保留用户提交的闲谈内容了,作者简单的写一下文书,况兼从不做什么锁定,那么些只是粗略版本:

$infoString = “Hello World” . “\n”;
while( isset($infoString) )
{
echo $infoString;
flush();
ob_flush();
sleep(5);
}
?>

echo “每隔3秒输出三遍<br />”;

当大家实践后,每隔5分钟,大家会获得一条龙 Hello World
,借使不按停止开关,浏览器会不停的一行一行继续加载。

复制代码 代码如下:

澳门葡京备用网址,当大家实施后,每隔5分钟,我们会拿走一条龙 Hello World
,假诺不按截止按键,浏览器会不停的一行一行继续加载。

set_time_limit(0); //保障php程序运转不过期退出

通过这一措施,大家能够形成非常多职能,举例机器人爬虫、即时留言板等次第。

<?php
$content = trim($_POST[‘content’]);
if ($content) {
$fp = fopen(‘./chat.txt’, ‘a’);
fwrite($fp, $content . “\n”);
fclose($fp);
clearstatcache();
}
?>

经过这一艺术,大家能够做到比非常多功用,举个例子机器人爬虫、即时留言板等程序。

while(1) {

版权申明:本文为博主原创小说,未经博主允许不得转发。

  接下去看首要的HTTP长连接部分,也正是chat_content.php文件:

你也许感兴趣的篇章:

  • 依附HTTP长连接的”服务器推”技巧的php
    简易聊天室
  • 听别人讲php完成长连接的主意与注意事项的题目
  • PHP扩展模块memcached长连接使用格局深入分析
  • 座谈菜鸟怎么着学习PHP互联网编制程序
  • PHP的Socket互连网编制程序入门教导
  • PHP网络操作函数汇总
  • 运用php来促成网络服务
  • PHP+Ajax
    检查评定网络是不是健康实例详解
  • 运用php4加速互联网传输
  • php判别是或不是连接上互联网的主意实例详解
  • PHP
    Socket网络操作类定义与用法示例
  • PHP长连接完结与应用办法详解

   echo date(“H:i:s”).”<br />”;

复制代码 代码如下:

   ob_flush();

<?php
header(‘cache-control: private’);
header(‘Content-Type: text/html; charset=utf-8’);
//测量检验设置30秒超时,一般会安装比较长日子。
set_time_limit(30);
//这一行是为着化解IE这么些BT
echo str_repeat(‘ ‘, 256);
ob_flush();
flush();
$fp = new SplFileObject(‘./chat.txt’, ‘r+’);
$line = 0;
$totalLine = 0;
while (!$fp->eof()) {
$fp->current();
$totalLine++;
$fp->next();
}
$fp->seek($totalLine);
$i = $totalLine – 1;
while (true) {
if (!$fp->eof()) {
if ($content = trim($fp->current())) {
echo ‘<div>’;
echo htmlspecialchars($content);
echo “</div>”;
flush();
$fp->next();
$i++;
}
} else {
$fp->seek($i – 1);
$fp->next();
}
{
//这里能够增加心跳检查评定后退出循环
}
usleep(1000);
}
?>

   flush(); //刷新并出口PHP缓冲数据

  作者一行行解释一下,其实也比较轻巧明白:
  06.
设置三个逾期时间,由于要维持HTTP长连接,这么些日子必供给相比长,只怕要多少个钟头吗,上边提到的篇章里也是有表达,这种HTTP长连接只可以展开八个,由于浏览器的范围。其它其实即使你设置了一个永不超时,其实上服务器部分(如Apache)的配置文件也也许对HTTP央求设置了最长等待时间,所以也说不定功能会不是您想的,一般暗中认可恐怕都以15秒钟超时。假诺风野趣可以团结尝试修改。
  09.
这里出口了一段空白,首假诺手册上曾经评释了,IE浏览器在头里256个字符是不会直接出口的,所以大家先随便输出些空白,以便让前边的开始和结果输出来,可能别的浏览器也是有任何浏览器的安装,具体能够查阅PHP手册的frush函数的辨证。接下去11、12行正是强制把那么些空白符丢给浏览器输出。
  13. ~ 20. 这里最主假如为了总计文件行数,以便从这一行前边初阶读内容。
  接下去的while循环正是贰个死循环了,就是循环输出文件内容,每一次决断是或不是到达文件末尾,假诺有用户写入文件,则当前检查测试肯定不是文本末尾,就将该行读收取来输出,不然将指针往前挪动一行,继续循环,每一遍等待一千飞秒,
  39.
举个例子直白维系长连接,那么即便客户端断开,服务端也不必然能知道客户端已经断开,所以那边恐怕还亟需做一些心跳记录,比如每一种用户保持一个心跳flag,每格几秒更新一下终极心跳时间,当检查测验最终时刻非常久没更新后,推出那个死循环,关闭那些HTTP连接。
  OK,基本上原理就是那样了,当然这么些天性不明白,有意思味的友善试试,招待沟通。

   sleep(3); //延迟3秒

你恐怕感兴趣的小说:

  • 基于php达成长连接的主意与注意事项的标题
  • PHP扩张模块memcached长连接使用方法深入分析
  • PHP
    set_time_limit(0)长连接的贯彻分析
  • 座谈新手如何学习PHP网络编制程序
  • PHP的Socket互联网编制程序入门教导
  • PHP网络操作函数汇总
  • 应用php来贯彻互联网服务
  • PHP+Ajax
    检查测验网络是还是不是符合规律实例详解
  • 接纳php4加快网络传输
  • php判别是还是不是连接上网络的法子实例详解
  • PHP
    Socket互连网操作类定义与用法示例
  • PHP长连接完成与使用方式详解

}

?>

示范代码2:

复制代码 代码如下:

set_time_limit(0);

header(“Connection:Keep-Alive”);

header(“Proxy-Connection:Keep-Alive”);

for($i=0;$i<60;$i++) {

   print ‘text’.$i.'<br>’;

   ob_flush();

   flush();

   sleep(1);

   clearstatcache();

}

那边调用了ob_flush();  
flush();来强制输出数据到缓冲区,那样就会在脚步再次回到从前及时回到数据到浏览器。另外不冲下flush和ob_flush的选择上有一点点专程轻便犯错的地方,变成不能够刷新输出缓冲。

一. flush和ob_flush的没有错顺序,精确应是,先ob_flush再flush,如下:

ob_flush();

flush();

一旦Web服务器的操作系统是windows系统,那顺序颠倒大概不应用ob_flush()也不会晤世难题。可是在Linux系统上就无法刷新输出缓冲。
 

二. 使用ob_flush()前,确认保证前面包车型大巴开始和结果大小丰裕4069字符。

局部Web服务器的output_buffering默许是4069字符也许越来越大,即出口内容必须达到规定的规范4069字符服务器才会flush刷新输出缓冲,为了保障flush有效,最棒在ob_flush()函数前有以下语句:

print str_repeat(” “, 4096);

以保障达到output_buffering值。

复制代码 代码如下:

for ($i=10; $i>0; $i–)

{

echo $i.'<br />’;

ob_flush();

flush();

sleep(1);

}
ob_end_flush();

你或者感兴趣的稿子:

  • 二19个php操作redis常用方法代码例子
  • php
    Session存储到Redis的方法
  • php操作redis中的hash和zset类型数据的艺术和代码例子
  • 在PHP中使用redis
  • php结合redis达成高并发下的抢购、秒杀功效的实例
  • PHP实现操作redis的封装类完整实例
  • php中采纳redis队列操作实例代码
  • PHP中redis的用法深切剖判
  • PHP的Laravel框架结合MySQL与Redis数据库的应用安插
  • PHP长连接实现与使用方法详解
  • PHP扩充模块memcached长连接使用格局深入分析
  • PHP使用Redis长连接的方法详解

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website