PHP中使用strtotime函数注意事项

 更新时间:2016年11月25日 15:41  点击:1465
strtotime函数在是大家常用的一个时间日期转换成单位S的一个函数了,但是这个函数有一个细节大家可能没有注意到,就是 使用的时候需要考虑 有31天和 2月份的情况,所以,如果没有考虑这个特殊的情况,那么在每月的31号或者和2月份有关的时间点时候就可能出现开始的那个灵异情况了,这个情况很多朋友都不记得了,但在很多时间这个非常重要,下面举例子来给各位介绍一下。

今天在微博上看到一个小案例,命令行如下:

 代码如下 复制代码

php -r “echo date(‘Y/m’,strtotime(‘-2 months’)) . \”\n\”;”

输出结果如下:

2013/03

如果把命令行修改成如下:

 代码如下 复制代码

php -r “echo date(‘Y/m’,strtotime(‘-3 months’)) . \”\n\”;”

输出结果如下:

2013/03

这里就奇怪了,怎么两个月前和三个月前的年月份都是一样的,再看看下面的命令行:

 代码如下 复制代码

php -r “echo date(‘Y/m’,strtotime(‘-3 months’,strtotime(’2013/05/28′))) . \”\n\”;”

输出结果如下:

2013/02

如果修改命令行为如下:

 代码如下 复制代码

php -r “echo date(‘Y/m’,strtotime(‘-3 months’,strtotime(’2013/05/29′))) . \”\n\”;”

输出结果如下:

2013/03

下面这个与预期的结果是一样的,现在说说为什么会出现开始的那个奇怪的坑。

strtotime里的months和 month是30天,使用的时候需要考虑 有31天和 2月份的情况,所以,如果没有考虑这个特殊的情况,那么在每月的31号或者和2月份有关的时间点时候就可能出现开始的那个灵异情况,这个算是strtotime的一个坑吧,为了慎重起见,能不用的时候就尽量别去用这个坑人的东东。

PS:以上所有例子都是在Debian6的64位系统下执行,使用命令行方式执行,执行时间是2013-05-30.

上月下月时间不准确


以下有几种方法,可以帮助我们达到预期效果,比如我要返回上个月的月份:

 代码如下 复制代码
echo date('M Y', strtotime('midnight first day of -1 month'));
或者:
echo date('M Y', strtotime(date('Y-m-01')) - 86400);

下方是其他的用途:

 代码如下 复制代码

strtotime('first day of last month');
strtotime('last day of last month');
strtotime('first of last week');
strtotime('first of this week');
strtotime('this week midnight'); // returns Monday midnight of this week
strtotime('last week midnight'); // returns Monday midnight of last week
strtotime('last week Sunday midnight'); // returns Sunday midnight of this week
strtotime('-2 weeks Sunday midnight'); // returns Sunday midnight of last week

<?php
date_default_timezone_set('Asia/Shanghai');
$first_day_of_month = date('Y-m',time()) . '-01 00:00:01';
$t = strtotime($first_day_of_month);
print_r(array(

date('Y年m月',$t),
date('Y年m月',strtotime('- 1 month',$t)),
date('Y年m月',strtotime('- 2 month',$t)),
));
?>

今天看到一份PHP初级面试题给大家分享下,好像挺逗比的。其实自己也挺头疼面试的,老是搞那种理论。习惯百度谷歌的人,真想回答句自己百度去。


一、前端部分

Firefox和google浏览器使用的引擎是什么?(前段最起码最起码的基础,调流浏览器兼容性必知。也是使用CSS3和HTML5是必知)
Firefox 使用的是 Gecko,而 Safari 和 Chrome 浏览器使用的都是 Webkit。最新版的opera也使用了webkit
 
如何用CSS实现水平居中和垂直居中?(基础的基础)
水平居中:text-align:center;margin:0 auto
垂直居中:可以将容器设置为display:table,然后将子元素也就是要垂直居中显示的元素设置为display:table-cell,然后加上vertical-align:middle来实现。或者使用{top:50%;transform: translateY(-50%);}
以上都是不完美实现,但都是基础。根本没思路的是骗子。
 
