利用UDP来debug PHP
学习PHP大概有一个多月,其中利用Thinkphp框架来做了一个小项目,在做项目的时候常常会遇到bug,bug出现的位置可能在前端的数据处理,也可能在控制器或者模型层中。如果出现在前端,可以用console.log()来打印变量值,但是如果出现在model层或者Controller里面,想调试程序打印中间变量就显得非常麻烦,有的情况下还不能利用var_dump()来输出变量值。如果可以像JAVA或者C++那样在控制台输出,并且不会影响浏览器的加载就好了,而以下就是实现这样的功能。
实现的思路是利用UDP协议,首先运行脚本(这里我选择用python3)监听本机的某个端口,在PHP(作为客户端)发送变量值到本机的端口里。然后服务器就接收到变量值并打印出来,这样就可以在不堵塞页面的情况下,获得PHP变量的值。
以下是利用python3来监听本地端口的代码
1 #!/usr/bin/env python3 2 import socket 3 import json 4 MAX_BYTES=65535*1024 5 def server(port): 6 sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) 7 sock.bind(('127.0.0.1',port)) 8 print('Listening at {}'.format(sock.getsockname())) 9 while True: 10 data, address=sock.recvfrom(MAX_BYTES) 11 data=json.loads(data.decode('utf-8')) 12 #print('The client at {} says {!r}'.format(address,text)) 13 print('note:{}value{}time{}'.format(data['note'],data['value'],data['time'])) 14 server(1060)
程序里面默认监听本地的1060端口,在不同机器上运行,可能会出现端口冲突,这时候自行更换端口值(1024-65535)就可以了。
如果成功命令行会出现
Listening at ('127.0.0.1', 1060)
然后在PHP中添加这样一个函数
/** * 使用该函数,需要先运行phpdebug.py脚本 * @param $val 要打印的变量值 * @param $note 变量的说明 * @param int $port 端口值,要与phpdebug.php一致 */ function phpdebug($val,$note,$port=1060) { $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); $msg['value']=$val; $msg['note']=$note; $msg['time']=date("Y-m-d G:i:s"); $msg=json_encode($msg); $len = strlen($msg); socket_sendto($sock, $msg, $len, 0, '127.0.0.1', $port); socket_close($sock); }
测试样例
$k=233; Phpdebug($k,’this is a test’);
运行正常会出现

注:一定要先运行py脚本,再使用该函数才有效。运行py脚本请先下载python3,打开方式选择python即可运行。在这里说了一个思路利用UDP协议来进行debug,用尽量少的代码来展示这一思路。但是这里一次传输的数据大小不能大于65536*1024bit,如果读者debug过程中可能会出现大的数据包,建议使用tcp协议并在phpdebug()方法里添加大小的判断。但如果只是简单的debug,以上代码基本能够满足需求。

浙公网安备 33010602011771号