标签为 "Php" 的存档

使用 cURL 获取站点的各类响应时间 – dns解析时间,响应时间,传输时间

使用 cURL 获取站点的各类响应时间 – dns解析时间,响应时间,传输时间等:

curl -o /dev/null -s -w %{http_code}:%{http_connect}:%{content_type}:%{time_namelookup}:%{time_redirect}:%{time_pretransfer}:%{time_connect}:%{time_starttransfer}:%{time_total}:%{speed_download} digdeeply.org

这是一个本人博客站点执行 curl 命令的情况。输出通常是 HTML 代码,通过 -o 参数发送到 /dev/null。-s 参数去掉所有状态信息。-w 参数让 curl 输出的计时器的状态信息。

一次http请求中的各个时间段-dns解析,等待服务器响应,获取内容等

一次http请求中的各个时间段-dns解析,等待服务器响应,获取内容等

下边对-w参数做个详细的解释,由我(DigDeeply)翻译。有不对的地方请大家指出。(英文原文:http://curl.haxx.se/docs/manpage.html)

Read more…

IE7/IE8下javascript的时间函数Date()不兼容讲解–来自amcharts应用中的问题

最近在使用ammap和amcharts做一些数据可视化展现的工作,amcharts图表功能真的很强大,可自定义的属性很多。这是其官网文档链接。可以简单看看文档,会发现有很多属性,可以对图表中的每块表示数据的区域绑定事件,可以是一个url,也可以是一个js,怎么样,只有这两项,就绝对能满足很多扩展的需要了吧。

这是一个我做的例子,使用了ammap和amcharts,左边中国地图,不同省份的数据不一样,颜色代表不同等级的数据;右边是amcharts做的柱状图和折线图。

ammap和amcharts的案例--好用可扩展的javascript图表插件

ammap和amcharts的案例--好用可扩展的javascript图表插件

问题就在使用图表的过程中了,主要是右下角的那个折线图,在chrome、firefox、opera和IE9下均看过了,没有问题,可是到别人机器上,用的IE8,发现右下角的折线图出问题了。于是开始了JS的调试之旅,使用IE9的开发人员工具,可以很方便的调到IE7和IE8模式,之前一直都是firefox的firebug,现在一直都在用chrome,今天用了用IE9的调试工具,发现也挺好用的,主要是它有一个选项,可以设置为-始终从服务器中刷新,这样,每次IE运行获得的JS和CSS文件等,都不会是缓存中来的,调试起来很方便,不用总去清缓存。见下图:

Read more…

中文分词和搜索引擎

中文分词的算法

中文分词技术的研究,已经有几十年的历史了,在20世纪80年代,我国就有人开始研究如何用计算机来自动分词。如何让机器去识别语言中最小的语意单位,不是一件很容易的事情。

如何进行分词?对于程序员来说,最容易想到的办法是,用一个大词典,把所有的词都存入词典中,扫描输入的文本,查找所有可能的词,然后看哪个词可以做为输出。例如:
输入文本: 我是学生
词: 我/是/学生

其实这样做了以后,可以解决60%的问题。总结起来,分词的算法分为:
1. 基于字符串匹配的分词方法
2. 基于理解的分词方法
3. 基于统计的分词方法

Read more…

将 DIV 放置于 Flash之上 – ammap实战

做一个基于中国地图的数据展示。查找了一些资料,打算使用ammap,研究一番之后,终于明白一些。
通过设定数据文件ammap_data.xml中的area标签的url属性,可以设置为一个javascript:functionname();来调用一个JS函数。这下容易多了,可以通过JS去获得数据,添加到一个层,然后显示出来即可。
但是实践的时候又遇到一个问题,不管怎么设置层的CSS值,包括position,z-index,left,top 啊等等,层总是被flash给遮挡住,。查了点资料,原来flash是有一个属性设置的,可以设置是否置顶,不会被其它元素遮挡住。那么只要改一下就可以了。
ammap是用了封装好的一个swfobject类来生成flash的相关参数的,并且这个类是被压缩了的,。但是只要格式化一下就OK了。
然后找到<object></object>标签,在其中加入<param name=”wmode” value=”opaque” />,由于两边有双引号,自己注意加反斜线的转义。

好,现在试一下,诶?怎么不行?用IE看一下,结果IE下是可以的,但是chrome和firefox中都办不到。不用急,再在swfobject类中找到<embed>标签,对它加一个属性wmode=”opaque”,注意加转义字符。然后再打开看下效果。OK啦。

div放到flash之上-ammap-css-javascript-flash

div放到flash之上-ammap-css-javascript-flash

Read more…

MySQL怎样优化WHERE子句

此次讨论的为处理WHERE子句而进行的优化。例子中使用了 SELECT 语句,同样也适用于DELETE和UPDATE语句中的WHERE子句。

下面列出了MySQL执行的部分优化:

去除不必要的括号:

((a AND b) AND c OR (((a AND b) AND (c AND d))))
-> (a AND b AND c) OR (a AND b AND c AND d)
常量重叠:

(a<b AND b=c) AND a=5
-> b>5 AND b=c AND a=5
去除常量条件(由于常量重叠需要):

(B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6)
-> B=5 OR B=6
索引使用的常数表达式仅计算一次。

Read more…

SQL优化实例,看我如何把一个耗时1分钟的请求优化到9秒。

这主要是一个数据统计的web页面,展现统计结果。由于当时需求很紧,要求尽快能出来查询结果就行,而且是说以后会重新对这部分功能进行规划再开发。所以也没有考虑任何性能相关,劈哩啪啦的一天把很多数据统计的功能实现了。
现在,数据量已然有点规模了,但是还没有再开发的计划,目前还使用这个统计程序,但是由于有些数据量了,并且没有考虑过优化,所以目前查询速度很慢。尤其是其中有一个查询,居然耗时1分多,问题很大啊,今天抽点时间,找找问题,优化一下,主要做的工作的是改进sql语句,添加合适的索引。
存储的数据是根据用户的ID末尾的值来简单分表的,所以共有0到9一共10个表,需要遍历这10个表,然后把最后的数据相加,再处理后得到最后结果。由于需求还算比较简单,所以没有采用定时脚本去处理前几日的数据后入库保存的做法,如果采用以上做法,速度会快更多。

Read more…

ThinkPHP 之 文件上传类 UploadFile.class.php 的使用方法

ThinkPHP的文件上传类UploadFile.class.php位于ThinkPHPLibORGNet文件内下,其对于文件上传的处理非常的强大和方便。内置的文件上传类UploadFile类提供了下面的功能:

1、上传检测

2、多文件上传

3、自动生成上传图片缩略图

4、支持覆盖方式上传

5、支持上传类型、附件大小、上传路径定义

6、采用IFrame方式的Ajax上传机制支持

7、支持上传文件命名规则

8、支持对上传文件的Hash规则

9、可设置是否保存附件数据到数据库

在上传表单中可以进行很多参数的设置对上传进行灵活的定义,Action类的_upload方法会自动进行相关处理。
要更好的理解上传保存操作,可以参考ThinkPHP的附件数据表结构,更加详细下面的UploadFile类的参数和使用方法可以参考文件上传类的使用。

Read more…

Session与Cookie。禁用Cookie后Session会不会受影响?

  Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一 SessionID提交到服务器端,来存取Session数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用Cookie,那么Session也会失效。
  服务器也可以通过URL重写的方式来传递SessionID的值,因此不是完全依赖Cookie。如果客户端Cookie禁用,则服务器可以自动通过重写URL的方式来保存Session的值,并且这个过程对程序员透明。
  可以试一下,即使不写Cookie,在使用request.getCookies();取出的Cookie数组的长度也是1,而这个Cookie的名字就是JSESSIONID,还有一个很长的二进制的字符串,是SessionID的值。
  来看一下,即使不写Cookie,通过chrome的开发者工具,也可以看到这么一组cookie的键值 {PHPSESSID : 3e23bc66d024af8b531f2adb192478af}。

Session与Cookie区别-禁用cookie会不会影响session?

Session与Cookie区别-禁用cookie会不会影响session?


Read more…

求解,mysql查询建立索引后查询速度反而不如未建立索引以前

mysql 符合索引,未建立以前用时1.72s,建立一个符合索引后,反而用时2.44s,时间反而更长,是哪的问题呢,求解。。
以下是表结构和mysql explain 后的结果:

mysql> show create table new_bind_mp_weibo_user_info_0;
+----+| Table   | Create Table      |+---+
| new_bind_mp_weibo_user_info_0 | CREATE TABLE `new_bind_mp_weibo_user_info_0` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `weiboid` varchar(20) NOT NULL,
  `weiboun` varchar(100) NOT NULL,
  `mpnumber` varchar(11) NOT NULL,
  `apmac` varchar(100) NOT NULL,
  `bindtime` datetime NOT NULL,
  `source` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `search_key` (`bindtime`)
) ENGINE=MyISAM AUTO_INCREMENT=2768 DEFAULT CHARSET=utf8 | 
+-------------------------------+-----------------------------------------------------+
1 row in set (0.00 sec)

