php获得

PHP生成和获取XML格式数据的方法

在做数据接口时,我们通常要获取第三方数据接口或者给第三方提供数据接口,而这些数据格式通常是以XML或者JSON格式传输,这里将介绍如何使用PHP生成XML格式数据供第三方调用以及如何获取第三方提供的XML数据。生成XML格式数据我们假设系统中有一张学生信息表student,需要提供给第三方调用,并有id,name,sex,age分别记录学生的姓名、性别、年龄等信息。CREATE TABLE `student` ( `id` int(11) NOT NULL auto_increment, `name` varchar(50) NOT NULL, `sex` varchar(10) NOT NULL, `age` smallint(3) NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;首先,建立createXML.php文件,先连接数据库,获取数据。include_once ("connect.php"); //连接数据库 $sql = "select * from student"; $result = mysql_query($sql) or die("Invalid query: " . mysql_error()); while ($row = mysql_fetch_array($result)) { $arr[] = array( 'name' => $row['name'], 'sex' => $row['sex'], 'age' => $row['age'] ); }这个时候,数据就保存在$arr中,你可以使用print_r打印下数据测试。接着,建立xml,循环数组,将数据写入到xml对应的节点中。$doc = new DOMDocument('1.0', 'utf-8'); // 声明版本和编码 $doc->formatOutput = true; $r = $doc->createElement("root"); $doc->appendChild($r); foreach ($arr as $dat) { $b = $doc->createElement("data"); $name = $doc->createElement("name"); $name->appendChild($doc->createTextNode($dat['name'])); $b->appendChild($name); $sex = $doc->createElement("sex"); $sex->appendChild($doc->createTextNode($dat['sex'])); $b->appendChild($sex); $age = $doc->createElement("age"); $age->appendChild($doc->createTextNode($dat['age'])); $b->appendChild($age); $r->appendChild($b); } echo $doc->saveXML();我们调用了PHP内置的类DOMDocument来处理与生成xml。最终生成的xml格式请点击这里看效果<?xml version="1.0" encoding="utf-8"?> <root> <data> <name>吊炸天</name> <sex>男</sex> <age>21</age> </data> ... </root>获取XML格式数据现在我们假设要从第三方获取学生信息,数据格式是XML,我们需要使用PHP解析XML,然后将解析后的数据显示或者写入本地数据库。而这里关键的一步是解析XML。PHP有很多中方法可以解析XML,其中PHP提供了内置的XMLReader类可以循序地浏览过xml档案的节点,你可以想像成游标走过整份文件的节点,并抓取需要的内容。使用XMLReader是高效的,尤其是读取非常大的xml数据,相对其他方法,使用XMLReader消耗内存非常少。header("Content-type:text/html; Charset=utf-8"); $url = "http://www.codezhijia.com/php/40/importXML/createXML.php"; $reader = new XMLReader(); //实例化XMLReader $reader->open($url); //获取xml $i=1; while ($reader->read()) { if ($reader->nodeType == XMLReader::TEXT) { //判断node类型 $m = $i%3; if($m==1) $name = $reader->value; //读取node值 if($m==2) $sex = $reader->value; if($m==0){ $age = $reader->value; $arr[] = array( 'name' => $name, 'sex' => $sex, 'age' => $age ); } $i++; } } //print_r($arr);为了将数据name,sex和age分开,我们使用$i%3来判断取模,因为在获取的xml中,节点data下的信息是以3个子节点存在的。

展开
收起

PHP 利用getid3 获取音频文件时长等数据

1、首先,我们需要先下载一份PHP类—getid3 https://codeload.github.com/JamesHeinrich/getID3/zip/master

2、解压刚才下载好的文件,拿出两个文件夹 getid3 及 helperapps

3、加载音频类文件 require_once('getid3/getid3.php');

4、获取你数据库中的文件的URL 如 : $url = "../uploadfile/file/20180608/20180608061015_74942.m4a"

5、$arr = explode("/", $url); 用"/"拆开这个字符串

5、$file_url = realpath(dirname(__FILE__).'/../../').DIRECTORY_SEPARATOR.$arr[1].DIRECTORY_SEPARATOR.$arr[2].DIRECTORY_SEPARATOR.$arr[3].DIRECTORY_SEPARATOR.$arr[4] ;

拿到文件的真实地址,这里只能用绝对路径 ,DIRECTORY_SEPARATOR是自动判断"/还是\".

这里可以打印下结果 D:\phpStudy2\WWW\uploadfile\file\20180608\20180608061317_79304.m4a

6、拿到了文件的真实路径后

$getID3 = new getID3(); //实例化类

$ThisFileInfo = $getID3->analyze($file_url); //分析文件,$file_url为音频文件的地址

$fileduration=$ThisFileInfo['playtime_seconds'];//这里拿的是音频时长,你可以拿其他参数

好了,是不是非常简单的就实现了呢,有任何问题可以给我留言哦!

展开
收起

PHP函数_CDN加速之后,如何获取当前访客的真实IP地址信息

最近我一直帮助我朋友对一个项目网站进行二次开发和防护,为了简单抵挡一下竞争对手的 DDoS 攻击,他给网站开启了腾讯云CDN加速服务。

开启 CDN 之后,我之前给他写的 Shell 防护脚本也就宣告无效了,因为不管是正常访问还是攻击访问,脚本拿到的 IP 都是 CDN 节点的,而我不可能把 CDN 的节点 IP 也给禁用了,那就都不能访问了。

目前国内已经争相出现了百度云加速、腾讯云、阿里云、加速乐、360 网站卫士以及安全宝等CDN加速服务。不仅能够有效的隐藏自己的服务器IP地址,还能很好的防御DDos攻击和加快网站的访问速度,cdn加速对于网站来说是很有必要的。

于是,网站的访问模式就变为:

用户浏览器 → CDN 节点 → 网站源服务器

甚至是更复杂的模式:

用户浏览器 → CDN 节点(CDN 入口、CC\DDoS 攻击流量清洗等) → 腾讯云盾 → 源服务器

可以看到,我们的网站中间经历了好几层的透明加速和安全过滤, 这种情况下,我们就不能用上面的“普通配置”。因为普通配置中基于【源 IP 的限制】的结果就是,我们把【CDN 节点】或者【阿里云盾】给限制了,因为这里“源 IP”地址不再是真实用户的 IP,而是中间 CDN 节点的 IP 地址。

我们需要限制的是最前面的真实用户,而不是中间为我们做加速的加速服务器。

其实,当一个 CDN 或者透明代理服务器把用户的请求转到后面服务器的时候,这个 CDN 服务器会在 Http 的头中加入一个记录

X-Forwarded-For : 用户 IP, 代理服务器 IP

如果中间经历了不止一个代理服务器,这个记录会是这样

X-Forwarded-For : 用户 IP, 代理服务器 1-IP, 代理服务器 2-IP, 代理服务器 3-IP, ….

可以看到经过好多层代理之后, 用户的真实 IP 在第一个位置, 后面会跟一串中间代理服务器的 IP 地址,从这里取到用户真实的 IP 地址,针对这个 IP 地址做限制就可以了。

我们如何通过PHP获取访问用户的真实IP呢?

今天我就讲自己编写的代码发给大家,支持cdn加速获取用户IP,也支持不加速获取IP。IsCDN默认flase为不启动cdn加速获取用户IP,true则相反。

张新全博客

展开
收起

WordPress获取注册用户会员数量PHP

PHP获取WordPress注册的用户数量,效果如下图:

代码

一、global $wpdb$users = $wpdb->get_var("select count(id) from $wpdb->users");echo "总共有 ".$users." 位注册用户";二、$users=wp_list_authors('echo=0&exclude_admin=0&hide_empty=0&optioncount=1&style=0');$users=split(',',$users);echo '本站有', count($users), '位注册用户'; ?>下边是我基于上边的修改了一下(引入了一个css类),需要的可做参考

<p> <?php global $wpdb; $users = $wpdb->get_var("select count(id) from $wpdb->users"); echo "目前我们已经有 ".'<span class="counter">' .$users.'</span>'." 位会员加入"; ?></p>本文代码基于:https://www.jb51.net/cms/262912.html

除非注明,否则均为钻芒博客www.zmki,cn原创文章,转载必须以链接形式标明本文链接 如需查看原文,请前往博客使用搜索功能搜索文章标题

展开
收起

php在2038年后datetime类也无法获得当前日期的解决

由于php 32位使用 int 类型保存时间戳,也就是从1970 00:00:00 到当前时间的秒数。

而32位int 数字的取值范围是 -2147483648 到 2147483647。

所以当 时间戳为最大值 2147483647 时,表示的时间是 2038-01-19 03:14:07 或北京时间 2038-01-19 11:14:07 (为了表述方便,下文中,将这个临界点时间称之为 T0)。

而当时间大于这个时间时,php很多内置函数都会出错。

比如

当日期和时间大于 北京时间 2038-01-19 11:14:07 时

time()函数,原本应该返回时间戳,现在会始终返回-1。

date("Y-m-d H:i:s")函数,会返回 1970-01-01 07:59:59(北京时间),其实也是因为 time()=-1导致的,date默认的第二个参数就是time()。

同样,mktime() 等函数也会异常。

上网查了解决办法,

1、换用64位系统。这里说的64位系统,需要操作系统、web服务系统,以及PHP都要64位的。

2、使用php5.2之后推出的 DateTime 类。

首先说第一种方法,因为我的服务器建设在Windows系统上,然后又有几个自制插件,这些插件在php 64位下面可能不能使用,因此这个方法不能用。

再说DateTime类,网上几乎几十篇文章都说使用DateTime类就能解决2038年问题。

我在自己的服务器上测试了一下,使用DateTime类似乎确实可以让日期超过2038上限,各种转换,都没问题,这里我不具体说明,大家网上搜"php datetime",都有说明。

但是,我在把服务器的时间设置为2040年4月18日的时候,发现,datetime 类依然无法获取当前时间。代码如下:

$date = new DateTime();

echo $date->format('Y-m-d H:i:s');

输出的还是 1970-01-01 07:59:59

但是,如果使用 $date->setDate(2040,4,18) 之后,再显示,再输出时间戳等,都是正常的代码如下:

$date = new DateTime();

$date->setDate(2040,4,18);

$date->setTime(10,24,11);

echo $date->format('Y-m-d H:i:s')."\r\n";

echo $date->format('U')."\r\n";

这时 输出时间 2040-04-18 10:24:11 ,以及时间戳 2218328651 都是正常的。

问题在于,datetime 类可以解决 2038年之后的时间的各种运算和转换,但是当系统日期在2038年那个T0时间之后,php系统根本无法获取当前时间。

我还试了 new DateTime("today");new DateTime('+2 days');new DateTime('tomorrow'); 等等,都无法获取今天,明天,后天等日期。

这时,整个php 系统无法获取当前的年月日和时间。

然后我开始在php的系统数组 $_SERVER 中寻找,看看哪里能找到和时间相关的内容,终于被我找到一个 $_SERVER["REQUEST_TIME"],这个实际上是一个记录用户刷新页面时php相应时刻的时间。它的值,在T0之前,和time()是一致的,但是,当T0之后,它就变成负数了。那么,怎么通过 $_SERVER["REQUEST_TIME"] 来获取真实的 时间戳呢?

很简单,32位int 数字的取值范围是 -2147483648 到 2147483647,转成2进制就会发现,其实是最高位用作符号位,最高位0表示正数,最高位1表示负数,当数字达到 2147483647后,二进制 就是 01111111 11111111 11111111 11111111(31个1),这时就是T0时刻的时间戳,继续+1 以后,变成了 10000000000000000000000000000000 (31个0),如果是无符号32位整数,就是 2147483648(正数) 但是在有符号的整数里,最高位1表示负数,就是 -2147483648(负数),而 $_SERVER["REQUEST_TIME"] 的特性是根据时间的推移进行累加。所以,它的时间线如下:

T0 之前:它等于 1970 00:00:00 到当前时间的秒数,和time()相同

T0 时: 它等于 2147483647

T0 后1秒: 它等于 2147483647+1=2147483648 被表示为 -2147483648 我们把 -2147483648 记作 T1,T1=T0+1秒的时刻

T0 后N秒:-2147483648-1+N

所以,当 $_SERVER["REQUEST_TIME"]<0 时,真正的时间戳为 $_SERVER["REQUEST_TIME"]-(-2147483648)+ 2147483647。

其中 $_SERVER["REQUEST_TIME"]-(-2147483648)表示 T1(变成负数,即T0+1秒) 时刻到当前时间 过了多少秒。

据此,写出一个新的取代time()的函数,该函数在系统时间超过T0 时,也能返回正确的时间戳,但是它的范围是无符号32位上限 4294967295,北京时间 2106-02-07 06:28:15。在这个时间之前,应该都可以正常使用。

function sunTime(){

if($_SERVER["REQUEST_TIME"]>0){

$t=$_SERVER["REQUEST_TIME"];

}else{

$t0=PHP_INT_MAX; // 第 2147483647 秒 再过一秒为 2147483648秒,但最高位变成1,系统中为 -2147483648

$t1=0-$t0-1; // t0后面1秒,瞬间变成负数,值为 -2147483648

$t2=($_SERVER["REQUEST_TIME"]);//虽然$_SERVER["REQUEST_TIME"]变成了负数,但是 系统依然通过 +1秒 来计时

$t=$t2-$t1+$t0.""; //t2-t1 就是变成负数后过了多少秒,t0就是变成负数前的秒数。

}

$date=new datetime("@".$t);

$timemark=$date->format("U");

return $timemark;

}

所以,目前网上很多人都以为使用 DateTime类可以解决问题,殊不知等时间真正到了2038那个时间之后,php系统获得当前时间都会出错。而我这方法也是目前网上唯一存在的方法。

阳光浪子

2018-04-18

展开
收起

Php获取Post过来的数据

php 获取 post 数据

如果要得到网页中post过来的数据,我们通常会用到以下三种方式。

$_POST;

可以看成是把$HTTP_RAW_POST_DATA过滤和格式化后的数据。识别的数据类型是PHP默认识别的数据类型 application/x-www.form-urlencoded

注意事项:

无法解析如text/xml,application/json等非 application/x-www.form-urlencoded 数据类型的内容经验证不能用于enctype="text/plain" 经验证可用于enctype="multipart/form-data"

HTTP_RAW_POST_DATA;

官方文档解释:原生POST数据。需要通过php.ini开启,开启后可通过全局变量 $GLOBALS['HTTP_RAW_POST_DATA'] 获取到post数据。

注意事项:

需要设置 php.ini 中的 always_populate_raw_post_data 值为 On 才会生效不能用于 enctype="multipart/form-data"PHP7中已经移除了这个全局变量,用 php://input 替代相比php://input 需要更多的内存

php://input

php://input 访问各个输入/输出流。允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。POST 请求的情况下,最好使用 来代替 ,因为它不依赖于特定的 指令。 而且,这样的情况下 默认没有填充, 比激活always_populate_raw_post_data 潜在需要更少的内存。 enctype="multipart/form-data"的时候 是无效的

注意事项:

不需要任何特殊的 php.ini 设置不能用于 enctype="multipart/form-data"数据获取方式 :$data = file_get_contents("php://input");

展开
收起

PHP如何获取数据资料

php抓取xml结构的数据

采用以下方法获取数据,获取数据的方式多种,但是这种方法简单易懂。

本人在github上编写一个demo:https://github.com/hwkkevin/PullData

更多技术问题:请关注技术分享社区熊掌号。

展开
收起

PHP如何获取模块的函数名?

PHP获取模块的函数名,可以通过get_extension_funcs函数来实现。如查找XML,JSON函数。

下面我们就通过代码示例,给大家介绍PHP获取模块函数名的方法。

代码示例如下:

<?phpecho "<pre>";print_r(get_extension_funcs("JSON"));echo "<br>";print_r(get_extension_funcs("XML"))."\n";

输出结果如下:

Array([0] => json_encode [1] => json_decode [2] => json_last_error [3] => json_last_error_msg)Array( [0] => xml_parser_create [1] => xml_parser_create_ns [2] => xml_set_object [3] => xml_set_element_handler [4] => xml_set_character_data_handler [5] => xml_set_processing_instruction_handler [6] => xml_set_default_handler [7] => xml_set_unparsed_entity_decl_handler [8] => xml_set_notation_decl_handler [9] => xml_set_external_entity_ref_handler [10] => xml_set_start_namespace_decl_handler [11] => xml_set_end_namespace_decl_handler [12] => xml_parse [13] => xml_parse_into_struct [14] => xml_get_error_code [15] => xml_error_string [16] => xml_get_current_line_number [17] => xml_get_current_column_number [18] => xml_get_current_byte_index [19] => xml_parser_free [20] => xml_parser_set_option [21] => xml_parser_get_option [22] => utf8_encode [23] => utf8_decode)

函数介绍:

get_extension_funcs()函数,返回模块函数名称的数组。

array get_extension_funcs ( string $module_name )

该函数根据 module_name 返回模块内定义的所有函数的名称。

参数module_name即模块名称。

注:这个参数必须是小写(lowercase)的。

返回值,返回包含所有函数名的数组,如果 module_name 不是一个有效的扩展则返回 FALSE 。

本篇文章就是关于PHP如何获取模块函数名的方法介绍,简单易懂,希望对需要的朋友有所帮助!

展开
收起

PHP如何获取一周的第一天

使用PHP strtotime()函数可以获取一周的第一天。此函数返回默认时间变量timestamp,然后使用date()函数将时间戳日期转换为可理解的日期。

strtotime()函数: strtotime()函数通过解析时间字符串返回时间戳中的结果。

语法:

strtotime($EnglishDateTime, $time_now)

参数:

strtotime()函数接受上面提到的两个参数,如下所述:

$ EnglishDateTime:它指定英文文本日期时间描述,表示要返回的日期或时间。该函数解析字符串并以秒为单位返回时间。这是必需的参数。

$ time_now:此参数指定用于计算返回值的时间戳。这是一个可选参数。

date()函数: date()函数返回更易理解和人类可读的日期格式。

语法:

date( format, timestamp )

参数此函数接受上述两个参数,如下所述:

format:指定显示结果的日期和时间格式。

timestamp:它是生成日期的默认时间变量。

注意:在PHP中,星期从星期一开始,所以如果时间字符串以“this week”给出,则输出将是星期一的时间戳,通过传递date()函数可以使其可读。

示例1:当时间字符串为“this week”(本周)时,获取一周的默认第一天。

<?php $firstday = date('l - d/m/Y', strtotime("this week")); echo "First day of this week: ", $firstday; ?>

输出:

First day of this week: Monday - 11/02/2019

在PHP中,要把周日作为一周的第一天,需要考虑上一周的周日。也就是说得到一个星期的第一天(星期日)需要得到上一个星期的星期天,得到下一个星期的第一天(星期日)需要得到这个星期的星期天,以此类推。

PHP支持-ve indexing in time-string。因此,为了获得前一周,它可以将时间字符串用作“-1 week”,并且为了获得当天它还必须包括日期时间字符串的名称。

示例2:获取一周的第一天(星期日)。

<?php $firstday = date('l - d/m/Y', strtotime("sunday -1 week")); echo "First day of this week: ", $firstday, "\n"; $firstday = date('l - d/m/Y', strtotime("sunday -2 week")); echo "First day of last week: ", $firstday, "\n"; $firstday = date('l - d/m/Y', strtotime("sunday 0 week")); echo "First day of next week: ", $firstday, "\n"; $firstday = date('l - d/m/Y', strtotime("sunday 1 week")); echo "First day of week after next week : ", $firstday; ?>

输出:

First day of this week: Sunday - 10/02/2019 First day of last week: Sunday - 03/02/2019 First day of next week: Sunday - 17/02/2019 First day of week after next week : Sunday - 24/02/2019

本篇文章就是关于如何在PHP中获得一周的第一天的方法介绍,希望对需要的朋友有所帮助!

展开
收起