PHP がブラウザから積極的に切断する
以前、ブラウザクライアントについて解説する「PHP 接続処理における set_time_limit()、connection_status()、ignore_user_abort() の徹底分析」という記事をまとめました。切断時のサーバー PHP スクリプトの処理。
この記事では、サーバー PHP スクリプトがブラウザからアクティブに切断する方法について説明します。主な方法は、http プロトコル ヘッダーで Content-Length と Connection を使用することです
。Content-Length の役割: ブラウザーは、指定された Content-Length サイズのメッセージ エンティティを受信した後、サーバーから切断します。
接続の役割: ブラウザは、接続の Close または Keep-Alive を受信した後、接続を閉じるか、次のリクエストで現在の接続を使用し続けるかを決定します。
<?php /** * 自动断开与浏览器的连接 * jiaofuyou */ echo '1234567890'; //向浏览器输出的内容 {//断开连接的代码 $size=ob_get_length(); header("Content-Length: $size"); //告诉浏览器数据长度,浏览器接收到此长度数据后就不再接收数据 header("Connection: Close"); //告诉浏览器关闭当前连接,即为短连接 ob_flush(); flush(); } error_log(date("[Y-m-d H:i:s]")." > "."start" ."\n", 3 , "/usr/local/apache2219/logs/php_log"); //断开连接后的执行长时间操作 sleep(5); echo 'test213';//浏览器接收不到了 error_log(date("[Y-m-d H:i:s]")." > "."end" ."\n", 3 , "/usr/local/apache2219/logs/php_log"); //可以查看错误日志是否延迟5秒后执行. ?>
手順:
1. Content-length を単独で使用すると、実際には接続が切断されません。Connection: Close はブラウザに接続を閉じるよう指示するだけです。
2. file_get_contents に Content-Length を指定しても意味がありません。使用する場合は、curl を使用してください。
如果想让PHP不停的向浏览器输出内容:echo "1234567890"ob_flush();flush();这样是不会立刻输出到浏览器的,可以这样echo "1234567890 "//有换行时会立刻输出到浏览器ob_flush();flush();或者:echo "1234567890"print str_pad("",10000); //输出足够多的内容ob_flush();flush();