php 的快速学习和掌握。

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]);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值