分类 "Php" 的存档.

linux下vim实现php远程调试环境搭建:vim DBGp+xdebug+xdebug helper实现方便的远程开启Debugging, profiling & tracing

首先是必需组件的安装。
有三个,vim的DBGp插件,php的xdebug扩展,Chrome浏览器的xdebug helper扩展。

一: vim 安装 dbgp client 插件
下载 DBGp client

$ cd ~/.vim/
$ wget http://www.vim.org/scripts/download_script.php?src_id=7285 -O debugger.zip
$ unzip debugger.zip

二:PHP安装xdebug扩展
具体安装方法就不讲了,网上例子很多.官方安装说明.
我把我的配置信息贴出来:
sudo vim /home/s/apps/php-5.2.6/etc/include/xdebug.ini

[Xdebug]
zend_extension="/home/s/apps/php-5.2.6/lib/php/extensions/no-debug-non-zts-20060613/xdebug.so"
xdebug.profiler_enable=0    ;开启profile
xdebug.profiler_enable_trigger=1    ;使用触发器开启profile
xdebug.profiler_output_dir="/home/s/logs/xdebugLog"
xdebug.auto_trace=0     ;开启trace
xdebug.trace_enable_trigger=1   ;使用触发器开启trace
xdebug.trace_output_dir="/home/s/logs/xdebugLog"
xdebug.cli_color=1
xdebug.collect_params=2
xdebug.collect_return=on

;remote debug   ;开启远程调试
xdebug.remote_enable=1
xdebug.remote_autostart=Off
xdebug.remote_port=9000	;远程端口,不是你web服务的端口,如果没有冲突,一般不用修改。

其中需要注意的是有注释的地方,不自动开启profile和trace,因为这样每次请求都会保存相应信息,会把磁盘爆掉的。把触发器打开,这样,只有在请求的时候带特定信息的时候,才会记录相应的性能信息。触发器的实现机制是:在请求时,如果GET/POST/COOKIE信息中包含特定的变量,会开启对应的debug,profile或trace,所以我们可以通过在web中访问页面时,添加对应的变量来开启相应的功能。如果每次都自己拼接这个,也挺麻烦,所以会介绍后边的xdebug helper的chrome扩展,想开启任何一个功能的时候,点击一下扩展就可以了。也就是说,这个扩展不是调试必须的,但是会让你感觉用起来很方便。

三:chrome扩展xdebug helper
地址:https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc
如果在 chrome://apps里搜索xdebug helper搜索不到,记得把你的语言改为 English.

xdebug-helper-introduction20140226142342

xdebug-helper-introduction20140226142342


xdebug helper两处配置要注意,
IDE Key要注意选择Other, 值为1,然后保存。
第二个是domain白名单,如果不希望每个页面都出调试的debug icon,就把开发时的域名填进来,比如localhost神马的。其实icon很小,也不太碍事,可以不用设置。

开始使用
如果不要debug调试,只是需要记录profile和trace信息,看一下性能问题,那么很简单,直接在chrome访问对应的url,会在url右侧看到一个xdebg helper 的小icon,点击后,选择 profile或trace,再刷新,就可以在预先设置的目录见到对应的文件了。
cachegrind* 是profile的文件,trace* 是trace的文件。
在windows下使用WinCacheGrind可以方便的查看profile的信息。

xdebug_helper_debug_profile_trace

xdebug_helper_debug_profile_trace

xdebug_output_file_trace_profile

xdebug_output_file_trace_profile

winCacheGrind_output

winCacheGrind_output

最后,是如何开启远程调试.
用vim编辑程序文件,在需要中断的地方使用:Bp命令打上断点。然后按F5执行监听。

这个时候,vim会提示 waiting for a new connection on port 9000 for 5 seconds… ,所以这个时候你需要在5s内向服务端发起带中断的请求,在前边的url地址,我们把xdebug helper的debug选择上,刷新页面,vim就会进入中断了。右侧有相关提示,我们就可以按GDB的方式逐步调试啦。如果没有安装xdebug helper,也无所谓,自己手动在url上拼接一个参数: &XDEBUG_SESSION_START=1 也可以开启远程调试的。

