分类存档: php

PHP使用xdebug进行断点调试

PHP调试跟踪之XDebug使用总结:

Xdebug是一个开源的PHP程序调试工具,可以使用它来调试、跟踪及分析程序运行状态。当然,Xdebug需要结合PHP的编辑工具来打断点、跟踪、调试及分析,比较常用的PHP的Xdebug调试环境:VScode +Xdebug / ZendStudio + Xdebug / VIM+debug/ Sublime+Xdebug / phpstorm + xdebug。

效果

一、安装

1、在php运行环境安装xdebug
添加epel的remi原

rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

yum安装xdebug

yum install php-pecl-xdebug

也可以尝试使用

pecl install xdebug

使用vim 编辑/etc/php.d/xdebug.ini

zend_extension=/usr/lib64/php/modules/xdebug.so

xdebug.remote_enable = On
xdebug.remote_handler = "dbgp"
xdebug.remote_host = "10.99.99.10" 
;xdebug.remote_autostart = On
;xdebug.remote_connect_back = On
xdebug.remote_port=9000

我这里运行环境和开发ide不在一台电脑上。如在,remote_host可以使用127.0.0.1

2、在IDE上安装调试插件,zendstudio/phpstorm均默认自带不需要安装
sublime text3下安装插件 xdebug-client 或在vscode下安装php debug
下面介绍在vscode下的配置
将目录拖进vscode编辑器后,在调试菜单打开配置会出现luanch.json 如果运行环境和IDE所在环境目录不一样 需要在此配置映射pathMappings 例如:

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9000,
            "pathMappings": {
                "/PHP/test" : "/Users/sgf/Documents/PHP/test"
            }
        },
        {
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "port": 9000
        }
    ]
}

vscode左侧点击蜘蛛图标 上面点击调试即可启动监听9000 然后浏览器刷新访问 即可进入断掉调试。

需要说明的是,php-xdebug扩展中ini配置remote_autostart如果开启的话 每次php访问都会自动进入调试模式,如果不需要可以关闭此项,然后再chrome下安装xdebug-helper插件,插件中可以设置开启或者禁用调试状态,实就是在请求的时候加一个请求头(cookie等方式)告知服务器需要主动开启调试模式。

这种方式也支持对php-cli方式运行的php文件进行调试。

使用Nginx反向代理,多进程共享80端口

如果你需要不同的进程使用80端口(nginx与iis共同使用80)怎么办?
如果不想在你本地调试微信平台(微信非API要80端口,但是电信把80禁用了)怎么办?
如果你需要做均衡负载 怎么做?

名词解释:反向代理
总之就是你请求这个服务器,它负责帮你去请求别的服务器,把返回的结果再返回给你,在中间当传话筒。

nginx配置:

server { 
listen       80; 
#nginx绑定的的访问域名
server_name  test.sgfblog.com;   /
location / { 
#实际请求的地址
 proxy_pass http://sungfeng21.vicp.net:8088; 
 proxy_set_header   Host    $host; 
 proxy_set_header   X-Real-IP   $remote_addr; 
 proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
 }
} 

利用这个原理,同样都是80端口,可以把指定的站点转发到别的服务(端口)上,你的IIS换个别的端口对内网访问就OK啦~

php使用google authenticator动态密码认证

IMG_3028未命名-2

 

1、google authenticator和我们要干嘛?
不多说,总之就是一个开放给大家使用的第三方动态密码校验软件。原来  根据二维码或者自定义输入一串密钥,authenticator就会根据当前的时间戳和这个密钥算出一个动态密码,每30秒变化一次。这个计算是本地进行的,不需要依赖网络,算法也是公开的,所以你的后端也可以算一次 做校验。

2、代码:

以下用到的Token 和 qrcode2个类,下文章底部附件可以下载到。
校验动态密码。

<?php 

include "Token.php"; 
//$key 是需要保存下来的密钥,每次需要基于这个进行认证
//$token 是需要校验的6位动态密码
//ALLOW_MFA_TIME 是允许用户手机时间和服务器时间的前后时间差,因为这个动态密码是基于时间生成的。时间差的原来其实很简单, 帮你生成前后这个时间的所有token 跟你输入的有一个是一样的 就算OK。


$tr = Token::verify_key( $key, $token, ALLOW_MFA_TIME , Token::get_timestamp() );
 
 if($tr!==true)
 {
 echo "ok";
 }
else
{
 echo "failed";
}

生成密钥和二维码

1、密钥不要自己随便去生成几个字符,不是所有字符都能用的Token中有写好的静态方法可以生成

2、二维码的生成方式很多,可以依赖第3方的或者自己生成,甚至引入一张外部图片参数中传入内容也成。   二维码的内容在以下代码注释中介绍吧:

继续阅读 »

php 任意进制互转类

之前不知道php自带有base_convert可以实现任意进制之间的转换,自己写了一个。。。。
继续阅读 »

php常用技巧

1、写程序的时候会用到这种情况,比如对一个数字进行四舍五入取整。很多人会这样写:

input a
if a - int(a) >= 0.5 then
a =  a +1
end if

其实这个判断语句可以使用一个很简单的表达式来写

a =  fix(a + sgn(a) *0.5)

用php写作:

$a =  intval($a +  0.5 *  ($a >0 ? 1 : -1)  );

分析:
假设 a为 4.4 那么 a+0.5 = 4.9 intval()以后为4 ,假设a为4.6 a+0.5=5.1 那么intval()以后则为5,因此实现了四舍五入。
正数+0.5 , 负数则-0.5。

如果说四舍五入保留2位小数也同理。

$a = intval<strong>(</strong>a * 100 + 0.5 * ($a >0 ? 1 : -1) <strong>)</strong> /100。 

2、 求如果a-b的值,如果小于0则取0,可以写城

$result =  max(0,$a-$b);

3、导入数据时,可以选择采用csv格式 php对getcsv处理起来非常方便。

4、在替换字符串方面 str_replace()比正则表达式更高效。实际上,根据Making the Web所说,str_replace()比像ereg_replace()和 preg_replace()这样的正则表达式效率要高61%。

5、if($a==true) if($a)

6、用isset判断变量和元素是否存在速度较高

7、尽量使用三目运算

8、适当写if行语句。适当在function内使用return语句 减少分支

9、使用memcache mogodb等降低程序与数据库负担

10、临时数据可以使用sqllite记录

php is_null, empty, isset 的区别

isset 判断变量是否已存在
empty 判断变量是否为空或为0
is_null 判断变量是否为NULL

变量 empty is_null isset
$a=”” true false true
$a=null true true false
var $a true true false
$a=array() true false true
$a=false true false true
$a=15 false false true
$a=1 false false true
$a=0 true false true
$a=”0” true false true
$a=”true” false false true
$a=”false” false false true

php数据库之 – 自认为不错的一个mysql类

一个自认为不错的php mysql 类,由discuz的mysql类整理而来的~
继续阅读 »