分类 "Php" 的存档.

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-src 源代码下载地址

php 源代码下载地址:https://github.com/php/php-src/
大版本地址(branches):https://github.com/php/php-src/branches
小版本地址(tags):https://github.com/php/php-src/tags

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;
}

php header ie/chrome 下载-文件名乱码-解决方案

通过php的header函数,来指定为文件下载流,可以让文件正常下载,但是,文件名确很让人烦恼,文件名有中文时,如果页面编码为utf8,当文件名也为utf8时,在chrome下正常,但是在360se或者IE下,就成了乱码了;如果把文件名的编码设置为GBK,在IE下输出时候的文件名正常了,但是在chrome下,文件名又乱码了,这个太纠结了。
抓包的话,能看到如下的数据流,仔细看看,感觉跟发送邮件时的数据流很相似,于是想想是不是也采用跟邮件似的文件流形式,来避免出现乱码。
HTTP/1.1 200 OK
Date: Mon, 08 Oct 2012 17:32:12 GMT
Content-Length: 204
Content-Disposition: attachment; filename=%E6%B5%8B%E8%AF%95.txt
Cache-Control: public
Content-Type: application/octet-stream
Connection: Close

所以做法就是把文件名进行编码,根据RFC 1738 ,把中文编码,再放到数据流里,输出的时候就会正常了。在php中,具体的做法就是这样了,贡献一个我自己的文件下载头信息。把这个放在前边,再在后边echo输出你希望下载的内容即可了。

        $name = rawurlencode($filename);
        header("Content-type: text/plain; charset=utf-8");
	header("Content-Type: application/force-download");  
	header("Content-Type: application/octet-stream");  
	header("Content-Type: application/download");  
	header('Content-Disposition:inline;filename="'.$name.txt.'"');  
	header("Content-Transfer-Encoding: binary");  
	header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");  
	header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");  
	header("Cache-Control: must-revalidate, post-check=0, pre-check=0");  
	header("Pragma: no-cache");  

cygwin 添加php扩展模块

以添加openssl模块为例子

进入源码目录

cd php-5.2.13/ext/openssl
#运行phpize生成configure

/usr/local/php/bin/phpize

#编译,指定php-config,注意这里的php-config,不是php.ini

./configure –with-php-config=/usr/local/php/bin/php-config
#上面可以添加–enable-openssl,也可以不用添加

#编译安装

make;make install

#生成一个目录来存放扩展的模块

mkdir /usr/local/php/etc/php/ext

#复制openssl.so到模块目录

cp /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/openssl.so /usr/local/php/etc/ext/

#编辑php.ini文件,指定PHP到哪个目录读模块

vi /usr/local/php/etc/php.ini

extension_dir=”/usr/local/php/etc/ext”
#Load模块
extension=openssl.so
#保存退出

再用/usr/local/php/bin/php -m|grep openssl查看是否有openssl.so

备注:
如果在运行phpize时报错:Cannot find autoconf. Please check your autoconf installation:
Configuring for:
PHP Api Version: 20041225
Zend Module Api No: 20060613
Zend Extension Api No: 220060519
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.

是由于未安装m4和autoconf造成的,请打开cygwin安装程序,选择m4 和 autoconf模块进行安装:
另:在./configure时报错:Cannot find OpenSSL’s ,是由于cygwin未安装openssl包,需要同样打开cygwin安装程序,选择openssl-devel进行安装即可。

Nginx出现“413 Request Entity Too Large”错误解决方法

在使用curl上传POST一段数据时,被提示413 Request Entity Too Large,应该是nginx限制了上传数据的大小。
解决方法就是
打开nginx主配置文件nginx.conf,一般在/usr/local/nginx/conf/nginx.conf这个位置,找到http{}段,修改或者添加

client_max_body_size 2m;

然后重启nginx,

sudo /etc/init.d/nginxd reload

即可。
要是以php运行的话,这个大小client_max_body_size要和php.ini中的如下值的最大值差不多或者稍大,这样就不会因为提交数据大小不一致出现错误。

post_max_size = 2M
upload_max_filesize = 2M

Read more…

一些常见的浏览器的 $_SERVER[‘HTTP_USER_AGENT’] 输出信息

PHP 输出 $_SERVER[‘HTTP_USER_AGENT’]

<?php
var_export($_SERVER);
exit;
?>

Ipad:

    [HTTP_HOST] => 10.130.150.186
    [HTTP_USER_AGENT] => Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5
    [HTTP_ACCEPT] => application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
    [HTTP_ACCEPT_LANGUAGE] => zh-cn
    [HTTP_ACCEPT_ENCODING] => gzip, deflate
    [HTTP_CONNECTION] => keep-alive
    [PATH] => /usr/local/sbin

Firefox x64 4.0b13pre on Windows 7 x64:

    [HTTP_HOST] => localhost
    [HTTP_USER_AGENT] => Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b13pre) Gecko/20110307 Firefox/4.0b13pre
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    [HTTP_ACCEPT_LANGUAGE] => zh-cn,en-us;q=0.7,en;q=0.3
    [HTTP_ACCEPT_ENCODING] => gzip, deflate
    [HTTP_ACCEPT_CHARSET] => UTF-8,*
    [HTTP_KEEP_ALIVE] => 115
    [HTTP_CONNECTION] => keep-alive
    [PATH] => C:Program Files

