分类 php 下的文章 - 青蓝鱼的博客-没有bug的代码是不完美的
分类 php 下的文章 - 青蓝鱼的博客-没有bug的代码是不完美的
终于找到这篇文章了,感谢作者的分享!
https://fishfive.top/index.php/archives/29/
终于找到这篇文章了,感谢作者的分享!
受益匪浅,感谢博主。
该回复疑似异常,已被系统拦截!
1
111
666
# 图片回复
666
学到了
666
hello word
首页
关于
?
归档
留言
统计
导航
更多
github
友链
推荐
百度
搜 索
1
Nginx-Quic重新编译Nginx支持HTTP3
356 阅读
2
Centos7和Centos8网卡配置
269 阅读
3
六种好看的css按钮效果
189 阅读
4
node.js简单的web服务demo
159 阅读
5
JavaScript实现静态图片局部流动效果
156 阅读
默认分类
html
css
JavaScript
React
Vue
Git
centos
node.js
php
nginx
http
登录
搜 索
https://fishfive.top
累计撰写
27
篇文章
累计收到
16
条评论
首页
栏目
默认分类
html
css
JavaScript
React
Vue
Git
centos
node.js
php
nginx
http
页面
关于
归档
留言
统计
导航
github
友链
推荐
百度
用户登录
登录
找到
2
篇与
php
相关的结果
2022-10-03
PHP在线人数统计
方案一<?php //首先你要有读写文件的权限,首次访问不显示,正常情况刷新即可 $online_log = "slzxrs.dat"; //保存人数的文件到根目录, $timeout = 30;//30秒内没动作者,认为掉线 $entries = file($online_log); $temp = array(); for ($i=0;$i<count($entries);$i++){ $entry = explode(",",trim($entries[$i])); if(($entry[0] != getenv('REMOTE_ADDR')) && ($entry[1] > time())) { array_push($temp,$entry[0].",".$entry[1]."\n"); //取出其他浏览者的信息,并去掉超时者,保存进$temp } } array_push($temp,getenv('REMOTE_ADDR').",".(time() + ($timeout))."\n"); //更新浏览者的时间 $slzxrs = count($temp); //计算在线人数 $entries = implode("",$temp); //写入文件 $fp = fopen($online_log,"w"); flock($fp,LOCK_EX); //flock() 不能在NFS以及其他的一些网络文件系统中正常工作 fputs($fp,$entries); flock($fp,LOCK_UN); fclose($fp); $tj= "在线人数:".$slzxrs."人"; ?>将以上代码放到要显示文件的最顶部,之后再要显示此统计的地方加上此输出:<?php echo $tj?>方案二<?php $filename = 'online.txt'; //数据文件 $cookiename = 'VGOTCN_OnLineCount'; //cookie名称 $onlinetime = 600; //在线有效时间,单位:秒 (即600等于10分钟) $online = file($filename); $nowtime = time(); $nowonline = array(); /* @ 得到仍然有效的数据 */ foreach($online as $line) { $row = explode('|',$line); $sesstime = trim($row[1]); if(($nowtime - $sesstime) <= $onlinetime) { //如果仍在有效时间内,则数据继续保存,否则被放弃不再统计 $nowonline[$row[0]] = $sesstime; //获取在线列表到数组,会话ID为键名,最后通信时间为键值 } } /* @ 创建访问者通信状态 使用cookie通信 COOKIE 将在关闭浏览器时失效,但如果不关闭浏览器,此 COOKIE 将一直有效,直到程序设置的在线时间超时 */ if(isset($_COOKIE[$cookiename])) { //如果有COOKIE即并非初次访问则不添加人数并更新通信时间 $uid = $_COOKIE[$cookiename]; } else { //如果没有COOKIE即是初次访问 $vid = 0; //初始化访问者ID do { //给用户一个新ID $vid++; $uid = 'U'.$vid; } while (array_key_exists($uid,$nowonline)); setcookie($cookiename,$uid); } $nowonline[$uid] = $nowtime; //更新现在的时间状态 /* @ 统计现在在线人数 */ $total_online = count($nowonline); /* @ 写入数据 */ if($fp = @fopen($filename,'w')) { if(flock($fp,LOCK_EX)) { rewind($fp); foreach($nowonline as $fuid => $ftime) { $fline = $fuid.'|'.$ftime."\n"; @fputs($fp,$fline); } flock($fp,LOCK_UN); fclose($fp); } } echo 'document.write("'.$total_online.'");'; ?>通过注释中的说明可知,如下js语句访问即可:<script src="online.php"></script>
2022年10月03日
50 阅读
3 评论
0 点赞
2022-06-17
php模拟复现http错误码:499,500,502,504
Status Code 499、500、502、504也是后端Http服务经常返回的状态码,试想一下,对于每个状态码,如果你能通过一些修改或配置来人为复现它,是不是会更利于你去掌握它呢?本文就是通过动手复现的方式来学习它们。502,504在超时的场景下会比较像,经常有人不能区分它们。499产生的原因也常常会和504会有内在的关联,你都了解吗?本文不光复现它们,而且会循序渐进,在对比之中复现它们。下面所有复现的场景,修改nginx或者php-fpm的配置后,记得要重新启动。复现环境说明系统环境和软件环境为:Linux,Nginx,php-fpm。再来介绍一下本文复现会用到的Nginx和php-fpm的几个配置。#nginx超时相关配置: fastcgi_connect_timeout 5; # nginx连接fastcgi的超时时间 fastcgi_send_timeout 10; #nginx往fastcgi发送参数的超时时间 fastcgi_read_timeout 10; #nginx从fastcig获取数据的超时时间php-fpm配置: ; The timeout for serving a single request after which the worker process will ; be killed. This option should be used when the 'max_execution_time' ini option ; does not stop script execution for some reason. A value of '0' means 'off'. ; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) ; Default Value: 0 ; 翻译过来就是指一次请求的最长执行时间 request_terminate_timeout = 30s所有复现场景都是在nginx根目录下创建一个test.php文件,然后通过访问http://127.0.0.1/hello.php 来查看http响应code,test.php代码如下:<?php sleep(7); // 通过调整sleep秒数,来达成不同的复现 echo 'hello world'; ?>502定义502,Bad Gateway,网关错误,它往往表示网关从上游服务器中接收到的响应是无效的。先来了解一下网关是什么含义,从宏观定义上来说只要连接两个不同的网络的设备都可以叫网关,其实具体到应用层Http请求这一领域,网关就是指是转发其他服务器通信数据的服务器,对于本文的复现环境而言,当客户端请求数据到达nginx,nginx负责把请求转交给fastcgi(即php-fpm)进行处理,那么在这个场景中Nginx就是网关。502并不是指网关本身出了问题,而是从上游接收响应出了问题,比如由于上游服务自身超时导致不能产生响应数据,或者上游不按照协议约定来返回数据导致网关不能正常解析。复现路径1关闭php-fpm进程,返回502。这个比较容易理解,参照上面的定义,因为php-fpm进程关闭,nginx连接不上php-fpm,即nginx不能收从上层接收到响应数据。nginx 错误日志如下:connect() to unix:/home/work/server/php-cgi.sock failed (2: No such file or directory) while connecting to upstream复现路径2启动php-fpm进程,修改php-fpm.conf的request_terminate_timeout和php代码的sleep时间来复现。php代码: <?php sleep(7); echo 'hello world'; ?>php-fpm.conf配置:request_terminate_timeout=5nginx配置:fastcgi_read_timeout 10;php-fpm.conf设置的最大执行时间是5s,但是php脚本需要的执行时间大于7s,所以php-fpm进程执行5s时就回退出,此时php脚本没有正常执行完成,所以返回给网关Nginx的数据异常,于是导致502。php-fpm错误日志如下:script '/home/work/webroot/hello.php' (request: "GET /hello.php") execution timed out (5.161544 sec), terminatingnginx错误日志如下:recv() failed (104: Connection reset by peer) while reading response header from upstream504定义504,Gateway Timeout,网关超时。它表示网关没有从上游及时获取响应数据。注意它和502在超时场景下的区别,502是指上游php-fpm因为超过自身允许的执行时间而不能正常生成响应数据,而504是指在php-fpm还未执行完成的某一时刻,由于超过了nginx自身的超时时间,nginx则以为上游php-fpm没有按照设置时间返回响应数据就会返回504, 此时对于php-fpm而言还会继续执行下去,直到执行完成。复现路径php代码<?php sleep(7); echo 'hello world'; error_log("test", 3, "/tmp/test.log"); ?>php-fpm.conf配置:request_terminate_timeout=30 nginx配置fastcgi_read_timeout 5;test.php脚本执行时间需要7s,远小于php-fpm的一次请求的最大请求时间30s,所以php脚本可以正常完成执行,这个可以查看/tmp/test.log文件内容来得到证明。由于nginx从php-fpm读取数据的超时时间为5s,所以在5s的时科,nginx还未从php-fpm获取到响应数据,于是返回504。nginx错误日志如下:upstream timed out (110: Connection timed out) while reading response header from upstream499499, Client Closed Request, 客户端主动断开连接。是指一次http请求在客户端指定的时间内没有返回响应,此时,客户端会主动断开连接,此时表象为客户端无响应返回,而nginx的日志中会status code 为499。此状态码在浏览器请求时几乎不可见,因为浏览器默认的超时时间会很长。多见于服务之间的调用,在业务架构中常常会分层设计,拆分为不同的子系统或者微服务,这样系统之间就会常常通过http方式来请求,并且会设置每次请求的超时时间,当请求在请求时间内所调用的上游服务无返回,则会主动关闭连接,上游服务日志中会记录一条499。复现路径我们用上面504复现时相同的代码和配置。我们在linux终端使用curl命令来请求,-m 表示超时时间,单位为秒curl:(28) Operation timed out after 3004 milliseconds with 0 bytes receivednginx的access日志的code为499,如下:"HEAD /test.php HTTP/1.1" 499 0500定义500, Internal Server Error , 服务器内部错误,服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。日常开发中500错误几乎都是由于php脚本语法出现错误导致php-fpm无法正常执行。复现路径php代码:<?php echo 'hello ' echo ' world'; ?>由于php代码语法错误,php-fpm执行失败,然后告诉nginx这一结果,nginx则返回500。php错误日志:PHP Parse error: syntax error, unexpected 'echo' (T_ECHO), expecting ',' or ';' in /home/work/webroot/test.php on line 3总结499是由于超过客户端设置的请求超时时间,客户端主动关闭连接,服务器code为499。500多是由于代码语法错误,导致CGI执行错误并且会把错误结果通知服务器,服务器则报500。502是由于CGI由于在自身的执行时间要求内无法按时完成,则无法返回给服务器正常响应,此时服务器会返回502。504是CGI在服务器设置的超时时间内无法按时返回响应,服务器则返回504。499,502,504都会因为超时而产生,区别是超时超了谁的时,499是超了客户端本身的连接时间,502是超了CGI的执行时间,504是超了服务器本身的最大允许读取时间。
2022年06月17日
107 阅读
0 评论
0 点赞