如何处理jQuery冲突?(基础的基础)
jQuery.noConflict(); 或者用闭包
(function($){})(jQuery);
 
二、数据存储部分
怎样定位MySQL中效率较低的语句?
使用show full processlist和慢查询日志。
 
数据库的增量备份主从服务做过没?
关键点在binlog,也就是二进制日志。
 
MYISAM引擎和INNODB引擎的对比?
关键点:表锁行锁,是否支持事务,索引的存储,适用场景
 
如果面试者简历中提到了熟悉memcache,那么就问:memcache的默认端口是啥?Value的最大长度是啥?默认的缓存有效期是多久?
答案:端口:11211 ,value最大1M,有效期30天。这三个问题有两个回答错的就是骗子。
如果提到redis,就问redis的最大value值是多少?存储有序和无序集合用哪种数据类型?哪个命令发起事务?哪两种持久化方式?
答案:value最大512M,有序用list和sorted set,无序用 set;发起事务用multi;持久化方式为内存快照和日志追加。
 
PHP部分:

类的自动加载怎么实现?
spl_autoload_register,回答__autoload 的是没做过,人云亦云的瞎扯。
 
列举几个PHP的魔术方法?
__set(),__get(),__construct(),__call(),__toString()。一共有14,5个,回答不出4个的说熟悉面向对象是在瞎扯。
 
正则表达式只能怪不区分大小写的修饰符是哪个?不用正则如何判断email格式是否正确?
答案:i;使用filter系列函数,如果能输出这个系列函数的缺陷更佳。
 
4.MVC的基本流程,每层都干些什么?自己是否实现过MVC框架?
 
 
服务器及其它

linux中类似win的资源管理器命令是哪个?怎样查看开机自启动有哪些服务?计划任务是哪个服务实现?删除非空文件夹用什么命令?
答案:top;chkconfig –list;crontab;rm -r;
 
平常经常去的技术社区。

再附一款


* 1.在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量(1)中;而链接到当前页面的URL记录在预定义变量(2)中。
2.执行程序段<?php echo 8%(-2) ?>将输出(3)。
3.在HTTP 1.0中,状态码 401 的含义是(4);如果返回“找不到文件”的提示,则可用 header 函数,其语句为(5)。
4.数组函数 arsort 的作用是(6);语句 error_reporting(2047)的作用是(7)。
5.PEAR中的数据库连接字符串格式是(8)。
6.写出一个正则表达式,过虑网页上的所有JS/VBS脚本(即把script标记及其内容都去掉):(9)。
7.以Apache模块的方式安装PHP,在文件http.conf中首先要用语句(10)动态装载PHP模块,
然后再用语句(11)使得Apache把所有扩展名为php的文件都作为PHP脚本处理。
8.语句 include 和 require 都能把另外一个文件包含到当前文件中,它们的区别是(12);为了避免多次包含同一文件,可以用语句(13)来代替它们。
9.类的属性可以序列化后保存到 session 中,从而以后可以恢复整个类,这要用到的函数是(14)。
10.一个函数的参数不能是对变量的引用,除非在php.ini中把(15)设为on.
11.SQL 中LEFT JOIN的含义是(16)。
如果 tbl_user记录了学生的姓名(name)和学号(ID),
tbl_score记录了学生(有的学生考试以后被开除了,没有其记录)的学号(ID)和考试成绩(score)以及考试科目(subject),
要想打印出各个学生姓名及对应的的各科总成绩,则可以用SQL语句(17)。

12.在PHP中,heredoc是一种特殊的字符串,它的结束标志必须(18)。

 

13.写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。
14.简述论坛中无限分类的实现原理。
15.设计一个网页,使得打开它时弹出一个全屏的窗口,该窗口中有一个文本框和一个按钮。用户在文本框中输入信息后点击按钮就可以把窗口关闭,而输入的信息却在主网页中显示。

//答案(填空):

