标签为 "Php" 的存档

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…

Shell Script 变量中的路径解析,类似php的pathinfo()

编写Shell 脚本时,如果变量的值是一个路径的话,我们可以轻易的解析路径path信息,就像php中的pathinfo一样,来获取当中的路径(dirname) 或档名(basename).

变量		结果			说明
${path}		/usr/local/bin/emacs	原本值
${path#/*/}	local/bin/emacs		去除第一个资料夹
${path##/*/}	emacs			只取档名(basname)
${path%/*}	/usr/local/bin		只取路径(dirname)
${path:15}	emacs			取第15个字元后的所有字元
${path:10:4}	/bin			取第10个字元后的4 个字元

最后两个用法和Java 的subString 相同。

一些常见的浏览器的 $_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…

关于PHP array_multisort() 函数的理解

参考自:http://hi.baidu.com/ucolo/blog/item/356263a894169eec1e17a20d.html

今天研究了一下php的array_multisort,理解了之后发现他很强大,而且也不复杂。(手册上关于这个函数的讲解看得很费力)

手册讲解:array_multisort() 函数对多个数组或多维数组进行排序。

参数中的数组被当成一个表的列并以行来进行排序 – 这类似 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话,就会按照下一个输入数组中相应值的大小进行排序,依此类推。

一、先看最简单的情况。有两个数组:

$arr1 = array(1,9,5);
$arr2 = array(6,2,4);

array_multisort($arr1,$arr2);

print_r($arr1); // 得到的顺序是1,5,9
print_r($arr2); // 得到的顺序是6,4,2

我估计两个数组的值自始至终都是对应着的:1对应6,9对应2,5对应4。

Read more…

给定的经纬度坐标之间的范围/距离计算 php

用PHP实现 给定的经纬度坐标之间的范围/距离的计算-函数:

/**
*求两个已知经纬度之间的距离,单位为米
*@param lng1,lng2 经度
*@param lat1,lat2 纬度
*@return float 距离,单位米
**/
function getdistance($lng1,$lat1,$lng2,$lat2)//根据经纬度计算距离
{
	//将角度转为狐度 
	$radLat1=deg2rad($lat1);
	$radLat2=deg2rad($lat2);
	$radLng1=deg2rad($lng1);
	$radLng2=deg2rad($lng2);
	$a=$radLat1-$radLat2;//两纬度之差,纬度<90
	$b=$radLng1-$radLng2;//两经度之差纬度<180
	$s=2*asin(sqrt(pow(sin($a/2),2)+cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)))*6378.137*1000;
	return $s;
}

//测试,返回结果 : 759.467618902
echo getdistance(116.4558029, 39.9167328, 116.460197, 39.910801);

Read more…