php 的快速学习和掌握。
为什么能快速?
是因为我们有强大的工具。能够解决我们学习中遇到的问题。
这里附上一个完善的工具组合
读完了本贴,你并没有掌握php, 但是教给了你一种方法。
1. 阅读参考书 <<php 从入门到精通>>
2. 参考代码,上面书的pdf 文档及代码自己从网上搜索
3. 自编的一个lookup 程序 。用来查询函数的使用。代码见后。
4. php 手册。/usr/share/doc/php-doc/html 下, 查询函数用法
5. 大名鼎鼎的 wireshark, 用来进行网络数据监控。
6. 前端调试利器 firebug, 用来调试前端html,css,js.
7. php 开发环境。 vim + xdebug + DBGp.
有人说,一个notepad 就可以进行php编程,为什么要搞这么复杂的开发环境?
答:nodepad 编程相当于步行, 上述环境复杂,相当于坐上了飞机。
如果你想出门远行,还是做飞机快,如果只是从卧室到厨房,步行就够了,看你的应用场景。
下面较为详细的介绍一下上述环境,
注意只记录了一些重要问题,解决办法。
写的比较简单,还有问题可以留言,可以百度。
----------------------------------------
1. 阅读别人的代码,看到了一个内置函数,
怎样查找其在哪个模块中,怎样查找它的使用方法。
----------------------------------------
在c语言中,可以tag 到头文件,可以用man page,
php 怎样解决这个问题呢?
a. 需要编一个简单的查找程序, 接受命令行参数提供查找关键字
b. 如果找到了所属模块,把模块中包含函数都打印出来,为我们能扩展打下基础。
/* php 内置函数名称查找及模块函数打印 */
cat lookup.php
<?php
#print_r(get_loaded_extensions());
#print_r(get_extension_funcs("Core"));
#print_r(get_defined_functions());
function findFunctions()
{
global $argv;
$extions = get_loaded_extensions();
foreach($extions as $e)
{
$funcs=get_extension_funcs($e);
if(in_array($argv[1],$funcs))
{
print_r($funcs);
return $e ." --> ". $argv[1];
}
}
}
if($argc<2)
{
echo "please input <name> to lookup\n";
exit(1);
}
echo "search $argv[1]\n";
$ret = findFunctions($argv[1]);
echo "$ret\n";
通过这个函数我知道,php 7.2框架(我的机器)加载了48个模块,其中有的模块包含几百个函数.
再提供一个工具函数, 该函数能够打印调用堆栈, 当程序出错,退出时查找代码很方便.
var_dump(debug_backtrace());
----------------------------------------
2. 阅读 php 手册. 查找函数用法
----------------------------------------
可以根据函数名称直接到
/usr/share/doc/php-doc/html
目录下找函数说明手册页
ubuntu18 下
/usr/share/doc/php 已经是空目录了,可以从官网下载帮助文件放到这里.
单html文件 html.gz 文件, 不要下载, firefox 打开这个文件太大,太慢,所以不适合.
多html文件 .tar.gz, 适合阅读,下载它解压缩. 可先打开index.html 或者 indexes.html
----------------------------------------
3. 其它, php 应知的便捷操作
----------------------------------------
php 函数,vim语法高亮就是一个很好的php 函数名称集合,
php的命令行模式
php -r 'echo "hello world\n";' // 输出hello world
php -r 'print_r(get_defined_constants());' // 打印php中已经定义过的常量
php -r 'echo "$argc\n";print_r($argv);' abc 1 2 3 //打印命令行参数
php -r 'echo phpinfo();'
----------------------------------------
4. wireshark 怎样在普通用户模式下运行
----------------------------------------
问题:
以普通用户运行wireshark, 接口列表是空的。
原因:/usr/bin/dumpcap需要root权限才能使用的,
普通用户无法使用dumpcap进行截取封包。
用超级用户运行wireshark
Running as user "root" and group "root".
This could be dangerous.
得到的封包数据都是root的,危险!
----------------------------------------
解决办法:
----------------------------------------
创建一个组,让普通用户属于这个组,把文件dumpcap组属性设置为该组,
让dumpcap 具有root权限。
具体操作:
1. 添加wireshark 组
sudo groupadd wireshark
2. wireshark 组添加普通用户(例如我的用户为hjj)
sudo gpasswd -a hjj wireshark
3. 更改dumpcap 的组属性
sudo chgrp wireshark /usr/bin/dumpcap
4. 使dumpcap 具有root权限
sudo chmod 4755 /usr/bin/dumpcap
这个4表示其他用户执行文件时,具有与所有者相当的权限。
用普通用户运行,接口列表正常了。
----------------------------------------
5. 前端调试,有firebug, 这里不详述。
----------------------------------------
----------------------------------------
6. 后端调试,php 调试环境的搭建, 这是本博最关键部分
----------------------------------------
仅靠echo 语句有时是不行的,
复杂的代码结构中,我们必需关注某些代码行时,必需关注某些数据时,
停下来,检查数据,单步执行等是我们所需要的。
关键的时候,我们需要详细的了解我们的环境。
我们需要 中断: 单步: 查看内存:
Vim + Xdebug + DBGp 调试php
----------------------------------------
6.1. vim +python +sign
python 2.0+
要求vim 支持phthon接口,支持sign, 当然了,我还要让他支持剪贴板,支持gdb, 源码编译不可免。
python 版本一般都能满足。
----------------------------------------
6.2. php5 + xdebug
apt-get install php5-xdebug
安装php5 后,再安装xdebug, 下面是xdebug 配置实例
$cat xdebug.ini
zend_extension=/usr/lib/php5/20121212/xdebug.so
;debugging
xdebug.remote_enable = 1
xdebug.remote_host = localhost
;php-fpm 使用unix socket 或其它端口
xdebug.remote_port = 9000
xdebug.remote_handler=dbgp
----------------------------------------
6.3. DBGp 为vim Debugger 插件
http://www.vim.org/scripts/script.php?script_id=1929
debug.vim 里面可以设置端口,默认9000
debugger.py 里面可以设置等待时间,默认5秒,建议改为30
551 print 'waiting for a new connection on port '+str(self.port)+' for 30 seconds...'
556 serv.listen(30)
666 socket.setdefaulttimeout(30)
----------------------------------------
6.4. 使用:
6.4.1: 用浏览器调试。
用vim 打开待调试的php 文件
press <F5> and
browse php file within 5 seconds
这里是一个服务端,默认端口9000, 等待远程的连入。
浏览器中输入:
http://example.com/test.php?XDEBUG_SESSION_START=1
xdebug 将会与服务器建立连接。
服务器接受键盘控制命令执行并返回结果到视图。
查看或更改debuger.vim,
如果你更改了命令定义, 把debuger.py 的对应提示信息也改一下
常用命令: 下面是我更改的,匹配自己的环境
F11:获取所有变量内容,
F12:获取当前光标下的变量值(为已执行过的代码部分中的变量),
F2: run
F3: quit
F7,F8,F9: step_into, step_over, step_out.
:Bp 设置断点。 把光标定位到代码行上,执行:Bp 就可以了。,e可以查看变量的值,还是很方便的.
关于vim 在 php 文件中输入<F2>, 出现AttributeError 问题.
(<type 'exceptions.AttributeError'>, AttributeError("DbgProtocol instance has no attribute 'stop'",), <traceback object at 0x7fdc8f053be0>)
是的,根本没有等待30秒, 时间不长就出错, 我的解决办法是延长了xdebug.remote_timeout时间,由默认的200改为了2000 (从phpinfo())可以看到.
xdebug.remote_timeout=2000
并打开了trace 选项, 跟踪错误.
xdebug.auto_trace = on
xdebug.show_error_trace = on
xdebug.show_exception_trace = on
xdebug.trace_output_dir = "/tmp"
实验结果, 只要在它未出现错误之前(大概有10來秒时间),及时从浏览器输入调试信息,还是可以中断的.
然后可以单步执行. 并不需要浏览器中输入XDEBUG_SESSION_START=1
所以虽没有完美解决问题,但还是可以使用的, 可能算带病工作吧, 并不影响使用.
不过这些跟踪选项最后还是关闭,否则会引起其它问题. 例如phpmyadmin 中显示数据库有点问题,会有
mysqli_init(): Property access is not allowed yet
使得它的计算影响的行数等不能正常工作, 关闭xdebug trace, 可恢复正常.
有了vim php debugger, 夫复何求!
查找函数在哪个扩展中是如此的重要,我再给出另一个简化查找版本,能够找到函数在数组中的索引.
进一步明确其在数组中的位置, 当然,打印数组前面已经给出了.
<?php
#print_r(get_loaded_extensions());
#print_r(get_extension_funcs("Core"));
#print_r(get_defined_functions());
function findFunction()
{
global $argv;
$extentions = get_loaded_extensions();
foreach($extentions as $e)
{
$funcs=get_extension_funcs($e);
$key=array_search($argv[1],$funcs);
if($key)
{
echo "(function name):" . $argv[1] ."\n";
echo "(extension name):" . $e . "\n";
echo "(key/array size):" . $key . "/" . count($funcs) . "\n";
break;
}
}
}
if($argc<2)
{
echo "please input <name> to lookup\n";
exit(1);
}
findFunction($argv[1]);