1. echo $_SERVER['PHP_SELF']; echo $_SERVER["HTTP_REFERER"];
2. 0
3. (4)未授权 (5) header("HTTP/1.0 404 Not Found");
4. (6)对数组进行逆向排序并保持索引关系    (7)All errors and warnings
5. 没弄明白
6. /<script[^>].*?>.*?</script>/si
7.(10)    LoadModule      php5_module "D:/xampp/apache/bin/php5apache2.dll"
 
     (11) AddType application/x-httpd-php-source .phps
        AddType application/x-httpd-php .php .php5 .php4 .php3 .phtml
8.(12) 发生异常时include产生警告require产生致命错误    (13) require_once()/include_once()
9. serialize() /unserialize()
10. allow_call_time_pass_reference
11. (16) 自然左外连接
       (17) select name , count(score) as sum_score from tbl_user left join tbl_score on tbl_user.ID=tbl_score.ID    group by tbl_user.ID
12. 结束标识符所在的行不能包含任何其它字符除";"

 

13.

/**
* 遍历目录,结果存入数组。支持php4及以上。php5以后可用scandir()函数代替while循环。
* @param string $dir
* @return array
*/
function my_scandir($dir)
{
     $files = array();
     if ( $handle = opendir($dir) ) {
         while ( ($file = readdir($handle)) !== false ) {
             if ( $file != ".." && $file != "." ) {
                 if ( is_dir($dir . "/" . $file) ) {
                     $files[$file] = rec_scandir($dir . "/" . $file);
                 }else {
                     $files[] = $file;
                 }
             }
         }
         closedir($handle);
         return $files;
     }
}

下面我来给大家转一个关于Laravel4创建一个占位图片服务例子,有需要了解的朋友可看看。

使用Composer安装intervention/image库

 代码如下 复制代码
composer require intervention/image:dev-master

编码

 代码如下 复制代码

// vim app/routes.php
<?php
Route::pattern('width', '\d+');
Route::pattern('height', '\d+');
Route::get('{width}x{height}', 'ImageHolderController@getIndex');
// vim app/controllers/ImageHolderController.php
<?php

class ImageHolderController extends BaseController {
    public function getIndex($width, $height)
    {
        $width = intval($width);
        $height = intval($height);
        if ($width > 1900 || $height > 900)
            App::abort(404);
        $fontSize = min(max(intval($width / 5), 12), 38);
        $image = Image::canvas($width, $height, '#CCCCCC')
                ->line('#B5B5B5', 0, 0, $width, $height)
                ->line('#B5B5B5', $width, 0, 0, $height)
                ->text($width . 'x' . $height, $width / 2, $height / 2, function ($font) use ($fontSize) {
                    $font->file(public_path('font/Georgia.ttf'));
                    $font->align('center');
                    $font->valign('middle');
                    $font->size($fontSize);
                    $font->color('#666666');
                });
        return Response::make($image, 200, array('Content-Type' => 'image/png'));
    }
}

公司的服务器用的是wdcp搭建的环境,安装非常方便,但是在开发的过程可能把函数名之内的东西写错了,服务器直接返回的是500错误,没有任何错误提示,只是告诉你500错误,很让人头疼,这样调试错误很不方便,注意这里我关掉了浏览器的显示 友好错误

这个时候我们需要修改php.ini配置文件,不知道配置文件在那里,请用phpinfo() 然后搜索一下php.ini,你就能看到php.ini的位置了

查找:display_errors 将值设置成on

 代码如下 复制代码

display_errors = on

error_reporting = E_ALL & ~E_DEPRECATED

如果我们在php.ini中打开了错误提示还是不行你的程序可能有错误开关了,如下

 代码如下 复制代码

<?php
//禁用错误报告 
error_reporting(0); 
//报告运行时错误 
error_reporting(E_ERROR | E_WARNING | E_PARSE); 
//报告所有错误 
error_reporting(E_ALL); 
?>

如果你程序中有这段代码我们只要去掉就可以了哦