xdebug_remote_debug_how

xdebug_remote_debug_how

nginx client intended to send too large body 却没有触发error_page 413

在做以图搜图时,需要用户上传图片,同时需要对用户上传图片做大小限制。
如果文件全部上传到服务器了,可以用$_FILES变量来获取文件信息,判断文件大小,来决定是否拒绝用户的请求。
不过当文件过大时,会直接出发nginx的413 Request Entity Too Large 错误,如何友好的来提示用户呢。
这里就可以用到nginx的error_page用法了,直接指定413的错误跳转到一个指定页面,在指定页面内友好提示即可。

client_max_body_size 3M; #限定nginx允许上传的文件大小

#错误提示页面,指定哪个错误跳转到哪个页面,url可以是一个Action的路径
error_page 404 /404.html;
error_page 413 /stu?a=error413;
error_page 500 502 503 504 /50x.html;

这样设置了之后,就可以使用了,当上传的文件过大时,会直接被nginx拦截到413错误,进而重定向到友好的错误提示页。
不过在一次bug修复之后,发现再提交过大的文件时,没有出现这个提示页面了,而是等了很长时间之后出现了一个500错误,而且500错误也没有被拦截到50x的错误页面,很是奇怪。排查了下nginx日志,出现的错误提示就是 client intended to send too large body: 4224579 bytes.

排查了一会之后,再测试环境下打开错误输出,发现原来是413重定向后的Action在视图里有php语法错误。修复之后,就又恢复正常啦。

client intended to send too large body

client intended to send too large body

php configure 错误:configure: error: xml2-config not found. Please check your libxml2 installation.

开发php扩展时,php buildconf 时报错:

You should not run buildconf in a release package.
use buildconf --force to override this check.

这个很简单,一看就明白了,只要使用 ./buildconf –force 即可通过。

php configure时错误:
Configuring extensions
checking whether to enable LIBXML support... yes
checking libxml2 install dir... no
checking for xml2-config path...
configure: error: xml2-config not found. Please check your libxml2 installation.

这个是由于缺少libxml2包的原因,使用sudo yum install libxml2 执行后,安装了libxml2包,结果还是提示这个错误,执行rpm -qa|grep libxml2,发现是有libxml2的包的,后来发现,其实需要的是libxml2-devel 包,所以,正确的解决办法是,安装libxml2-devel包,执行 sudo yum install libxml2-devel 即可。

再重新configure, 出现下图即是正常了.

configure: error: xml2-config not found. Please check your libxml2 installation.

configure: error: xml2-config not found. Please check your libxml2 installation.

[libiconv_open]collect2: ld returned 1 exit status make: *** [sapi/cgi/php-cgi] 错误 1

编译php时出现错误