Firefox x86 3.6.15 on Windows 7 x64:

    [HTTP_HOST] => localhost
    [HTTP_USER_AGENT] => Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    [HTTP_ACCEPT_LANGUAGE] => zh-cn,en-us;q=0.7,en;q=0.3
    [HTTP_ACCEPT_ENCODING] => gzip,deflate
    [HTTP_ACCEPT_CHARSET] => UTF-8,*
    [HTTP_KEEP_ALIVE] => 115
    [HTTP_CONNECTION] => keep-alive
    [PATH] => C:Program Files

Chrome x86 10.0.648.133 on Windows 7 x64:

    [HTTP_HOST] => localhost
    [HTTP_CONNECTION] => keep-alive
    [HTTP_USER_AGENT] => Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16
    [HTTP_ACCEPT] => application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
    [HTTP_ACCEPT_ENCODING] => gzip,deflate,sdch
    [HTTP_ACCEPT_LANGUAGE] => zh-CN,zh;q=0.8
    [HTTP_ACCEPT_CHARSET] => GBK,utf-8;q=0.7,*;q=0.3
    [PATH] => C:Program Files

IE9 x64 9.0.8112.16421 on Windows 7 x64:

    [HTTP_ACCEPT] => text/html, application/xhtml+xml, */*
    [HTTP_ACCEPT_LANGUAGE] => zh-CN
    [HTTP_USER_AGENT] => Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
    [HTTP_UA_CPU] => AMD64
    [HTTP_ACCEPT_ENCODING] => gzip, deflate
    [HTTP_HOST] => localhost
    [HTTP_CONNECTION] => Keep-Alive
    [PATH] => C:Program Files

IE9 x86 9.0.8112.16421 on Windows 7 x64:

    [HTTP_ACCEPT] => text/html, application/xhtml+xml, */*
    [HTTP_ACCEPT_LANGUAGE] => zh-CN
    [HTTP_USER_AGENT] => Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
    [HTTP_ACCEPT_ENCODING] => gzip, deflate
    [HTTP_HOST] => localhost
    [HTTP_CONNECTION] => Keep-Alive
    [PATH] => C:Program Files

Firefox x64 3.6.10 on ubuntu 10.10 x64:

 [HTTP_HOST] => localhost
    [HTTP_USER_AGENT] => Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    [HTTP_ACCEPT_LANGUAGE] => zh-cn,zh;q=0.5
    [HTTP_ACCEPT_ENCODING] => gzip,deflate
    [HTTP_ACCEPT_CHARSET] => UTF-8,*
    [HTTP_KEEP_ALIVE] => 115
    [HTTP_CONNECTION] => keep-alive
    [HTTP_CACHE_CONTROL] => max-age=0
    [PATH] => /usr/local/sbin:

andorid 2.2自带浏览器,不支持HTML5视频

array (
  'HTTP_HOST' => '192.168.1.4',
  'HTTP_ACCEPT_ENCODING' => 'gzip',
  'HTTP_ACCEPT_LANGUAGE' => 'zh-CN, en-US',
  'HTTP_X_WAP_PROFILE' => 'http://www.htcmms.com.tw/Android/Common/Wildfire/ua-profile.xml',
  'HTTP_ACCEPT_CHARSET' => 'utf-8, iso-8859-1, utf-16, *;q=0.7',
  'HTTP_REFERER' => 'http://192.168.1.4/',
  'HTTP_USER_AGENT' => 'Mozilla/5.0 (Linux; U; Android 2.2.1; zh-cn; HTC_Wildfire_A3333 Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1',
  'HTTP_ACCEPT' => 'application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5',
  'HTTP_CACHE_CONTROL' => 'no-cache',
  'HTTP_PRAGMA' => 'no-cache',
  'PATH' => '/sbin:/usr/sbin:/bin:/usr/bin',
  'SERVER_SIGNATURE' => '',
  'SERVER_SOFTWARE' => 'Apache/2.2.19 (Unix) PHP/5.3.6',
  'SERVER_NAME' => '192.168.1.4',
  'SERVER_ADDR' => '192.168.1.4',
  'SERVER_PORT' => '80',
  'REMOTE_ADDR' => '192.168.1.14',
  'DOCUMENT_ROOT' => '/home/user1/htdocs/',
  'SERVER_ADMIN' => 'webmaster@dummy-host.example.com',
  'SCRIPT_FILENAME' => '/home/user1/htdocs/test.php',
  'REMOTE_PORT' => '33307',
  'GATEWAY_INTERFACE' => 'CGI/1.1',
  'SERVER_PROTOCOL' => 'HTTP/1.1',
  'REQUEST_METHOD' => 'GET',
  'QUERY_STRING' => '',
  'REQUEST_URI' => '/test.php',
  'SCRIPT_NAME' => '/test.php',
  'PHP_SELF' => '/test.php',
  'REQUEST_TIME' => 1309447458,
)

