涉及相关知识点:
①PHPExcel是用来操作Office Excel 文档的一个PHP类库,它基于微软的Openxml标准和PHP语言。可以使用它来读取、写入不同格式的电子表格。
②time() 返回当前时间的秒数的函数,用来获取当前的系统时间
③require_once 为了避免重复加载文件即加载文件一次
④array()创建数组
⑤memory_get_usage()php内置函数能返回当前分配给PHP脚本的内存量,使用它来调试PHP代码性能
⑥var_dump() 用来打印数组,或者输出字符串
php读取excel文件,并进行相应处理的具体方法
代码示例如下:
<?php
/*读取excel文件,并进行相应处理*/
$fileName = "url.xls";
if (!file_exists($fileName)) {
exit("文件".$fileName."不存在");
}
$startTime = time(); //返回当前时间的Unix 时间戳
require_once './PHPExcel/IOFactory.php';
$objPHPExcel = PHPExcel_IOFactory::load($fileName);
//获取sheet表格数目
$sheetCount = $objPHPExcel->getSheetCount();
//默认选中sheet0表
$sheetSelected = 0;$objPHPExcel->setActiveSheetIndex($sheetSelected);
//获取表格行数
$rowCount = $objPHPExcel->getActiveSheet()->getHighestRow();
//获取表格列数
$columnCount = $objPHPExcel->getActiveSheet()->getHighestColumn();
echo "<div>Sheet Count : ".$sheetCount." 行数: ".$rowCount." 列数:".$columnCount."</div>";
$dataArr = array();
/* 循环读取每个单元格的数据 */
//行数循环
for ($row = 1; $row <= $rowCount; $row++){
//列数循环 , 列数是以A列开始
for ($column = 'A'; $column <= $columnCount; $column++) {
$dataArr[] = $objPHPExcel->getActiveSheet()->getCell($column.$row)->getValue();
echo $column.$row.":".$objPHPExcel->getActiveSheet()->getCell($column.$row)->getValue()."<br />";
}
echo "<br/>消耗的内存为:".(memory_get_peak_usage(true) / 1024 / 1024)."M";
$endTime = time();
echo "<div>解析完后,当前的时间为:".date("Y-m-d H:i:s")."
总共消耗的时间为:".(($endTime - $startTime))."秒</div>";
var_dump($dataArr);
$dataArr = NULL;}
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如何获取模块函数名的方法介绍,简单易懂,希望对需要的朋友有所帮助!
function test($url = ''){
$ex = explode('/',$url);
return $ex[2];
}
$url = "http://hongji.zg02.com/l/psj/";
echo test($url);
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");
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抓取xml结构的数据
采用以下方法获取数据,获取数据的方式多种,但是这种方法简单易懂。
本人在github上编写一个demo:https://github.com/hwkkevin/PullData
更多技术问题:请关注技术分享社区熊掌号。
微软的必应搜索的每日图片不得不说,都是经典,美得一塌糊涂。看到很多把必应壁纸做电脑壁纸的软件,今天闲的蛋疼,就折腾了一下。
接口
我们用到的接口是
https://cn.bing.com/HPImageArchive.aspx?idx=0&n=1
这里的
idx=0
表示是显示当天的时间,如果要显示昨天的就将
idx=0
改为
idx=1
,以此类推。注意:bing支持查看历史图片15天以内的,数字就有范围限制了(0-15)。
获取当日图片
我们有了接口就可以直接利用正则表达式去匹配相关字符串了。下面给出一个获取并输出当日美图的php代码
<?php $str=file_get_contents('https://cn.bing.com/HPImageArchive.aspx?idx=0&n=1');if (preg_match("/<url>(.+?)<\/url>/ies", $str, $matches)) { $imgurl='https://cn.bing.com'.$matches[1];}if ($imgurl) { header('Content-Type: image/JPEG'); @ob_end_clean(); @readfile($imgurl); @flush(); @ob_flush(); exit();} else { exit('error');}?>
保存为bingpic.php,上传到服务器直接访问即可。
获取图片版权介绍
有了图片,没有文字怎么能满足饥渴的我,还是利用正则提取出图片版权信息
<?php$url=file_get_contents('https://cn.bing.com/HPImageArchive.aspx?idx=0&n=1'); if (preg_match("/<copyright>(.+?)<\/copyright>/ies", $url, $matches)) { $imgcopyright=$matches[1];}if ($imgcopyright) { header("Content-type: text/html; charset=utf-8"); echo $imgcopyright;} else { exit('error');}?>
tip:修改相关参数即可实现对应的文字说明
自动保存bing图片
自动在php文件同级目录下创建一个当前年月的文件夹,保存每天的bing美图并输出
<?phperror_reporting(0);$path=date('Ym');if (!file_exists($path)) { mkdir($path, 0777);}$pathurl = $path.'/'.date('d').'.jpg';if (!is_file($pathurl)) { $str=file_get_contents('https://cn.bing.com/HPImageArchive.aspx?idx=0&n=1'); if (preg_match("/<urlBase>(.+?)<\/urlBase>/ies", $str, $matches)) { $imgurl='https://s.cn.bing.com'.$matches[1].'_1920x1080.jpg'; copy($imgurl, $pathurl); }} header('Content-Type: image/JPEG'); @ob_end_clean(); @readfile($pathurl); @flush();@ob_flush();exit();?>
由于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
之前粗糙的介绍了ajax的使用,验证用户名是否填写正确,邮箱是否重复,不用刷新页面获取数据,今天详细介绍一下ajax的原生代码。
小编先介绍一下ajax概念:
AJAX:异步的JavaScript和XML,AJAX的核心是XMLHttpRequest对象,怎么创建XMLHttpRequest对象呢?
创建XHR对象(需要考虑不同的浏览器兼容问题)
Firefox、Opera等浏览器
var 对象名称 = new XMLHttpRequest()
IE浏览器
var 对象名称 = new ActiveXObject("Microsoft.XMLHTTP")
demo1:获取服务器的日期和时间
获取服务器的日期和时间我们看看代码执行效果
运行代码demo2 ajax在表单里面的运用
ajax在表单里面的运用附上php代码
php代码代码思路解答:在填写用户注册名称时候验证用户名是否存在,通过url传递用户名信息,php那边通过get接收数据然后执行数据库搜索这一过程。本来是一个执行数据库操作,这里简化为admin是存在数据库的不能重复注册,其他就可以注册,我们看看代码运行效果。后面放一个空的span标签用来提示注册结果。
ajax验证用户是否重复注册demo3 通过ajax获取xml数据
通过ajax获取xml数据1-3.php代码如下,定义一个xml文件
定义xml文件我们看看代码运行效果
ajax获取 xml数据今天介绍了ajax的常见三种运用,获取服务器数据,验证用户名是否符合要求,获取xml数据。有兴趣的朋友快去试试吧。
使用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中获得一周的第一天的方法介绍,希望对需要的朋友有所帮助!