xmlrpc/libxmlrpc/encodings.c:73: undefined reference to `libiconv_open'
xmlrpc/libxmlrpc/encodings.c:81: undefined reference to `libiconv'
xmlrpc/libxmlrpc/encodings.c:101: undefined reference to `libiconv_close'
collect2: ld returned 1 exit status
make: *** [sapi/cgi/php-cgi] 错误 1

是由于没有安装 libiconv包,又没有yum源,无法通过yum直接安装,还需要自己手动来。
先安装libiconv:

wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
tar -zxvf libiconv-1.14.tar.gz
cd libiconv-1.14
./configure --prefix=/usr/local
make
sudo make install

然后重新configure php,再make就ok..

./configure --with-iconv=/usr/local
make clean
make

nginx与HTTP_X_FILENAME

在实现一个html5异步批量上传文件的功能时,遇到一个例子,使用xhr进行post提交,会模拟一个HTTP_X_FILENAME请求头,可是这个请求信息$_SERVER[‘HTTP_X_FILENAME’] 只有在apache下才能获取到,在nginx下无法获取。所以可以简单粗暴的,直接获取输入流(php://input)进行判断。

php打包文件,并使用curl上传

php打包zip文件,如果包含中文名,将文件名转化为GBK编码即可。

<?php
 
$zipfile = 'zipByPhp.zip';
 
$zip = new ZipArchive();//使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释
if($zip->open($zipfile, ZIPARCHIVE::CREATE)!==TRUE){
    exit('create zip file error');
}
$files = array('queryimg.php', 'multicurl.php');
foreach($files as $file){
    $addfilename = iconv('UTF-8', 'GBK//IGNORE', $file);
    $zip->addFile($file, $addfilename);
}
$zip->close();

php curl上传文件

$field = array("upimg"=>"@/tmp/phpzip.zip");//文件路径,前面要加@,表明是文件上传.key与后台处理文件对应,使用$_FILES['upimg']获取
$curl = curl_init("http://localhost/a.php");
curl_setopt($curl,CURLOPT_POST,true);
curl_setopt($curl,CURLOPT_POSTFIELDS,$field);//这里的$field必须是数组结构,不要自作聪明使用 http_build_query,否则不认文件了
curl_exec($curl);

Scan for additional .ini files in: (none); 如何添加ini附件目录

在php编译时添加一些指定的参数来达到加载附加ini文件的目的:

--with-config-file-path=PATH
Set the path in which to look for php.ini [PREFIX/lib] 这个是指定php.ini的位置
--with-config-file-scan-dir=PATH
Set the path where to scan for configuration files 这个是指定附加的ini配置文件的目录位置,此目录下的ini文件会被追加到php.ini配置中。

php使用simpleXML 添加 CDATA 格式数据

在做项目的时候,遇到一个需要处理xml文件的任务。把合作方传来的文件,加工下给引擎录入。
但是发现simpleXML没办法直接很方便的添加CDATA格式的数据,这样就会有很多问题。可能导致导出的xml格式错误。
找到了一个方法,分享给大家:

<?php
/**
* to show <title lang="en"><![CDATA[Site Title]]></title>   instead of <title lang="en">Site Title</title>
*
*/
class SimpleXMLExtended extends SimpleXMLElement
  {
  public function addCData($cdata_text)
    {
    $node = dom_import_simplexml($this); 
    $no   = $node->ownerDocument; 
    $node->appendChild($no->createCDATASection($cdata_text)); 
    } 
  }
$xmlFile    = 'config.xml';
// instead of $xml = new SimpleXMLElement('<sites/>');
$xml = new SimpleXMLExtended('<sites/>');
$site = $xml->addChild('site');
// instead of $site->addChild('site', 'Site Title');
$site->title = NULL; // VERY IMPORTANT! We need a node where to append
$site->title->addCData('Site Title');
$site->title->addAttribute('lang', 'en');
$xml->asXML($xmlFile);
?>

vim下对php支持很好的 colorscheme;

shell下,可以通过 “ls -l /usr/share/vim/vim70/colors/.”查看本机都安装了哪些主题,比如本人开发机,有如下主题:
blue.vim
darkblue.vim
default.vim
delek.vim
desert.vim
elflord.vim
evening.vim
koehler.vim
morning.vim
murphy.vim
pablo.vim
peachpuff.vim
ron.vim
shine.vim
slate.vim
torte.vim
zellner.vim

基本上是挨个试了一次,发现peachpuff是对php支持最好的,效果比较让人满意。
编辑~/.vimrc,添加一行

:colorscheme peachpuff

每次vim打开就是这个主题了。用起来比较舒服,配图一张:
vim-colorscheme-peachpuff-php
Read more…

ThinkPHP 3.1自动开启gzip ,ie6下载文件时文件名与下载头不一致问题的解决

今天同事越到一个奇怪的问题,在下载头中指定了文件名,但是在ie6下,下载时却无法按给定的文件名给出保存,保存文件的名字为站点名称,在查阅一些资料后,确认为是gzip的问题,ie6不支持gzip,所以出现这个问题,但是在想关闭gzip的时候,发现关闭nginx的gzip压缩后,还是会有压缩头输出,后来才发现是ThinkPHP3.1版本新带的功能,自带“页面压缩输出支持”。
使用一个配置变量可以手动关闭:

‘OUTPUT_ENCODE’=>false