看看最快多长时间能写完,参考地址:
文档: http://kb.mozillazine.org/Extension_development
Helloword: http://blog.csdn.net/TechnoFantasy/archive/2006/03/11/621859.aspx
Firefox 中的扩展与插件的区别
插件与扩展是完全不同的东西。
插件(Plugins/Plug-ins):
它通常是第三方应用程序提供给firefox使用的二进制文件。也就是说第三方应用程序把相关功能编译成了二进制的机器指令提供给各类浏览器,方便它们调用。
Firefox需要显示某些自身并不能显示的特定文件类型的时候,就会调用与之相关的第三方应用程序提供给firefox的插件来显示它。插件的作用也在于此。
windows下的firefox插件通常是dll格式,linux下的通常是so格式。
例 如,Adobe提供给firefox的插件“Adobe reader”使其能直接在浏览器里显示网络上的pdf文档,而Adobe提供给firefox 的另一个插件“Adobe shockwave flash”则使其能显示网页中嵌入的flash。Microsoft提供的 “Windows media player firefox plugin”使firefox能播放网页中嵌入的windows媒体(wmv、wma、 asf以及对应的播放列表格式)。
扩展(extensions):
它通常是扩展开发者为了修改或者增强firefox本身的功能而提供的一种打包格式。它通常由包含功能代码的js脚本、包含界面的xul文件以及包含皮肤的css文件和各种图像文件组成。少数特定平台下的扩展可能还会附带一些二进制文件。
扩展的格式都是xpi后缀的。其实是zip格式打包的。
常见的扩展有noscript、adblock plus等。
从形式上讲:插件是已经将代码编译成了机器指令的二进制文件,而扩展是一个源码包。
从作用上讲:插件是为了让firefox能够显示特殊格式的文件而由相应的第三方应用程序(如 windows media player 和 Adobe reader)提供的;而扩展是为了修改或增强firefox本身的功能而由扩展开发者提供的。
从字面意思上讲:插件(plug-ins)的plug是插的意思,一个由外至内的动作;扩展(extensions)的extension是延伸、扩充的意思,一个由内而外的动作。
也就是说:插件是“外部”的,而扩展是“内部”的。
Mozilla文章参考:
http://www.mozilla.org/projects/plugins/
https://developer.mozilla.org/en/Plugins
https://developer.mozilla.org/en/Extensions
快速区分PHP中的函数与结构
PHP中有些类似于函数的东西其实不是函数,如 echo exit unset print 等。 怎么可以快速知道这些是函数还是结构呢?
测试脚本:
1 2 3 4 5 6 |
<?php print_r(token_get_all(file_get_contents(__FILE__))); print ""; echo ""; unset($a); |
执行脚本: php test.php
如果被解析为 307 就是函数,否则就可能是结构(或别的什么)。
{当然您也可以直接查手册,手册中基本会提到的}
还可以用function_exists()来测试
—————————————
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
Array ( [0] => Array ( [0] => 367 [1] => <?php ) [1] => Array ( [0] => 307 [1] => print_r ) [2] => ( [3] => Array ( [0] => 307 [1] => token_get_all ) [4] => ( [5] => Array ( [0] => 307 [1] => file_get_contents ) [6] => ( [7] => Array ( [0] => 364 [1] => __FILE__ ) [8] => ) [9] => ) [10] => ) [11] => ; [12] => Array ( [0] => 370 [1] => ) [13] => Array ( [0] => 266 [1] => print ) [14] => Array ( [0] => 370 [1] => ) [15] => Array ( [0] => 315 [1] => "" ) [16] => ; [17] => Array ( [0] => 370 [1] => ) [18] => Array ( [0] => 316 [1] => echo ) [19] => Array ( [0] => 370 [1] => ) [20] => Array ( [0] => 315 [1] => "" ) [21] => ; [22] => Array ( [0] => 370 [1] => ) [23] => Array ( [0] => 348 [1] => unset ) [24] => ( [25] => Array ( [0] => 309 [1] => $a ) [26] => ) [27] => ; [28] => Array ( [0] => 370 [1] => ) [29] => Array ( [0] => 300 [1] => exit ) |
—————————————————-
PHP 一个有意思的报错
下面的一个测试脚本中,B类中在调用A的public方法m时写错了,当做静态的方法来用了,于是A->m()中的$this被解释成了B了。
-
<?php
-
error_reporting(2047);
-
class A{
-
private $v = 8;
-
public function m() {
-
echo $this->v;
-
}
-
}
-
class B{
-
public function __construct() {
-
A::m();
-
}
-
}
-
-
new B();
-
-
exit;
出错信息:
PHP Notice: Undefined property: B::$v in test.php on line 6
无语…
PHP 中关于资源的释放
问题:
将mysql连接或memcache连接变量直接unset()或赋值为null,连接会立即关闭吗?
测试脚本:
-
<?php
-
$m = new Memcache();
-
$m->connect("10.55.38.18", 11211);
-
//unset($m);
-
$m = null;
-
sleep(20);
执行命令:
strace php test.php
———————————————————–
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3
fcntl64(3, F_GETFL) = 0x2 (flags O_RDWR)
fcntl64(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0
connect(3, {sa_family=AF_INET, sin_port=htons(11211), sin_addr=inet_addr("10.55.38.18")}, 16) = -1 EINPROGRESS (Operation now in progress)
poll([{fd=3, events=POLLIN|POLLOUT|POLLERR|POLLHUP}], 1, 1000) = 1 ([{fd=3, revents=POLLOUT}])
getsockopt(3, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
fcntl64(3, F_SETFL, O_RDWR) = 0
close(3) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({20, 0}, 0xbfa1e114)
————————————————————————-
测试结果:
对于一个资源,使用unset()或 设置为null,都会立即关闭连接的。
大概关闭连接的操作是在引用变为0时触发的,具体实现还没看呢。
PHP的位操作
左移操作 ( << )
-
<?php
-
-
$i = 1;
-
for ($j = 0; $j < 64; $j++) {
-
$i = $i << 1;
-
echo decbin($i)."\n";
-
}
-
-
exit;
-
结果:
10
100
1000
…
10000000000000000000000000000000 (32位)
0
0
…
0
————————————————————————-
特点:
- 左移操作,有变补零
- 左移不循环
PHP session机制点滴
PHP里面管理session需要实现如下函数:
#define PS_OPEN_FUNC(x) int ps_open_##x(PS_OPEN_ARGS)
#define PS_CLOSE_FUNC(x) int ps_close_##x(PS_CLOSE_ARGS)
#define PS_READ_FUNC(x) int ps_read_##x(PS_READ_ARGS)
#define PS_WRITE_FUNC(x) int ps_write_##x(PS_WRITE_ARGS)
#define PS_DESTROY_FUNC(x) int ps_delete_##x(PS_DESTROY_ARGS)
#define PS_GC_FUNC(x) int ps_gc_##x(PS_GC_ARGS)
#define PS_CREATE_SID_FUNC(x) char *ps_create_sid_##x(PS_CREATE_SID_ARGS)
可参看: ext/session/php_session.h
至于这些函数在什么时候被触发调用,参看: ext/session/session.c
管理session的实例可以参看memcache模块(其它模块也有); 如关闭函数的定义:
- PS_CLOSE_FUNC(memcache)
- {
- mmc_pool_t *pool = PS_GET_MOD_DATA();
- if (pool) {
- mmc_pool_free(pool TSRMLS_CC);
- PS_SET_MOD_DATA(NULL);
- }
- return SUCCESS;
- }
一般情况下,一个请求中session只回写一次,在请求结束时回写;如果要在中间强制回写,则可以使用: session_write_close();函数, 但是一定要注意,回写之后session状态为关闭状态,再给$_SESSION数组赋值是不会回写的,除非重新session_start();
Couchbase-Membase
参考资料:
http://www.couchbase.com/merger
http://www.couchbase.com/products-and-services/membase-server
http://www.cnbeta.com/articles/134461.htm
初识 websocket
html5的一个特性就是websocket,以为是多么神奇的东西,弄了个测试例子,发现在协议层上是超简单的。
首先,已类似http协议的方式建立连接。
然后,一个连接可以多次收发消息;消息的格式基本为\0x00开始 \0xff结束
和原来的http请求的区别:
1. 原来的http请求至少在应用层面一次tcp的连接只能完成一个交互
2. 由于websocket一次连接可以交互多次,所以省去了很多http头的信息
测试代码: http://code.google.com/p/phpwebsocket/
参考资料:
http://dev.w3.org/html5/websockets/
http://www.zendstudio.net/archives/websocket-protocol/
协议流实例如下:(红色为请求,蓝色为响应)
重复说VPN
今天访问我的blog的时候,返回如下页面:
以为是我的blog坏了呢,用httpwatch看了一下,返回响应头信息为:
HTTP/1.1 504 Proxy Timeout
Via: 1.1 VPN4
才想起来自己拨了vpn了,估计是vpn不想代理了;虽然我拨了vpn,但是除了用于访问内部网资源也没它用了,访问我自己的blog不需要走vpn的,所以我修改一下本机的路由应该可以搞定。
- nslookup phpor.net : 66.147.244.189
- ipconfig
- PPP 适配器 新浪VPN(PPTP): 默认网关: 0.0.0.0
- 无线局域网适配器 无线网络连接 2: 默认网关: 192.168.1.1
- 因为我使用的是无线,所以,将phpor.net的网关添加到 192.168.1.1 就行了
- route add 66.147.244.189 mask 255.255.255.255 192.168.1.1
- 再次访问phpor.net : OK