利用UDP来debug PHP

来源:互联网 发布:win764位系统优化 编辑:程序博客网 时间:2024/04/28 17:56

学习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,以上代码基本能够满足需求。

0 0
原创粉丝点击