分类目录归档:吾佳编程

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()

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

继续阅读

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日。

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()函数的效果, 因此也不是一个好的选择。
继续阅读

php验证email地址

使用filter_var()函数。

你的web应用需要做的一个常见的任务。就是检查一个用户是否输入了一个有效的email地址。你将毫无疑问地在网上找到一堆复杂的表达式,它们声称可以解决此问题,但是最简单的方法就是使用PHP的内建函数filter_var(),它能够检验email地址。

示例

<?php
filter_var('sgamgee@example.com', FILTER_VALIDATE_EMAIL); 
// Returns "sgamgee@example.com". This is a valid email address.
filter_var('sauron@mordor', FILTER_VALIDATE_EMAIL); 
// Returns boolean false! This is *not* a valid email address.
?>

进一步阅读

雅虎优化35条(转载)

第一页是中文,第二页是英文原文。

中文转载地址:http://blog.csdn.net/alex86gbk/archive/2009/08/13/4438506.aspx

一、内容部分

  • 尽量减少 HTTP请求
  • 减少 DNS查找
  • 避免跳转
  • 缓存 Ajxa
  • 推迟加载
  • 提前加载
  • 减少 DOM元素数量
  • 用域名划分页面内容
  • 使 frame数量最少
  • 避免 404错误

  继续阅读

Php性能测试(转载)

来自:http://maettig.com/code/php/php-performance-benchmarks.php (非永久链接)

关于php程序执行性能的一个测试,转载至此备查与学习。

My PHP Performance Benchmarks

PHP version 5.2.17 is running on this server. The benchmarks are done live. Reload the page to get fresh numbers. You are free to use the source for whatever you want. Giving credits to me (Thiemo Mättig) would be nice.

Please note that these are micro benchmarks. Micro benchmarks are stupid. I created this comparison to learn something about PHP and how the PHP compiler works. This can not be used to compare PHP versions or servers.

继续阅读