mysql> show create table weibo_user_visit_info_0;
+-----------------+| Table    | Create Table |+---------------------------------+
| weibo_user_visit_info_0 | CREATE TABLE `weibo_user_visit_info_0` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `weiboid` varchar(20) NOT NULL,
  `weiboun` varchar(50) NOT NULL,
  `apmac` varchar(100) DEFAULT NULL,
  `usermac` varchar(100) DEFAULT NULL,
  `mpnumber` varchar(11) DEFAULT NULL,
  `visittime` datetime NOT NULL,
  `source` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `weiboid` (`weiboid`)
) ENGINE=MyISAM AUTO_INCREMENT=17952 DEFAULT CHARSET=utf8 | 
+-------------------------+--------------------------------------------+
1 row in set (0.00 sec)

mysql> alter table weibo_user_visit_info_0 add index `search_index` (`apmac`(17),`visittime`);
Query OK, 17944 rows affected (0.21 sec)
Records: 17944  Duplicates: 0  Warnings: 0
mysql> explain select sql_no_cache count(distinct(a.mpnumber)) as mpnumber, date_format(a.bindtime,'%Y-%m-%d') as gDate from new_bind_mp_weibo_user_info_0 a left join weibo_user_visit_info_0 b on a.mpnumber=b.mpnumber  and a.apmac=b.apmac   where b.id is NULL and a.apmac in (select ap_mac from newwifi.business_installedAP_info where businessid=100064)  and a.bindtime between '2012-03-01' and '2012-03-23 23:59:59' group by gDate order by gDate;
+----+--------------------+---------------------------+-------+---------------+--------------+---------+----------------------------+------+-----------------------------+
| id | select_type        | table                     | type  | possible_keys | key          | key_len | ref                        | rows | Extra                       |
+----+--------------------+---------------------------+-------+---------------+--------------+---------+----------------------------+------+-----------------------------+
|  1 | PRIMARY            | a                         | range | search_key    | search_key   | 8       | NULL                       |  394 | Using where; Using filesort | 
|  1 | PRIMARY            | b                         | ref   | search_index  | search_index | 54      | newwifi_visit_info.a.apmac |  142 | Using where; Not exists     | 
|  2 | DEPENDENT SUBQUERY | business_installedAP_info | ref   | search_key    | search_key   | 306     | const,func                 |    1 | Using index                 | 
+----+--------------------+---------------------------+-------+---------------+--------------+---------+----------------------------+------+-----------------------------+
3 rows in set (0.00 sec)