摘自:http://www.cnblogs.com/sink_cup/archive/2011/03/15/http_user_agent.html

【原创】php curl 模拟实现单点登陆(PHP实现JS加密函数)

【原创】转载请注明,来自:DigDeeply的博客: https://fukun.org/

这几天晚上闲着没事干,偶然间发现新浪爱问的积分还可以换实物礼品,积分来源一部分就是提问回答之类的,还有一部分是要每天签到。我是懒人,也懒得每天提问回答啥的,为了那么个小礼品,也不值得。但是签到还是很简单的嘛,每天点一下就OK了。我比一般懒人还懒,每天点一下都懒得点,所以觉定做个模拟登陆,模拟签到的程序,放到SAE上去,每天帮我签个到,拿个积分就好了,哈哈。:)

其实这个模拟登陆,也就是抓站的基础部分吧, 模拟登陆,获取登陆后的状态,然后模拟人的访问流程,获取访问结果,分析保存之……

首先介绍一下抓站的利器吧,httpwatch,也可以用firefox下的firebug或者chrome下自带的开发者工具,其实我原来一直都是用firefox或者chrome的,但是听说httpwatch很好,就拿来试用一下,结果用的还真是很舒服,不错。其次就是Snoopy.class.php,我用PHP,这个PHP类真是好用到极致了,用来抓站so easy。但是这个类用来抓一般的基于http的站是没问题的,如果要是https的就麻烦了,这个类在抓https的站时,采用的不是php本身的curl了,使用的是Linux/Unix下的原生CURL,所以这个类在windows下用着很麻烦,需要自己装一个windows下能用的curl,并且配置好环境。在sae下直接就是不行的了,如果是用Linux/Unix的话,就很方便了~~指定好curl的路径就可以了。我也有一个https的模拟登录签到的脚本,使用的是php的curl,没有使用Snoopy。

由于新浪采用了单点登陆,所以一般的登陆方法是不行的了,不是直接构造用户名密码POST到一个login action页面完事。先使用httpwatch抓取一下登陆的流程吧。

httpwatch抓取的登录新浪爱问的流程

httpwatch抓取的登录新浪爱问的流程

Read more…

PHP,Mysql-根据一个给定经纬度的点,进行附近地点查询–合理利用算法,效率提高2125倍

目前的工作是需要对用户的一些数据进行分析,每个用户都有若干条记录,每条记录中有用户的一个位置,是用经度和纬度表示的。
还有一个给定的数据库,存储的是一些已知地点以及他们的经纬度,内有43W多条的数据。
现在需要拿用户的经纬度和已知地点进行距离匹配,如果它们之间的距离小于一定的数据,比如说500米,就认为用户是在这个地点。
MYSQL本身是支持空间索引的,但是在5.x的版本中,取消了对Distance()和Related()的支持,参考这里:MySQL 5.1参考手册 :: 19. 中的空间扩展 19.5.6. 测试几何类之间空间关系的函数,无法使用空间的距离函数去直接去查询距离在一定范围内的点。所以,我首先想到的是,对每条记录,去进行遍历,跟数据库中的每一个点进行距离计算,当距离小于500米时,认为匹配。这样做确实能够得到结果,但是效率极其低下,因为每条记录都要去循环匹配40W条数据,其消耗的时间可想而知。经过记录,发现每条记录处理的时间消耗达到1700ms,针对每天上亿的数据量,这样一个处理速度,让人情何以堪啊。。。
我自己也有个想法,就是找到每条记录所在点的经纬度周围的一个大概范围,比方说正方形的四个点,然后使用mysql的空间计算,使用MBR去得出点在这个矩形内的已知记录,然后进行匹配。可惜,自己没想出能计算到四个点经纬度的方法。
意外的,查询到了一个关于这个计算附近地点搜索初探,里面使用python实现了这个想法。
所以参考了一下原文中的算法,使用PHP进行了实现。
实现原理也是很相似的,先算出该点周围的矩形的四个点,然后使用经纬度去直接匹配数据库中的记录。

红色部分为要求的搜索范围,绿色部分我们能间接得到的结果范围

红色部分为要求的搜索范围,绿色部分我们能间接得到的结果范围

Read more…

PHP正则匹配字符串中的中文

如果标签里面有中文、英文、数字等混排,则需要对汉字进行特殊处理,由于PCRE不支持U P L之类的perl字符串处理转义,使用16进制或者Unicode进行处理,范例如下:

$str = "之二宽阔的甘家口东#标签1#标签2 #标签3。#标签4,都发$1234 ¥xc,cvm , ¥12,dflksjf如何#标签5.x #tag6.cvxcv“";
preg_match_all('/#([a-zA-Z0-9x7f-xff]+)/', $str, $mat);
print_r($mat);
 
preg_match("/[x{00a5}x{ffe5}](d+)/u", $str, $mat);
print_r($mat);

Read more…