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

阅读全文

我们在写数据库程序的时候,经常会需要获取某个表中的最大序号数,或者刚插入的数据的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语句来执行:

阅读全文

首先说一下mysql的数值类型,MySQL支持所有标准SQL数值数据类型。这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。

BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。

作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。

<td>
  <strong>字节</strong>
</td>

<td>
  <strong>最小值</strong>
</td>

<td>
  <strong>最大值</strong>
</td>
<td>
</td>

<td>
  <strong>(带符号的/无符号的)</strong>
</td>

<td>
  <strong>(带符号的/无符号的)</strong>
</td>
<td>
  1
</td>

<td>
  -128
</td>

<td>
  127
</td>
<td>
</td>

<td>
</td>

<td>
  255
</td>
<td>
  2
</td>

<td>
  -32768
</td>

<td>
  32767
</td>
<td>
</td>

<td>
</td>

<td>
  65535
</td>
<td>
  3
</td>

<td>
  -8388608
</td>

<td>
  8388607
</td>
<td>
</td>

<td>
</td>

<td>
  16777215
</td>
<td>
  4
</td>

<td>
  -2147483648
</td>

<td>
  2147483647
</td>
<td>
</td>

<td>
</td>

<td>
  4294967295
</td>
<td>
  8
</td>

<td>
  -9223372036854775808
</td>

<td>
  9223372036854775807
</td>
<td>
</td>

<td>
</td>

<td>
  18446744073709551615
</td>

Mysql类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4))。该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度。显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。

当结合可选扩展属性ZEROFILL使用时, 默认补充的空格用零代替。例如,对于声明为INT(5) ZEROFILL的列,值4检索为00004。请注意如果在整数列保存超过显示宽度的一个值,当MySQL为复杂联接生成临时表时会遇到问题,因为在这些情况下MySQL相信数据适合原列宽度。

所有整数类型可以有一个可选(非标准)属性UNSIGNED。当你想要在列内只允许非负数和该列需要较大的上限数值范围时可以使用无符号值。

所以int(10)与int(11)后的括号中的字符表示显示宽度,整数列的显示宽度与mysql需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系,int类型的字段能存储的数据上限还是2147483647(有符号型)和4294967295(无符号型)。

阅读全文

google了下,没有找到如何通过apache日志计算出PV数和UV数,在知乎上提问了个,等待高人解答吧。

—–

等了一下午,知乎上也木有人能给出合理的算法,chinaunix上也木有,stackoverflow.com上也木有,自己找时间看一下awstats吧,看看能不能找到答案。

—-

来公布答案了~~

查询了awstats的文档说明,http://awstats.sourceforge.net/docs/awstats_glossary.html 这里

Glossary

Unique Visitor:

A unique visitor is a person or computer (host) that has made at least 1 hit on 1 page of your web site during the current period shown by the report. If this user makes several visits during this period, it is counted only once. Visitors are tracked by IP address, so if multiple users are accessing your site from the same IP (such as a home or office network), they will be counted as a single unique visitor.

The period shown by AWStats reports is by default the current month.

However if you use AWStats as a CGI you can click on the “year” link to have a report for all the year. In such a report, period is a full year, so Unique Visitors are number of hosts that have made at least 1 hit on 1 page of your web site during the year.

awstats中, unique visitor 是根据IP来计算的,所以awstats中统计的UV值,即是IP值。

webtrends中, 也有对UV的统计,不过webtrends也是有JS统计代码的,所以,它的统计原理跟大部分统计代码都一样,通过JS获取客户端的cookie来计算UV值。

附一段webtrends的统计代码,为了避嫌,把敏感信息改掉了,大家看看就行了:

查看并询问了一些关于Google Analytics计算UV数的算法,记录如下(感谢 yeshu http://www.wainsight.com):

Google Analytics对于独立访客(UV)的计算,是基于访客浏览器中cookie来确定的,当访客第一次(或cookie丢失后)访问添加GATC的代码时,便会创建一个唯一的cookie(即一个UV),cookie中utma变量记录了访客ID、访问次数、访问时间等信息,UV数以此累加。当访客丢失cookie或更换浏览器重新访问网站,都将会被认为新访客,而创建一个cookie,记录为一个新的UV。

.

以下内容也是一些关于apache日志分析的东东,记录下来。

1.什么是UV?

UV是unique visitor的简写,是指独立访客,是以实际访问的电脑计数。

2.什么是IP?

IP是国际互联网协议(Internet Protocol)的简称,是通过网络间信息地址定位具体计算机的方式之一。

3.UV和IP的概念有什么区别?

对于IP来说,它在同一级别的网络(例如某个局域网、社区网、教学楼网或者INTERNET)范围内是唯一的,同一局域网内的所有电脑都只有一个共同ip。

举例来说,我在一个局域网里,对外的IP是219.129.170.111,那么跟我同一局域网里的所有电脑都是这个IP,也就是说假如整个局域网的电脑都访问您的网站的话,在24小时内也只计算一个IP,所以相对UV来说不是很精确。

而UV跟IP稍有不同,UV是访问你的网站的每一台电脑客户端。现在很多朋友用的网络都是局域网,引入了UV后,就能更精确的统计。

总结:

UV的统计数比IP更为准确,能够准确的计数每一台访问电脑,而IP把同一局域内的所有电脑视为一个。

(PS:UV计数会涉及COOKIE。)

 

阅读全文

Google Analytics功能非常强大,只要在网站的页面上加入一段代码,就可以提供的丰富详尽的图表式报告。Google Analytics的数据采集功能是采用AJAX技术来实现,整体架构如图所示:

我们都知道在使用Google Analytics需要在网站上加上跟踪代码(Google Analytics Tracking Code,简称GATC) ,下面我们就来研究下跟踪代码是如何进行工作的。

谷歌分析跟踪代码(GATC) 检索网页数据如下:

浏览器请求的网页包含跟踪代码。

GATC创建并初始化一个对象的属性与网络相关的跟踪ID在代码中。

GATC执行你自定义任何跟踪方法。

跟踪代码初始化和管理以下信息:跟踪检索查看是否包括广告系列;收集HTTP请求中的各种用户信息的到Google GATC。

将访问者HTTP请求包含GATC跟踪信息收集到参数名单。

阅读全文

作者的图片

DigDeeply

Technology Stack: Golang/PHP/Openresty, and so on…

Web Development Engineer

Beijing China