mysql> select sql_no_cache count(distinct(a.mpnumber)) as mpnumber, date_format(a.bindtime,'%Y-%m-%d') as gDate from new_bind_mp_weibo_user_info_0 a left join weibo_user_visit_info_0 b on a.mpnumber=b.mpnumber  and a.apmac=b.apmac   where b.id is NULL and a.apmac in (select ap_mac from newwifi.business_installedAP_info where businessid=100064)  and a.bindtime between '2012-03-01' and '2012-03-23 23:59:59' group by gDate order by gDate;
+----------+------------+
| mpnumber | gDate      |
+----------+------------+
|        4 | 2012-03-01 | 
|       10 | 2012-03-02 | 
|        3 | 2012-03-03 | 
|       10 | 2012-03-04 | 
|       12 | 2012-03-05 | 
|       10 | 2012-03-08 | 
|        4 | 2012-03-09 | 
|       14 | 2012-03-12 | 
|       14 | 2012-03-13 | 
|        7 | 2012-03-14 | 
|       12 | 2012-03-15 | 
|        8 | 2012-03-16 | 
|        7 | 2012-03-17 | 
|       11 | 2012-03-18 | 
|       11 | 2012-03-19 | 
|        8 | 2012-03-20 | 
|        8 | 2012-03-21 | 
|        9 | 2012-03-22 | 
+----------+------------+
18 rows in set (2.44 sec)

mysql> alter table weibo_user_visit_info_0 drop index search_index;
Query OK, 17944 rows affected (0.13 sec)
Records: 17944  Duplicates: 0  Warnings: 0

mysql> explain select sql_no_cache count(distinct(a.mpnumber)) as mpnumber, date_format(a.bindtime,'%Y-%m-%d') as gDate from new_bind_mp_weibo_user_info_0 a left join weibo_user_visit_info_0 b on a.mpnumber=b.mpnumber  and a.apmac=b.apmac   where b.id is NULL and a.apmac in (select ap_mac from newwifi.business_installedAP_info where businessid=100064)  and a.bindtime between '2012-03-01' and '2012-03-23 23:59:59' group by gDate order by gDate;
+----+--------------------+---------------------------+-------+---------------+------------+---------+------------+-------+----------------------------------------------+
| id | select_type        | table                     | type  | possible_keys | key        | key_len | ref        | rows  | Extra                                        |
+----+--------------------+---------------------------+-------+---------------+------------+---------+------------+-------+----------------------------------------------+
|  1 | PRIMARY            | a                         | range | search_key    | search_key | 8       | NULL       |   394 | Using where; Using temporary; Using filesort | 
|  1 | PRIMARY            | b                         | ALL   | NULL          | NULL       | NULL    | NULL       | 17944 | Using where; Not exists                      | 
|  2 | DEPENDENT SUBQUERY | business_installedAP_info | ref   | search_key    | search_key | 306     | const,func |     1 | Using index                                  | 
+----+--------------------+---------------------------+-------+---------------+------------+---------+------------+-------+----------------------------------------------+
3 rows in set (0.00 sec)
mysql> select sql_no_cache count(distinct(a.mpnumber)) as mpnumber, date_format(a.bindtime,'%Y-%m-%d') as gDate from new_bind_mp_weibo_user_info_0 a left join weibo_user_visit_info_0 b on a.mpnumber=b.mpnumber  and a.apmac=b.apmac   where b.id is NULL and a.apmac in (select ap_mac from newwifi.business_installedAP_info where businessid=100064)  and a.bindtime between '2012-03-01' and '2012-03-23 23:59:59' group by gDate order by gDate;
+----------+------------+
| mpnumber | gDate      |
+----------+------------+
|        4 | 2012-03-01 | 
|       10 | 2012-03-02 | 
|        3 | 2012-03-03 | 
|       10 | 2012-03-04 | 
|       12 | 2012-03-05 | 
|       10 | 2012-03-08 | 
|        4 | 2012-03-09 | 
|       14 | 2012-03-12 | 
|       14 | 2012-03-13 | 
|        7 | 2012-03-14 | 
|       12 | 2012-03-15 | 
|        8 | 2012-03-16 | 
|        7 | 2012-03-17 | 
|       11 | 2012-03-18 | 
|       11 | 2012-03-19 | 
|        8 | 2012-03-20 | 
|        8 | 2012-03-21 | 
|        9 | 2012-03-22 | 
+----------+------------+
18 rows in set (1.72 sec)

Read more…

在mysql中获取insert插入数据的id的方法

我们在写数据库程序的时候,经常会需要获取某个表中的最大序号数,或者刚插入的数据的ID值。
一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的。
但在多线程,高并发的情况下,就不行了。
开始的时候我想的是使用mysql_insert_id(),不知道会不会在并发的时候产生影响,查询了下手册,也是才发现,是根据connection来的,不同用户间不会产生影响。所以也不用去想先把表锁起来,插入取得ID值后再解锁。直接正常插入,然后取值,即可。

int mysql_insert_id ([ resource $link_identifier ] )

mysql_insert_id()返回给定的 link_identifier中上一步 INSERT 查询中产生的 AUTO_INCREMENT 的 ID 号。如果没有指定 link_identifier,则使用上一个打开的连接。

如果上一查询没有产生 AUTO_INCREMENT 的值,则 mysql_insert_id()返回 0。如果需要保存该值以后使用,要确保在产生了值的查询之后立即调用 mysql_insert_id()。
warning: mysql_insert_id() 将 MySQL 内部的 C API 函数 mysql_insert_id()的返回值转换成 long(PHP 中命名为 int)。如果 AUTO_INCREMENT 的列的类型是 BIGINT,则 mysql_insert_id()返回的值将不正确。可以在 SQL 查询中用 MySQL 内部的 SQL 函数 LAST_INSERT_ID() 来替代。

此外,还可以通过QUERY两个SQL语句来执行:

--1 ,查询 LAST_INSERT_ID()
mysql> select LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                4 | 
+------------------+
1 row in set (0.00 sec)

--2 查询 @@IDENTITY
mysql> select @@IDENTITY;
+------------+
| @@IDENTITY |
+------------+
|          4 | 
+------------+
1 row in set (0.00 sec)

Read more…