当前位置: 编程技术>php
本页文章导读:
▪PHP简洁函数小结
PHP简洁函数 主题:类菌体PHP简洁函数 简述:PHP简单明了函数语法 适合人群:对开源社区感兴趣,对php感兴趣,有一点时间了解下php 备注:希望大家抛砖,仍蛋,呵呵 1、与mysql相关 mysql_conne.........
▪不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
所以就怀疑是否编码问题,或者文件权限问题,或者是不是函数不支持问题,经过排查发现原来是万网的L1主机不支持fsockopen,在文件uc_client/client.php中的uc_fopen中出现了问题,这里的代码是.........
▪PHP中获取内网用户MAC地址(WINDOWS/linux)的实现代码
代码如下: function ce_getmac() { if(PHP_OS == 'WINNT') { $return_array = array(); $temp_array = array(); $mac_addr = ""; @exec("arp -a",$return_array); foreach($return_array as $value) { if(strpos($value,$_SERVER["HTTP_CLIENT_IP"]) !== false &am.........
[1]PHP简洁函数小结
来源: 互联网 发布时间: 2013-11-30
PHP简洁函数
主题:类菌体PHP简洁函数
简述:PHP简单明了函数语法
适合人群:对开源社区感兴趣,对php感兴趣,有一点时间了解下php
备注:希望大家抛砖,仍蛋,呵呵
1、与mysql相关
mysql_connect
建立一个与MySQL服务器的连接
语法
resource mysql_connect(string server[,string usingname[,string password[, bool new_link[,int client_flags]]]])
eg:
$DB_HOST =”localhost”;
$DB_LOGIN =”root”;
$DB_PASSWORD =” 123456”;
$conn=mysql_connect($DB_HOST,$DB_LOGIN,$DB_PASSWORD);
mysql_data_seek
将内部查询指针移动至查询行上
语法
bool mysql_data_seek(resource result_indetifier,int row_number)
eg:
$DB_HOST =”localhost”;
$DB_LOGIN =”root”;
$DB_PASSWORD =”123456”;
$DB_NAME =”flag”;
$conn=mysql_connect($DB_HOST,$DB_LOGIN,$DB_PASSWORD);
mysql_select_db($DB_NAME);
$res=mysql_query(“SELECT * FROM PRODUCT”);
$row=mysql_fetch_array($res);
for($i=0;$i<$num;$i++)
$row=mysql_fetch_array($res);
mysql_data_seek($res,0);//移动指针回到查询果的第一行
mysql_fetch_array
将查询的结果存在数组中(每一个数组元素存一个记录)
语法
array mysql_fetch_array(resource result[,int result_type])
eg
$DB_HOST =”localhost”;
$DB_LOGIN =”root”;
$DB_PASSWORD =”123456”;
$DB_NAME =”flag”;
$conn=mysql_connect($DB_HOST,$DB_LOGIN,$DB_PASSWORD);
mysql_select_db($DB_NAME);
$res=mysql_query(“SELECT * FROM PRODUCT”);
$row=mysql_fetch_array($res);
mysql_fetch_object
取得查询结果一行,并以对象类型存储之,与MySQL_fetch_array()使用方法完全相同,不同的是mysql_fetch_object()只能通过字段名称来取得查询结果
echo $row->fieldname; //正确用法
echo $row->0; //错误用法
语法
object mysql_fetch_object(resource result)
eg
$DB_HOST =”localhost”;
$DB_LOGIN =”root”;
$DB_PASSWORD =”123456”;
$DB_NAME =”flag”;
$conn=mysql_connect($DB_HOST,$DB_LOGIN,$DB_PASSWORD);
mysql_select_db($DB_NAME);
$res=mysql_query(“SELECT * FROM PRODUCT”);
$row=$mysql_fetch_object($res);
while($row)
{
echo $rowàp_id;
echo $rowàp_name;
}
mysql_insert_id
在使用INSERT命令增加完一条信息后,可利用此函数取得刚刚增加记录的unique id
语法
int mysql_insert_id([esource link_identifier])
eg
$DB_HOST =”localhost”;
$DB_LOGIN =”root”;
$DB_PASSWORD =”123456”;
$DB_NAME =”flag”;
$conn=mysql_connect($DB_HOST,$DB_LOGIN,$DB_PASSWORD);
mysql_select_db($DB_NAME);
$SQLStr”INSERT INTO produce (p_id,p_name)VALUES(‘','PHP书')”;
$res=mysql_query($res);
$p_id=mysql_insert_id();
mysql_num_rows
取得查询结果里有几行
语法
int mysql_num_rows(resource result)
eg
$DB_HOST =”localhost”;
$DB_LOGIN =”root”;
$DB_PASSWORD =”123456”;
$DB_NAME =”flag”;
$conn=mysql_connect($DB_HOST,$DB_LOGIN,$DB_PASSWORD);
mysql_select_db($DB_NAME);
$res=mysql_query(“SELECT * FROM PRODUCT”);
$num=mysql_num_rows($res);
mysql_query
送出一个SQL语法的查询语句
语法
resource mysql_query(string query[,resource link_identifier])
eg
$DB_HOST =”localhost”;
$DB_LOGIN =”root”;
$DB_PASSWORD=”123456”;
$DB_NAME =”flag”;
$conn=mysql_connect($DB_HOST,$DB_LOGIN,$DB_PASSWORD);
mysql_select_db($DB_NAME);
$res=mysql_query(“SELECT * FROM PRODUCT”);
mysql_select_db
选择欲存取的数据库名称
语法
bool mysql_select_db(string database_name[,resource link_identifier])
eg
$DB_HOST =”localhost”;
$DB_LOGIN =”root”;
$DB_PASSWORD =”123456”;
$DB_NAME =”flag”;
$conn=mysql_connect($DB_HOST,$DB_LOGIN,$DB_PASSWORD);
mysql_select_db($DB_NAME);
2、文件系统函数
copy
复制文本
语法
bool copy(string source,string dest)
eg
copy(“abc.txt”,”/tmp/newabc.txt”);
fclose
关闭一个打开文件的指针
语法
bool fclose(resource handle)
eg
$fp=fopen(“abc.txt”,”w”);
fclose($fp);
fgets
从文件指针所指位置取得列的内容
语法
string fgets(resource handle[,int length])
eg
$fp=fopen(“abc.txt”,”w”);
$txtdata= fgets($fp,4096);
file
将整个文件内容读到数组中
语法
array file(string filename[,int use_include_path[,resource context]])
eg
$content=file(“abc.txt”);
file_exists
检查文件是否存在
语法
bool file_exists(string filename)
eg
if (file_exists(“abc.txt”))
echo “此文件存在”;
else
echo”此文件不存在”;
filesize
取得文件大小
语法
int filesize(string filename)
eg
$size=filesize(“abc.txt”);
fopen
打开一个文件或者url
语法
resource fopen (string filename,string mode[,bool use-include_path[,resource zcontext]])
eg
$fp=fopen(“abc.txt”);
$fp=fopen(“http://www./bacteroid/”,”r”);
fputs
将数据写至文件中
语法
int fputs(resource handle,string string[,int length])
eg
$fp=fopen(“abc.txt”);
fputs($fp,”helloworld!”);
fseek
设置文件指针所指的位置
语法
int fseek(resource handle,int offset[,int whence])
eg
$fp=fopen(“abc.txt”,”w”);
$txtdata=fgets($fp,4096);
fseek($fp,0);//将指针指回起始处
mkdir
建立一个目录
语法
bool mkdir(string pathname[,int mode[,bool recursive[,resource context]]])
eg
mkdir(“ljt/newfolder”);
unlink
删除文件
语法
int unlink(string filename);
eg
unlink(”abc.txt”);
3、日期与时间函数
data
返回指定格式的当地时间/日期
语法
string date(string format[,int timestamp])
eg
$time =date(“Y-m-d g:i:s”);
getdate
取得日期与时间的信息
语法
array getdata([int timestamp])
eg
$now=getdate();
$year=$now[“year”];
$month=$now[“month”];
gettimeofday
取得目前的时间(包括格林尼治时间)
语法
array gettimeofday(void)
eg
$time=gettimeofday();
4、字符串处理函数
explode
根据指定的分隔符将字符串拆分成一个数组
语法
array explode(string separator,string string[,int limit])
eg
$str=”a,b,c”;
$res=explode(“,”,$str);//$res[0]=a
implode
将数组内容连接成一个字符串
语法
string implode(string glue,array pieces)
eg
$newarray=array(‘a','b','c');
$res=implode(“,”,$newarray);//$res=a,b,c
strlen
取得字符串的长度
语法
int strlen(string string)
eg
strlen(“www.gxnu.edu.cn”);//传回15
substr
取得字符串指定的某部分字符(子字符串)
语法
string substr(“www.gxnu.edu.cn”,1,7); //返回”ww.gxnu”
5、数学函数库
ceil
将浮点数的小数部分无条件进位
语法
float ceil(float value)
eg
echo ceil(9.99);//返回10
echo ceil(9.12);//返回10
cos
取得浮点数值的余弦值
语法
float cos(float arg)
eg
$numcos=cos(0.5);
floor
将浮点数的小数部分无条件去掉
语法
float floor(floor value)
eg
echo floor(9.12);//返回9
echo floor(9.99);// 返回9
rand
产生一个范围的随机数值
语法
int rand([int min,in max])
eg
$num=rand(0,100);//产生一个介于1到100间的随机数值
round
将浮点数的小数部分四舍五入进位
语法
float round(float value)
eg
float round(9.99)//返回10
float round(9.12)//返回9
sin
取得浮点数值的正弦值
语法
float sin(float arg)
eg
$numsin=sin(0.5);
6、Session函数
session_register
说明一或多个Session里的变量
语法
bool session_register(mixed name[,mixed...])
eg
$name=”flag”;
session_register(“name”);
session_start
初始化Session 信息
语法
bool session(void)
eg
session_start();
7、数组函数
count
计算数组中共有几个数组函数
语法
int count(mixed var[,int mode])
eg
count($array);
list
将数组中的元素值分配给变量
语法
void list(mixed varname,mixed...)
eg
$array=array(a,b,c);
list($str1,$str2,$str3)=$array;//$str1=a
range
建立一个在指定范围内的数组
语法
array range(int low,int high[,int step])
eg
$array=array(0,9);
shuffle
将数组中的元素重新随机排序
语法
bool shuffle(array array)
eg
shuffle($array);
主题:类菌体PHP简洁函数
简述:PHP简单明了函数语法
适合人群:对开源社区感兴趣,对php感兴趣,有一点时间了解下php
备注:希望大家抛砖,仍蛋,呵呵
1、与mysql相关
mysql_connect
建立一个与MySQL服务器的连接
语法
代码如下:
resource mysql_connect(string server[,string usingname[,string password[, bool new_link[,int client_flags]]]])
eg:
$DB_HOST =”localhost”;
$DB_LOGIN =”root”;
$DB_PASSWORD =” 123456”;
$conn=mysql_connect($DB_HOST,$DB_LOGIN,$DB_PASSWORD);
mysql_data_seek
将内部查询指针移动至查询行上
语法
代码如下:
bool mysql_data_seek(resource result_indetifier,int row_number)
eg:
$DB_HOST =”localhost”;
$DB_LOGIN =”root”;
$DB_PASSWORD =”123456”;
$DB_NAME =”flag”;
$conn=mysql_connect($DB_HOST,$DB_LOGIN,$DB_PASSWORD);
mysql_select_db($DB_NAME);
$res=mysql_query(“SELECT * FROM PRODUCT”);
$row=mysql_fetch_array($res);
for($i=0;$i<$num;$i++)
$row=mysql_fetch_array($res);
mysql_data_seek($res,0);//移动指针回到查询果的第一行
mysql_fetch_array
将查询的结果存在数组中(每一个数组元素存一个记录)
语法
代码如下:
array mysql_fetch_array(resource result[,int result_type])
eg
$DB_HOST =”localhost”;
$DB_LOGIN =”root”;
$DB_PASSWORD =”123456”;
$DB_NAME =”flag”;
$conn=mysql_connect($DB_HOST,$DB_LOGIN,$DB_PASSWORD);
mysql_select_db($DB_NAME);
$res=mysql_query(“SELECT * FROM PRODUCT”);
$row=mysql_fetch_array($res);
mysql_fetch_object
取得查询结果一行,并以对象类型存储之,与MySQL_fetch_array()使用方法完全相同,不同的是mysql_fetch_object()只能通过字段名称来取得查询结果
echo $row->fieldname; //正确用法
echo $row->0; //错误用法
语法
代码如下:
object mysql_fetch_object(resource result)
eg
$DB_HOST =”localhost”;
$DB_LOGIN =”root”;
$DB_PASSWORD =”123456”;
$DB_NAME =”flag”;
$conn=mysql_connect($DB_HOST,$DB_LOGIN,$DB_PASSWORD);
mysql_select_db($DB_NAME);
$res=mysql_query(“SELECT * FROM PRODUCT”);
$row=$mysql_fetch_object($res);
while($row)
{
echo $rowàp_id;
echo $rowàp_name;
}
mysql_insert_id
在使用INSERT命令增加完一条信息后,可利用此函数取得刚刚增加记录的unique id
语法
代码如下:
int mysql_insert_id([esource link_identifier])
eg
$DB_HOST =”localhost”;
$DB_LOGIN =”root”;
$DB_PASSWORD =”123456”;
$DB_NAME =”flag”;
$conn=mysql_connect($DB_HOST,$DB_LOGIN,$DB_PASSWORD);
mysql_select_db($DB_NAME);
$SQLStr”INSERT INTO produce (p_id,p_name)VALUES(‘','PHP书')”;
$res=mysql_query($res);
$p_id=mysql_insert_id();
mysql_num_rows
取得查询结果里有几行
语法
代码如下:
int mysql_num_rows(resource result)
eg
$DB_HOST =”localhost”;
$DB_LOGIN =”root”;
$DB_PASSWORD =”123456”;
$DB_NAME =”flag”;
$conn=mysql_connect($DB_HOST,$DB_LOGIN,$DB_PASSWORD);
mysql_select_db($DB_NAME);
$res=mysql_query(“SELECT * FROM PRODUCT”);
$num=mysql_num_rows($res);
mysql_query
送出一个SQL语法的查询语句
语法
代码如下:
resource mysql_query(string query[,resource link_identifier])
eg
$DB_HOST =”localhost”;
$DB_LOGIN =”root”;
$DB_PASSWORD=”123456”;
$DB_NAME =”flag”;
$conn=mysql_connect($DB_HOST,$DB_LOGIN,$DB_PASSWORD);
mysql_select_db($DB_NAME);
$res=mysql_query(“SELECT * FROM PRODUCT”);
mysql_select_db
选择欲存取的数据库名称
语法
代码如下:
bool mysql_select_db(string database_name[,resource link_identifier])
eg
$DB_HOST =”localhost”;
$DB_LOGIN =”root”;
$DB_PASSWORD =”123456”;
$DB_NAME =”flag”;
$conn=mysql_connect($DB_HOST,$DB_LOGIN,$DB_PASSWORD);
mysql_select_db($DB_NAME);
2、文件系统函数
copy
复制文本
语法
bool copy(string source,string dest)
eg
copy(“abc.txt”,”/tmp/newabc.txt”);
fclose
关闭一个打开文件的指针
语法
bool fclose(resource handle)
eg
$fp=fopen(“abc.txt”,”w”);
fclose($fp);
fgets
从文件指针所指位置取得列的内容
语法
string fgets(resource handle[,int length])
eg
$fp=fopen(“abc.txt”,”w”);
$txtdata= fgets($fp,4096);
file
将整个文件内容读到数组中
语法
array file(string filename[,int use_include_path[,resource context]])
eg
$content=file(“abc.txt”);
file_exists
检查文件是否存在
语法
bool file_exists(string filename)
eg
if (file_exists(“abc.txt”))
echo “此文件存在”;
else
echo”此文件不存在”;
filesize
取得文件大小
语法
int filesize(string filename)
eg
$size=filesize(“abc.txt”);
fopen
打开一个文件或者url
语法
resource fopen (string filename,string mode[,bool use-include_path[,resource zcontext]])
eg
$fp=fopen(“abc.txt”);
$fp=fopen(“http://www./bacteroid/”,”r”);
fputs
将数据写至文件中
语法
int fputs(resource handle,string string[,int length])
eg
$fp=fopen(“abc.txt”);
fputs($fp,”helloworld!”);
fseek
设置文件指针所指的位置
语法
int fseek(resource handle,int offset[,int whence])
eg
$fp=fopen(“abc.txt”,”w”);
$txtdata=fgets($fp,4096);
fseek($fp,0);//将指针指回起始处
mkdir
建立一个目录
语法
bool mkdir(string pathname[,int mode[,bool recursive[,resource context]]])
eg
mkdir(“ljt/newfolder”);
unlink
删除文件
语法
int unlink(string filename);
eg
unlink(”abc.txt”);
3、日期与时间函数
data
返回指定格式的当地时间/日期
语法
string date(string format[,int timestamp])
eg
$time =date(“Y-m-d g:i:s”);
getdate
取得日期与时间的信息
语法
array getdata([int timestamp])
eg
$now=getdate();
$year=$now[“year”];
$month=$now[“month”];
gettimeofday
取得目前的时间(包括格林尼治时间)
语法
array gettimeofday(void)
eg
$time=gettimeofday();
4、字符串处理函数
explode
根据指定的分隔符将字符串拆分成一个数组
语法
array explode(string separator,string string[,int limit])
eg
$str=”a,b,c”;
$res=explode(“,”,$str);//$res[0]=a
implode
将数组内容连接成一个字符串
语法
string implode(string glue,array pieces)
eg
$newarray=array(‘a','b','c');
$res=implode(“,”,$newarray);//$res=a,b,c
strlen
取得字符串的长度
语法
int strlen(string string)
eg
strlen(“www.gxnu.edu.cn”);//传回15
substr
取得字符串指定的某部分字符(子字符串)
语法
string substr(“www.gxnu.edu.cn”,1,7); //返回”ww.gxnu”
5、数学函数库
ceil
将浮点数的小数部分无条件进位
语法
float ceil(float value)
eg
echo ceil(9.99);//返回10
echo ceil(9.12);//返回10
cos
取得浮点数值的余弦值
语法
float cos(float arg)
eg
$numcos=cos(0.5);
floor
将浮点数的小数部分无条件去掉
语法
float floor(floor value)
eg
echo floor(9.12);//返回9
echo floor(9.99);// 返回9
rand
产生一个范围的随机数值
语法
int rand([int min,in max])
eg
$num=rand(0,100);//产生一个介于1到100间的随机数值
round
将浮点数的小数部分四舍五入进位
语法
float round(float value)
eg
float round(9.99)//返回10
float round(9.12)//返回9
sin
取得浮点数值的正弦值
语法
float sin(float arg)
eg
$numsin=sin(0.5);
6、Session函数
session_register
说明一或多个Session里的变量
语法
bool session_register(mixed name[,mixed...])
eg
$name=”flag”;
session_register(“name”);
session_start
初始化Session 信息
语法
bool session(void)
eg
session_start();
7、数组函数
count
计算数组中共有几个数组函数
语法
int count(mixed var[,int mode])
eg
count($array);
list
将数组中的元素值分配给变量
语法
void list(mixed varname,mixed...)
eg
$array=array(a,b,c);
list($str1,$str2,$str3)=$array;//$str1=a
range
建立一个在指定范围内的数组
语法
array range(int low,int high[,int step])
eg
$array=array(0,9);
shuffle
将数组中的元素重新随机排序
语法
bool shuffle(array array)
eg
shuffle($array);
[2]不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
来源: 互联网 发布时间: 2013-11-30
所以就怀疑是否编码问题,或者文件权限问题,或者是不是函数不支持问题,经过排查发现原来是万网的L1主机不支持fsockopen,在文件uc_client/client.php中的uc_fopen中出现了问题,这里的代码是这样:
function uc_fopen($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE) {
$return = '';
$matches = parse_url(/blog_article/$url/index.html);
!isset($matches['host']) && $matches['host'] = '';
!isset($matches['path']) && $matches['path'] = '';
!isset($matches['query']) && $matches['query'] = '';
!isset($matches['port']) && $matches['port'] = '';
$host = $matches['host'];
$path = $matches['path'] ? $matches['path'].($matches['query'] ? '?'.$matches['query'] : '') : '/';
$port = !empty($matches['port']) ? $matches['port'] : 80;
if($post) {
$out = "POST $path HTTP/1.0\r\n";
$out .= "Accept: */*\r\n";
//$out .= "Referer: $boardurl\r\n";
$out .= "Accept-Language: zh-cn\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";
$out .= "Host: $host\r\n";
$out .= 'Content-Length: '.strlen($post)."\r\n";
$out .= "Connection: Close\r\n";
$out .= "Cache-Control: no-cache\r\n";
$out .= "Cookie: $cookie\r\n\r\n";
$out .= $post;
} else {
$out = "GET $path HTTP/1.0\r\n";
$out .= "Accept: */*\r\n";
//$out .= "Referer: $boardurl\r\n";
$out .= "Accept-Language: zh-cn\r\n";
$out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";
$out .= "Host: $host\r\n";
$out .= "Connection: Close\r\n";
$out .= "Cookie: $cookie\r\n\r\n";
}
$fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);
if(!$fp) {
return '';//note $errstr : $errno \r\n
} else {
stream_set_blocking($fp, $block);
stream_set_timeout($fp, $timeout);
@fwrite($fp, $out);
$status = stream_get_meta_data($fp);
if(!$status['timed_out']) {
while (!feof($fp)) {
if(($header = @fgets($fp)) && ($header == "\r\n" || $header == "\n")) {
break;
}
}
$stop = false;
while(!feof($fp) && !$stop) {
$data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit));
$return .= $data;
if($limit) {
$limit -= strlen($data);
$stop = $limit <= 0;
}
}
}
@fclose($fp);
return $return;
}
}
fsockopen函数不能使用,因些就只能靠其它方法了,幸亏支持curl,file_get_contents也支持,经考虑就用curl吧,修改了uc_fopen函数,如下;
function uc_fopen($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE) {
$return = '';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
if($post) {
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
}
if($cookie) {
curl_setopt($curl, CURLOPT_COOKIE, $cookie);
}
curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$return = curl_exec($curl);
if (curl_errno($curl)) {
echo '<pre><b>错误:</b><br />'.curl_error($curl);
}
curl_close($curl);
return $return;
}
于是modoer下的uc_client/client.php和uchome下的uc_cilent/client.php,就这样修改了uc_open函数,呵呵,第一次使用curl,网上的资料还是好多的,所以也没有什么阻碍,不过就不知这个修改会不会影响其它的东西,还有待测试罗。。。。
代码如下:
function uc_fopen($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE) {
$return = '';
$matches = parse_url(/blog_article/$url/index.html);
!isset($matches['host']) && $matches['host'] = '';
!isset($matches['path']) && $matches['path'] = '';
!isset($matches['query']) && $matches['query'] = '';
!isset($matches['port']) && $matches['port'] = '';
$host = $matches['host'];
$path = $matches['path'] ? $matches['path'].($matches['query'] ? '?'.$matches['query'] : '') : '/';
$port = !empty($matches['port']) ? $matches['port'] : 80;
if($post) {
$out = "POST $path HTTP/1.0\r\n";
$out .= "Accept: */*\r\n";
//$out .= "Referer: $boardurl\r\n";
$out .= "Accept-Language: zh-cn\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";
$out .= "Host: $host\r\n";
$out .= 'Content-Length: '.strlen($post)."\r\n";
$out .= "Connection: Close\r\n";
$out .= "Cache-Control: no-cache\r\n";
$out .= "Cookie: $cookie\r\n\r\n";
$out .= $post;
} else {
$out = "GET $path HTTP/1.0\r\n";
$out .= "Accept: */*\r\n";
//$out .= "Referer: $boardurl\r\n";
$out .= "Accept-Language: zh-cn\r\n";
$out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";
$out .= "Host: $host\r\n";
$out .= "Connection: Close\r\n";
$out .= "Cookie: $cookie\r\n\r\n";
}
$fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);
if(!$fp) {
return '';//note $errstr : $errno \r\n
} else {
stream_set_blocking($fp, $block);
stream_set_timeout($fp, $timeout);
@fwrite($fp, $out);
$status = stream_get_meta_data($fp);
if(!$status['timed_out']) {
while (!feof($fp)) {
if(($header = @fgets($fp)) && ($header == "\r\n" || $header == "\n")) {
break;
}
}
$stop = false;
while(!feof($fp) && !$stop) {
$data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit));
$return .= $data;
if($limit) {
$limit -= strlen($data);
$stop = $limit <= 0;
}
}
}
@fclose($fp);
return $return;
}
}
fsockopen函数不能使用,因些就只能靠其它方法了,幸亏支持curl,file_get_contents也支持,经考虑就用curl吧,修改了uc_fopen函数,如下;
代码如下:
function uc_fopen($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE) {
$return = '';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
if($post) {
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
}
if($cookie) {
curl_setopt($curl, CURLOPT_COOKIE, $cookie);
}
curl_setopt($curl, CURLOPT_TIMEOUT, $timeout);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$return = curl_exec($curl);
if (curl_errno($curl)) {
echo '<pre><b>错误:</b><br />'.curl_error($curl);
}
curl_close($curl);
return $return;
}
于是modoer下的uc_client/client.php和uchome下的uc_cilent/client.php,就这样修改了uc_open函数,呵呵,第一次使用curl,网上的资料还是好多的,所以也没有什么阻碍,不过就不知这个修改会不会影响其它的东西,还有待测试罗。。。。
[3]PHP中获取内网用户MAC地址(WINDOWS/linux)的实现代码
来源: 互联网 发布时间: 2013-11-30
代码如下:
function ce_getmac()
{
if(PHP_OS == 'WINNT')
{
$return_array = array();
$temp_array = array();
$mac_addr = "";
@exec("arp -a",$return_array);
foreach($return_array as $value)
{
if(strpos($value,$_SERVER["HTTP_CLIENT_IP"]) !== false &&
preg_match("/(:?[0-9a-f]{2}[:-]){5}[0-9a-f]{2}/i",$value,$temp_array))
{
$mac_addr = $temp_array[0];
break;
}
}
return $mac_addr ? strtoupper($mac_addr) : '';
}
else if(PHP_OS == 'Linux')
{
return true;
}
}
函数已经修改过了,到LINUX上发现不能使用EXEC函数,也就是获取不到MAC地址了。经过沟通,该项目必须部署在LINUX服务器下,笔者经过苦思冥想了半天终于找到了一个解决方案,不用执行EXEC也可以获取到内网用户的MAC地址。
在内网服务器中,有一台192.168.1.151的服务器,服务器上一个API,访问这个API,就获取用户MAC,JOSN的方式输出用户账号信息,因为该服务器可以获取MAC,就可以稍加利用了。
使用CURL伪造来源IP方式(IP不是LINUX服务器的IP,是客户端访问的IP地址),CURL到151服务器,服务器得到相应,根据用户IP地址 和ARP -A 参数的正则方式就可以得到客户端的MAC地址,程序运行在151,而151是WINDOWS 2008服务器。但是要注意的是不能使用REMOTE_ADDR,必须使用HTTP_CLIENT_IP。 原因是HTTP_CLIENT_IP可以使用CURL伪造,这样就可以使用LINUX获取用户IP,然后传送给151处理。
疑问:根据用户IP获取MAC地址,那用户换一个IP了怎么办呢?使用CMD下 ARP -A分析,即使用户跟换IP,但是对应该用户的这台计算机的MAC地址默认是不会更换的。
下面是摘抄网友的关于获取IP的文章:
dz的代码判断IP那块太让人头疼了,日,REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR三个东西在手册上太不详细了,基本上就等于没有。
网上gg了一下,找到一点,另外,有一个思路太巧了,用JS取IP以后POST到服务器,Y的用代理骗服务器?有种上网先把Js给关了啊!!哦哈哈,以后有机会用ajax试一下,也省得用这三个变量if得死去活来了。
$_SERVER['...']; // for php
一、没有使用代理服务器的情况:
REMOTE_ADDR = 您的 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示
二、使用透明代理服务器的情况:Transparent Proxies
REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 您的真实 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
这类代理服务器还是将您的信息转发给您的访问对象,无法达到隐藏真实身份的目的。
三、使用普通匿名代理服务器的情况:Anonymous Proxies
REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 代理服务器 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
隐藏了您的真实IP,但是向访问对象透露了您是使用代理服务器访问他们的。
四、使用欺骗性代理服务器的情况:Distorting Proxies
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 代理服务器 IP
HTTP_X_FORWARDED_FOR = 随机的 IP ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
告诉了访问对象您使用了代理服务器,但编造了一个虚假的随机IP代替您的真实IP欺骗它。
五、使用高匿名代理服务器的情况:High Anonymity Proxies (Elite proxies)
REMOTE_ADDR = 代理服务器 IP
HTTP_VIA = 没数值或不显示
HTTP_X_FORWARDED_FOR = 没数值或不显示 ,经过多个代理服务器时,这个值类似如下:203.98.182.163, 203.98.182.163, 203.129.72.215。
完全用代理服务器的信息替代了您的所有信息,就象您就是完全使用那台代理服务器直接访问对象。
REMOTE_ADDR 是你的客户端跟你的服务器“握手”时候的IP。如果使用了“匿名代理”,REMOTE_ADDR将显示代理服务器的IP。
HTTP_CLIENT_IP 是代理服务器发送的HTTP头。如果是“超级匿名代理”,则返回none值。同样,REMOTE_ADDR也会被替换为这个代理服务器的IP。
$_SERVER['REMOTE_ADDR']; //访问端(有可能是用户,有可能是代理的)IP
$_SERVER['HTTP_CLIENT_IP']; //代理端的(有可能存在,可伪造)
$_SERVER['HTTP_X_FORWARDED_FOR']; //用户是在哪个IP使用的代理(有可能存在,也可以伪造)
最新技术文章: