作者归档:无念

php内置函数strtotime返回值异常问题

先说重点,strtotime函数的返回值,在官方文档上的描述

strtotime

(PHP 4, PHP 5, PHP 7)

strtotime — 将任何字符串的日期时间描述解析为 Unix 时间戳

说明

int strtotime ( string $time [, int $now = time() ] )

本函数预期接受一个包含美国英语日期格式的字符串并尝试将其解析为 Unix 时间戳(自 January 1 1970 00:00:00 GMT 起的秒数),其值相对于 now 参数给出的时间,如果没有提供此参数则用系统当前时间。

本函数将使用 TZ 环境变量(如果有的话)来计算时间戳。自 PHP 5.1.0 起有更容易的方法来定义时区用于所有的日期/时间函数。此过程在 date_default_timezone_get() 函数页面中有说明。

参数

time日期/时间字符串。正确格式的说明详见 日期与时间格式。now用来计算返回值的时间戳。

返回值

成功则返回时间戳,否则返回 FALSE。在 PHP 5.1.0 之前本函数在失败时返回 -1

错误/异常

在每 次调用日期/时间函数时,如果时区无效则会引发 E_NOTICE 错误,如果使用系统设定值或 TZ 环境变量,则会引发 E_STRICT 或 E_WARNING 消息。参见 date_default_timezone_set()

实际上这个函数的返回值并非跟官方文档一致。

继续阅读

windows 10 开始菜单不显示问题

今天突然莫名其妙遇到windows10开始菜单、消息、日期、网络连接等弹出的东东全都不能显示的问题,出问题的时候刚装了7.6版本的QQ,还以为出了啥事儿。试了一下切换账号没问题,明显是我当前账号的啥玩意出错了。

网上查了一圈没人给个靠谱的解决方案。

网上给的方案大致都是重启服务啦,确认权限啦之类的,试了很多全都不管用,后来没办法只好找谷哥问问英文问题。

看到老外们也遇见一样的问题,顿时感到欣慰。然后,一下子就顺利解决了,跟大家分享一下,免得又有人跟我一样不知道怎么处理。

继续阅读

JS时间函数的一个BUG

今天遇到了一个JS时间函数的BUG。

姑且可以认为是BUG吧,我觉得。

var ed='2015-03-31';
var minDate = new Date(ed.replace(/\-/g,"/"));
minDate.setMonth(minDate.getMonth() - 1);

很明显,我期待的数据是2018-02-28

但是实际上minData的时间是:Tue Mar 03 2015 00:00:00 GMT+0800

2015-03-03

这是为啥子咧??

我猜时间函数加减月份的内部规则其实是,3月往前一个月是2月,2月是28天,所以2月加28天是一个月后的3月的日期。同理反之3月减28天得到的是2月的日期。

然后问题来了,3月31日减去28天,是3月3日。

同理,5月31日的一个月以前结果是5月1日,而不是4月30日。

看来,月底这一天很可能出问题哎。

——分割线——

仔细想了下,其实也不是bug。
因为没有读源码,推测实际情况应该是这样。
setmonth时首先定位到2月1日的时间点,然后往后计算31天。这样才会出现本想定位到2月最后一天结果定位到了3月3日。

上线一个新工具:租车助手

花了一天时间做了一个小工具,

主要目的是抓取“神州租车”的数据,然后进行价格分析。不过目前暂时只支持北京地区,后续慢慢增加抓取的数据的区域。

访问租车助手

现在只有价格趋势,等抓取的数据逐渐丰富以后再提供更多的分析功能。

本来想同时抓一嗨租车的数据进行对比,结果发现一嗨没有数据接口可以抓取,只能分析html。这样准确性不够好而且工作量比较大,能获取的数据也不多,所以先不做了。

我怀疑可能变成神州租车的专用助手工具,不过如果大家有比较靠谱的租车公司可以推荐一下,我去分析下数据看看能不能一并抓取对比。

Ajax使用XMLHttpRequest上传Blob在Android下的BUG

案例背景

MBD要增加认证功能,要能够上传图片。

lz想偷懒用一个现成的js库来完成html5下带进度的上传控件,于是各种找。

发现一个这个:resumable.js

resumable.js

比其他几个类似 plupload轻量很多,纯粹只针对html5,完全满足移动端需要。果断采用。

能分块上传!能断点续传!能暂停继续!

好吧,lz很兴奋。

完成前端代码编写以后,就开始各种碰壁了……

继续阅读

浅谈PHP5中垃圾回收算法(Garbage Collection)的演化

前言

PHP是一门托管型语言,在PHP编程中程序员不需要手工处理内存资源的分配与释放(使用C编写PHP或Zend扩展除外),这就意味着PHP本身实现了垃圾回收机制(Garbage Collection)。现在如果去PHP官方网站(php.net) 可以看到,目前PHP5的两个分支版本PHP5.2和PHP5.3是分别更新的,这是因为许多项目仍然使用5.2版本的PHP,而5.3版本对5.2并不 是完全兼容。PHP5.3在PHP5.2的基础上做了诸多改进,其中垃圾回收算法就属于一个比较大的改变。本文将分别讨论PHP5.2和PHP5.3的垃 圾回收机制,并讨论这种演化和改进对于程序员编写PHP的影响以及要注意的问题。

继续阅读

一段PHP代码用于range输出文件

range的官方文档:  http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

range用途:一般是用在断点续传的时候,但是实际的用途很大,例如你的web server需要输出一个大文件,那么用range可以分段输出,缓解压力。同时在提供音乐视频等服务时可以缓冲下载,如果用户中途关闭,可以节约网络带宽。

    <?php
      $filename=$_GET['filename'];
      $location='media/'.$filename;
      
      $extension = substr(strrchr($filename,'.'),1);
      if ($extension == "mp3") {
        $mimeType = "audio/mpeg";
      } else if ($extension == "ogg") {
        $mimeType = "audio/ogg";
      }
      if (!file_exists($location))
      {
        header ("HTTP/1.1 404 Not Found");
        return;
      }
      
      $size  = filesize($location);
      $time  = date('r', filemtime($location));
      
      $fm = @fopen($location, 'rb');
      if (!$fm)
      {
        header ("HTTP/1.1 505 Internal server error");
        return;
      }
      
      $begin  = 0;
      $end  = $size - 1;
      
      if (isset($_SERVER['HTTP_RANGE']))
      {
        if (preg_match('/bytes=\h*(\d+)-(\d*)[\D.*]?/i', $_SERVER['HTTP_RANGE'], $matches))
        {
        $begin  = intval($matches[1]);
        if (!emptyempty($matches[2]))
        {
          $end  = intval($matches[2]);
        }
        }
      }
      if (isset($_SERVER['HTTP_RANGE']))
      {
        header('HTTP/1.1 206 Partial Content');
      }
      else
      {
        header('HTTP/1.1 200 OK');
      }
      
      header("Content-Type: $mimeType");
      header('Cache-Control: public, must-revalidate, max-age=0');
      header('Pragma: no-cache');  
      header('Accept-Ranges: bytes');
      header('Content-Length:' . (($end - $begin) + 1));
      if (isset($_SERVER['HTTP_RANGE']))
      {
        
        header("Content-Range: bytes $begin-$end/$size");
      }
      header("Content-Disposition: inline; filename=$filename");
      header("Content-Transfer-Encoding: binary");
      header("Last-Modified: $time");
      
      $cur  = $begin;
      fseek($fm, $begin, 0);
      
      while(!feof($fm) && $cur <= $end && (connection_status() == 0))
      {
        print fread($fm, min(1024 * 16, ($end - $cur) + 1));
        $cur += 1024 * 16;
      }

php净化HTML输入和输出

对于简单的数据净化,使用htmlentities()函数, 复杂的数据净化则使用HTML Purifier库

经HTML Purifier 4.4.0测试
在任何wbe应用中展示用户输出时,首先对其进行“净化”去除任何潜在危险的HTML是非常必要的。 一个恶意的用户可以制作某些HTML,若被你的web应用直接输出,对查看它的人来说会很危险。
虽然可以尝试使用正则表达式来净化HTML,但不要这样做。HTML是一种复杂的语言,试图 使用正则表达式来净化HTML几乎总是失败的。
你可能会找到建议你使用strip_tags() 函数的观点。虽然strip_tags()从技术上来说是安全的,但如果输入的不合法的HTML(比如, 没有结束标签),它就成了一个“愚蠢”的函数,可能会去除比你期望的更多的内容。由于非技术用户 在通信中经常使用<和>字符,strip_tags()也就不是一个好的选择了。
如果阅读了  验证邮件地址  一节, 你也许也会考虑使用filter_var() 函数。然而filter_var()函数在遇到断行时会出现问题, 并且需要不直观的配置以接近htmlentities()函数的效果, 因此也不是一个好的选择。
继续阅读