PHP NOTICE级错误提示对程序性能影响的研究

 

下面我来用性能测试来证明这个推论:
测试1:
在关闭错误显示的情况下,测试未初始化变量和已初始化变量在10000000次循环中的性能
变量已初始化的循环代码如下:
点击查看原图
变量未初始化的循环代码如下:
点击查看原图
测试成绩:
初始化:平均 5.28 秒
未初始化:平均 17.2 秒
性能差距:3.25倍
 
测试2:
在关闭错误显示的情况下,测试数组索引使用引号和非引号引用在10000000次循环中的性能
数组有引号索引代码如下:
点击查看原图
数组无引号索引代码如下:
点击查看原图
测试成绩:
有引号:平均 6.37 秒
无引号:平均 25.19秒
性能差距:3.95倍
平均时间表:
点击查看原图
结论:
从上面例子可以看出如果页面错误太多会导致页面性能下降哦,所以我们尽量不要使用关闭错误来处理php错误问题我们要保证页面没有错误才行哦。
php执行多线程有fscoket与curl两种方式,但我们经常会碰到fscoket不能使用了,但curl很多服务器都支持了,下面我们一起来看一个利用CURL实现多线程方法

例子。

 代码如下 复制代码

$ch = curl_init();   
$curl_opt = array(
  CURLOPT_URL=>"http://www.111cn.net",
  CURLOPT_RETURNTRANSFER=>1,
  CURLOPT_TIMEOUT=>1
);   
curl_setopt_array($ch, $curl_opt);
curl_exec($ch);
curl_close($ch);

上次的文章用的是fscoket时间的异步操作,在实际应用中的时候有的服务器是用不了的,这个时候就用curl来应对。

第一行:初始化一个curl资源

第二行:设置要用的参数数组

CURLOPT_URL    设置访问的资源

CURLOPT_RETURNTRANSFER    设置返回字符串不直接输入

CURLOPT_TIMEOUT        超时时间,这里最低只能为1秒,也就说和fscoket是有区别的,这里代码会等待一分钟,一般来是将需要很长时间的执行的代码执行异步的

第三行:对初始化的资源进行设置参数

第三行:执行curl

第四行:关闭curl资源

至此一个curl实现的异步操作已经完成,但是这里不建议使用,建议使用博客中fscoket实现!

[!--infotagslink--]

相关文章

  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • PHP函数分享之curl方式取得数据、模拟登陆、POST数据

    废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07
  • php中的foreach函数的2种用法

    Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • 总结android studio注意事项及打不开等问题解决方法

    经过一段时间的使用,总结了android studio打不开等问题的6种解决方法及android studio注意事项,希望对大家有所帮助。 1 首次运行,建立好项目需要下载一些东西,如果...2016-09-20
  • PHP函数strip_tags的一个bug浅析

    PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。由于 strip_tags() 无法实际验证 HTML,不完整或者破损标签将导致更多的数...2014-05-31
  • SQL Server中row_number函数的常见用法示例详解

    这篇文章主要给大家介绍了关于SQL Server中row_number函数的常见用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • PHP加密解密函数详解

    分享一个PHP加密解密的函数,此函数实现了对部分变量值的加密的功能。 加密代码如下: /* *功能:对字符串进行加密处理 *参数一:需要加密的内容 *参数二:密钥 */ function passport_encrypt($str,$key){ //加密函数 srand(...2015-10-30
  • php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法

    最近遇到一个问题,就是在使用php的mail函数发送utf-8编码的中文邮件时标题出现乱码现象,而邮件正文却是正确的。最初以为是页面编码的问题,发现页面编码utf-8没有问题啊,找了半天原因,最后找到了问题所在。 1.使用 PEAR 的...2015-10-21
  • C#中加载dll并调用其函数的实现方法

    下面小编就为大家带来一篇C#中加载dll并调用其函数的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#虚函数用法实例分析

    这篇文章主要介绍了C#虚函数用法,实例分析了C#中虚函数的功能与基本使用技巧,需要的朋友可以参考下...2020-06-25