标签为 "Php" 的存档

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

前端机超时3s ,9s

这几天遇到一个很奇怪的问题,搜索的前端机经常会有一些超时的请求,以为是业务哪块效率不行导致的。后来就写了一个php,只做 echo 1 操作,结果在大量curl时,还是会出先超时的情况,而且仔细分析后,出现的超时要么是比正常时间多3秒整,要么是比正常时间多9s整,只有这两种可能,没有其它的超时时间,这就更奇怪了,。查了一下资料,3s和9s的超时,是网络问题引起的。
Mysterious 3 and 9 second delays calling connect()

If a client tries to
establish a TCP connection to a server but the server does not
respond, then the client tries again after 3 seconds, then once again
after 6 more seconds. The number of retry attempts is configurable by
changing tcp_syn_retries ("sysctl net.ipv4.tcp_syn_retries," "man 7
tcp" for description).

20131126174519-backlog-3s-nginx

nginx php 3s 9s timeout delay

nginx php 3s 9s timeout delay

再底层的东西也咱现在也不了解啊。。还得慢慢学啊,可是问题还得解决啊。。
于是把问题抛给了op的同事,,最后解决了。。
解决办法:
修改 /usr/local/nginx/conf.d/default.conf 的 backlog=8192 后,超时3秒、9秒的问题得到验证解决。
修改了nginx的默认的backlog参数。
具体原因是啥,现在也不懂,记录下来,以后慢慢参悟吧。

nginx与HTTP_X_FILENAME

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

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学习笔记 寄存器 (Registers)

将寄存器与各种删除、复制、粘贴命令组合使用,能够大大提高编辑文本的效率。

指定寄存器

在复制或删除文本时,可以使用”register命令将文本放入指定的寄存器中。例如以下命令,将复制的文本放到寄存器a中,同时文本也会被放入未命名寄存器中。

“ayy

如果再使用相应的大写字母来指定寄存器,那么会将当前行内容追加到寄存器a中,这时该寄存器中就有了两行文本。

“Ayy

查看寄存器

使用registers命令,可以查看特定寄存器中的内容。例如以下命令,可以查看寄存器a中的内容:

:register a
--- Registers ---
"a   PjjjjVjjjxkVkkky^J^I^I$this->getView()->assign("exception", $exception);^J

如果想要查看所有寄存中的内容,可以使用以下命令:
:register

20130419_vim_register

20130419_vim_register

Read more…

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…

php header IE6文件下载失败问题

使用php header实现文件下载时,在IE6下总是提示不能下载,谷歌浏览器正常, 因此应该是IE的问题,IE下有个bug,微软官网有说明。错误消息:“Internet Explorer cannot download a file”(Internet Explorer 不能下载文件),有个办法可以很好的解决,看代码好了:

  if(strstr($_SERVER["HTTP_USER_AGENT"],"MSIE")==false) {
	header("Cache-Control: no-cache");
	header("Pragma: no-cache");
}   
header('Cache-Control: public, must-revalidate, max-age=0');
header('Accept-Ranges: bytes');
header("Content-Type: application/force-download");  
header("Content-Type: application/download");  
header("Content-Type: application/octet-stream");  
if(!empty($content_type)){
	header("Content-Type: ".$content_type);  
}   
header("Content-Transfer-Encoding: binary");  
header('Content-Disposition:attachment;filename="'.rawurlencode($filename).'"');  

php curl 设置host curl_setopt CURLOPT_HTTPHEADER 指定host

我们在开发测试时,有时web服务器会绑定一个域名,但是因为dns是无法解析的,我们需要设置host文件去访问。
但是,如果我们是需要通过curl访问的话,无法访问该url的host主机。所以,需要通过指定host的方式来访问,具体访问方式如下:
如果是linux下的curl命令:

curl --silent -H "Host: www.digdeeply.info" "192.168.0.1/index.php"

如果使用php的curl的话,使用curl_setopt设置一下CURLOPT_HTTPHEADER即可。
请参考以下函数使用:

//httpHeader	设置的 http head 参数 数组形式 如 array('Host: digdeeply.info')
function curl_by_host($url,$postString='',$httpHeader='')
{
	$ch = curl_init();
	curl_setopt($ch,CURLOPT_URL,$url);
	curl_setopt($ch,CURLOPT_POSTFIELDS,$postString);
	curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
	curl_setopt($ch,CURLOPT_USERAGENT,$_SERVER['HTTP_USER_AGENT']);

	if(!empty($httpHeader) && is_array($httpHeader))
	{
		curl_setopt($ch, CURLOPT_HTTPHEADER, $httpHeader);
	}
	$data = curl_exec($ch);
	$info = curl_getinfo($ch);
	curl_close($ch);
	if(curl_errno($ch)){
		return $info;
	}
	return $data;
}