登录 |

浏览器加载和渲染原理分析

2008年10月27日 下午 34:13 | 作者:

http://hi.baidu.com/seosky/blog/item/78d3394c130f86ffd72afc56.html

1.        IE下载的顺序是从上到下,渲染的顺序也是从上到下,下载和渲染是同时进行的。

2.        在渲染到页面的某一部分时,其上面的所有部分都已经下载完成(并不是说所有相关联的元素都已经下载完)。

3.        如果遇到语义解释性的标签嵌入文件(JS脚本,CSS样式),那么此时IE的下载过程会启用单独连接进行下载。

4.        并且在下载后进行解析,解析过程中,停止页面所有往下元素的下载。

5.        样式表在下载完成后,将和以前下载的所有样式表一起进行解析,解析完成后,将对此前所有元素(含以前已经渲染的)重新进行渲染。

6.        JS、CSS中如有重定义,后定义函数将覆盖前定义函数。

valgrind!一代神器

2008年10月22日 下午 59:02 | 作者:

安装Phurple,调试……怎么都出不来,

看Phurple作者的回帖,建议使用valgrind。

valgrind php test.php

太牛了,就是web界的firebug!

任何程序的相关调用,堆栈都出来了……

php报告是由于禁用了dl(),

修改了php.ini;

程序跑起来了……

然后偷窥到调用libpurple全过程,

太爽了!

dbcached批量获取键值(get keys)问题

2008年10月19日 上午 10:38 | 作者:

 dbcached(http://code.google.com/p/dbcached/) 是一种memcached缓存持久化解决方案。

add()之后,会通过udp包发给nmdp存储

如果get()未命中,则向nmdp取回数据,写入memcached

问题描述

Memcache::get支持单个键和批量键获取:
string Memcache::get ( string key )
array Memcache::get ( array keys )

当使用 Memcache::get ( array keys ) 时,如果key未命中:
dbcached向nmdp取回数据后,所有键值均为keys中最后一个键值

例:

var_dump($memcache->get(array(‘20020410070133′,’20040410070111’)));

首次请求,键值值全部为最后一个键(20040410070111)的键值:

array

  '20020410070133' => string '郭蓉' (length=6)
  '20040410070111' => string '郭蓉' (length=6)

刷新之后,由于数据已经读入memcached,输出正常:

array
  '20020410070133' => string '张伟' (length=6)
  '20040410070111' => string '郭蓉' (length=6)

解决方案(临时)

get两次 :!

$memcache->get($keys);
return $memcache->get($keys);


			

不测不知道,一测吓一跳!

2008年10月17日 下午 33:59 | 作者:

因为uchome不支持实名注册,我写了一个缓冲处理ob_call_back,将用户名(学号)替换为姓名:

程序流程:

  1. 初始生成一个php数组文件,array(‘学号’=>’姓名’)
  2. ob_call_back中,使用preg_replace_call替换

程序源码:


$file = 'data/sn_array.php';

if($_REQUEST['action'] = 'sn_array'){
sn_array($file);
}

$GLOBALS['sn'] = (array)require($file);

function name($matches){
$sn = $matches[1];
if(isset($GLOBALS['sn'][$sn])){
return '>' . $GLOBALS['sn'][$sn];
}
return '>' . $sn;
}

function sn($buffer){
return preg_replace_callback('/>(200\d{11})/', 'name', $buffer);
}

function sn_array($file){
require_once '../config.php';
$sql = "SELECT StudentID, Name FROM edu_studentinfo WHERE Name IS NOT NULL
UNION SELECT sn, name FROM usr WHERE name IS NOT NULL";
$sn = $GLOBALS['db']->GetAssoc($sql);
file_put_contents($file, '<?php return ' . var_export($sn, true) . '?>');
}

一直觉得很慢……

昨天用xdebug+webgrind一测,妖怪显形了!

profile显示每次都调用了adodb访问用户数据库,而不是我预想中的只在初始化用户数组时。

答案就在这:

if($_REQUEST['action'] = 'sn_array'){
sn_array($file);
}

== 写成了 =,导致每次请求都执行sn_array(),扫描用户全表,生成用户数组!

wap.qihoo.com,新人报道:奇虎第一个项目

2008年10月17日 下午 58:36 | 作者:

  1. 预期两周完成
    实际:2008-09-08 -> 2008-10-17
  2. 项目重/难点
    1. 页内分页:单页显示500个字符,图片算100个字符;相当于做了个xml解析
    2. 图片代理:将原始图片缩略图处理之后再传输给用户
    3. ubb解析:搜索引擎接口的平文本,ubb转换html;正则表达式列表
    4. tinyurl:通过压缩链接,将4k压缩到了2k以内
      1. 高速读写是个问题,用了memcachedb
      2. key键生成,用了62进制,将16位的hex压缩到10-11位;另还测试出手机支持的80个字符,能压缩到9位
    5. 手机兼容性:
      1. 通过w3c校验:先标准,再兼容!
      2. wap/xhtml自动切换:is_wap判断函数,四重过滤;Nokia的网络浏览器不支持wml
      3. meta设置文档类型,content-type必须全为小写,否则不兼容老手机
      4. cmwap接点上网,HTTP_USER_AGENT为空
  3. 经验
    1. Zend Framework
    2. 测试驱动,测试保障开发
    3. 真机(真实用户环境)测试

xdebug+webgrind

2008年10月17日 下午 26:22 | 作者:

xdebug

http://xdebug.org/

下载地址:

Source:

Windows modules:

windows

  1. 编辑php.ini,先注释掉zend:
    [Zend]
    ;zend_extension_ts = “D:\Xampp\php\zendOptimizer\lib\ZendExtensionManager.dll”
  2. 启用x-debug
    [xdebug]
    zend_extension_ts = “D:\Xampp\php\ext\php_xdebug-2.0.0-5.2.2.dll”;必须为完整路径
    xdebug.profiler_enable_trigger = 1
    xdebug.profiler_output_dir=”D:\Xampp\tmp\xdebug”

linux

  1. 安装xdebug扩展
    sudo pecl install xdebug
  2. 编辑php.ini,启用x-debug
    [xdebug]
    zend_extension_ts = “/usr/lib/php5/xdebug.so” ;必须为完整路径
    xdebug.profiler_enable_trigger = 1
    xdebug.profiler_output_dir=”/tmp”

webgrind

(http://code.google.com/p/webgrind/ )

下载地址:http://webgrind.googlecode.com/files/webgrind-release-0.81.zip

  1. 下载webgrind,解压缩到web目录
  2. 首先访问需要优化的php程序,get/post请求中加入XDEBUG_PROFILE
    例如info.php,http://localhost/info.php?XDEBUG_PROFILE
  3. 然后访问:http://localhost/webgrind/
    默认auto,即为刚刚请求的文件profile,[update]!
    程序不兼容IE(本机测试winxp+ie6),如果点了update之后毫无反应,请使用firefox。

类Memcached缓存系统

2008年10月12日 下午 39:13 | 作者:

  • cache:
    memcached
  • Persistent Storage solution:
    dbcached     = memcached + nmdb
    nmdb           = nmdb(memcached) => QDBM/berkeley db
    memcachedb = memcached(protocol) => berkeley db
    TokyoTyrant = memcached(protocol) => TokyoCabinet
  • dbm:
    TokyoCabinet(successor of QDBM)
    QDBM
    berkeley db

来奇虎一个月

2008年10月8日 下午 31:34 | 作者:

周鸿祎比想象中的胖,

肚子还有点大,

齐向东比照片上的老,

人却比照片更和蔼,

第一美女应该是代琳,

媒体的照片把她拍老了几岁……可恨!