Submitted by koyoz on 2012, January 17, 11:06 AM
Fatal error 一般是不需要捕获的, 但是在一个复杂的程序中, 如果偶然出现内存不足导致fatal error就难以处理了.
比如. fatal error 出在MySQL类中fetch的时候. 这个时候就很难定位到真正问题所在了.
PHP异常处理中 可以通过set_error_handler来捕获. 但是却只能捕获 NOTICE/WARNING级别的错误, 对于E_ERROR是无能为力的.
register_shutdown_function 能解决set_error_handler的不足.
通过此函数注册好程序结束回调函数, 就可以捕获平时捕获不到的错误了. 再通过 error_get_last 对错误进行判断. 就容易找出难以定位的问题了.
PHP代码
- function shutdown_function()
- {
- $e = error_get_last();
- print_r($e);
- }
-
- register_shutdown_function('shutdown_function');
PHP | 评论:0
| 阅读:153
Submitted by koyoz on 2011, November 27, 21:16 PM
1.首先需了解linux内一任务计划工具crontab
crontab可以定时去执行你要做的动作
直接用crontab命令编辑
crontab -u // 设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l // 列出某个用户cron服务的详细内容
crontab -r // 删除某个用户的cron服务
crontab -e // 编辑某个用户的cron服务
一般使用crontab -e来编辑一个计划动作,编辑模式同vi编辑器相同
crontab内的基本编辑格式如下
* * * * * command
分 时 日 月 周 命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
crontab文件的一些例子:
30 21 * * * /etc/init.d/smb restart
上面的例子表示每晚的21:30重启smb 。
45 4 1,10,22 * * /etc/init.d/smb restart
上面的例子表示每月1、10、22日的4 : 45重启smb 。
10 1 * * 6,0 /etc/init.d/smb restart
上面的例子表示每周六、周日的1 : 10重启smb 。
0,30 18-23 * * * /etc/init.d/smb restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启smb 。
0 23 * * 6 /etc/init.d/smb restart
上面的例子表示每星期六的11 : 00 pm重启smb 。
* */1 * * * /etc/init.d/smb restart
每一小时重启smb
* 23-7/1 * * * /etc/init.d/smb restart
晚上11点到早上7点之间,每隔一小时重启smb
0 11 4 * mon-wed /etc/init.d/smb restart
每月的4号与每周一到周三的11点重启smb
0 4 1 jan * /etc/init.d/smb restart
一月一号的4点重启smb
2.寻找一个网络时间服务器,比如一些国家授时中心
» 阅读全文
Tags: linux
Linux资料 | 评论:0
| 阅读:470
Submitted by koyoz on 2011, November 21, 01:34 AM
高性能javascript-数据访问
- 访问直接量和局部变量的速度最快, 想法, 访问数组元素和对象成员相对较慢
- 由于局部变量存在于作用域链的起始位置, 因此访问局部变量比访问跨作用域变量更快. 变量在作用域链中的位置越深, 访问所需时间就越长. 由于全局变量总处在作用域链的最末端, 因此访问速度也是最慢的
- 避免使用with语句, 因为它会改变运行中上下文作用域链. 同样, try-catch语句中的catch子句也有同样的影响, 因此也要小心使用
- 嵌套的对象成员会明显影响性能, 尽量少用
- 属性或方法在原型链中位置越深, 访问它的速度就越慢
- 通常可以把常用的对象成员, 数组元素, 跨域变量保存在局部变量中来改善js性能
Tags: javascript
javascript | 评论:0
| 阅读:514
Submitted by koyoz on 2011, November 17, 21:09 PM
高性能javascript-加载和执行
- </body>闭合标签之前, 将所有的<script>标签放到页面底部. 这能确保在脚本执行之前页面已经完成了渲染
- 合并脚本. 页面中的<script>标签越少, 加载也就越快, 响应也更迅速. 无论是外链还是内嵌.
- 无阻塞下载javascript的方法:
- 使用<script>表情的defer属性 (仅IE, FF3.5+)
- 使用动态创建的<script>元素来下载并执行代码
- 使用XHR对象下载javascript并注入页面中
Tags: javascript
javascript | 评论:0
| 阅读:460
Submitted by koyoz on 2011, October 20, 16:42 PM
用PHP 检测手机类型.
支持的手机挺多的. 不多说 看附件中的代码吧.
官方链接 http://detectmobilebrowsers.mobi/
附件: mobile_device_detect.zip (7.41 K, 下载次数:17)
PHP | 评论:0
| 阅读:357
Submitted by koyoz on 2011, October 19, 00:51 AM
1、研究说明
Tencent在tqq.tencent.com的8000有一个使用HTTP的QQ接口,通过这个接口,可以进行一些基本的操作,如:登陆、登出、改变登陆状态(上线、忙碌、离线、隐身)、添加删除好友、查看好友信息、发送验证信息(接受被加为好友、申请加对方为好友、拒绝被加为好友)、收发用户消息、系统信息。
目前我研究的是1.1版本的HTTP QQ协议,研究是微程在的成果上进行的,不敢说有什么超越,只不过更为详细和准确。
» 阅读全文
Web资料 | 评论:0
| 阅读:508
Submitted by koyoz on 2011, October 11, 17:34 PM
下载 http://pecl.php.net/get/APC-3.1.9.tgz
配置参数如下:
./configure --enable-apc --enable-apc-spinlocks --disable-apc-pthreadmutex
安装过程就不说了, 标准的php扩展安装模式.
2套配置文件
性能高, 不适合频繁更新:
apc.enabled=1
apc.stat = 0
apc.stat_ctime = 0
apc.shm_size = 64M
apc.shm_segments = 1
apc.num_files_hint = 1000
apc.ttl = 0
apc.slam_defense = 0
apc.write_lock = 1
apc.file_update_protection = 2
性能稍低
apc.enabled=1
apc.stat = 1
apc.stat_ctime = 1
apc.shm_size = 64M
apc.shm_segments = 1
apc.num_files_hint = 1000
apc.ttl = 86400
apc.slam_defense = 0
apc.write_lock = 1
apc.file_update_protection = 2
2套配置关键在于apc.stat, 开启后APC将不会检查文件是否更新, 这样可以减少大量不必要的系统调用.
但是, 对于新发布的问题 需要重新启动PHP. 可以根据情况选择.
另外, 附上参数说明:
- apc.enabled boolean
-
apc.enabled 可以设成 0 来禁用 APC.主要是用在当 APC 被静态编译入 PHP 时,因为没有其它方法来禁用了(编译为 DSO , 的时候,可以将php.ini中的extension 行注释掉)。
apc.shm_segments integer-
编译器缓存要分配的共享内存块的数目。如果 APC 用光了共享内存但是已经将 apc.shm_size 设为了系统所能允许的最大值,可以尝试增大此值。
apc.shm_size integer-
以 MB 为单位的每个共享内存块的大小。默认时,有些系统(包括大多数 BSD 变种)的共享内存块大小非常低。
apc.optimization integer-
优化级别。设为 0 则禁用优化器,更高的值则使用更主动的优化。期望非常有限的速度提升。尚在试验中。
apc.num_files_hint integer-
Web 服务器上的被包含或被请求的不同源文件的数目的大概估计。如果不确定则设为 0 或去掉此项;此设定主要用在有数千个源文件的站点。
apc.user_entries_hint integer-
与apc.num_files_hint类似, 根据唯一用户数来存储缓存变量。 如果不能确定则设置为0或或去掉此项。
apc.ttl integer-
缓存条目在缓冲区中允许逗留的秒数。0 表示永不超时。建议值为7200~86400 设为 0 意味着缓冲区有可能被旧的缓存条目填满,从而导致无法缓存新条目。
apc.user_ttl integer-
类似于apc.ttl,只是针对每个用户而言,建议值为7200~86400。 设为 0 意味着缓冲区有可能被旧的缓存条目填满,从而导致无法缓存新条目。 如果大于0,APC将尝试删除过期条目。
apc.gc_ttl integer-
缓存条目在垃圾回收表中能够存在的秒数。此值提供了一个安全措施,即在服务器进程在执行缓存的源文件时,如果该文件被修改则旧版本将不会被回收,直到达到此 TTL 为止。设为零将禁用此特性。
apc.cache_by_default boolean-
默认为 on,但可以设为 off 并和加号开头的 apc.filters 一起用,则文件仅在匹配过滤器时被缓存。
apc.filters string-
一个以逗号分隔的 POSIX 扩展正则表达式的列表。如果任一个模式匹配源文件名,则该文件不被缓存。注意用来匹配的文件名是传递给 include/require 的文件名,而不是绝对路径。如果正则表达式的第一个字符是+ t则意味着任何匹配表达式的文件会被缓存,如果第一个字符是 - 则任何匹配项都不会被缓存。 -是默认值,可以省略掉。
apc.mmap_file_mask string-
如果使用 --enable-mmap(默认启用)为APC编译了MMAP支持, 这里的值就是传递给mmap模块的mktemp风格的文件掩码(建议值为" /tmp/apc.XXXXXX")。 该掩码用于决定内存映射区域是否要被file-backed或者shared memory backed。 对于直接的file-backed内存映射,要设置成"/tmp/apc.XXXXXX"的样子(恰好6个X)。 要使用POSIX风格的shm_open/mmap就需要设置成"/apc.shm.XXXXXX"的样子。 你还可以设为"/dev/zero"来为匿名映射的内存使用内核的"/dev/zero"接口。 不定义此指令则表示强制使用匿名映射。
apc.slam_defense integer-
在非常繁忙的服务器上,无论是启动服务还是修改文件, 都可能由于多个进程企图同时缓存一个文件而导致竞争条件。 这个选项用于设置进程在处理未被缓存的文件时跳过缓存步骤的百分率。 比如设为75表示在遇到未被缓存的文件时有75%的概率不进行缓存,从而减少碰撞几率。 反对使用该指令,鼓励设为 0来禁用这个特性。建议该用apc.write_lock指令。
Deprecated by apc.write_lock.
apc.file_update_protection integer-
当你在一个运行中的服务器上修改文件时,你应当执行原子操作。 也就是先写进一个临时文件,然后将该文件重命名(mv)到最终的名字。 文本编辑器以及 cp, tar 等程序却并不是这样操作的,从而导致有可能缓冲了残缺的文件。 默认值 2 表示在访问文件时如果发现修改时间距离访问时间小于 2 秒则不做缓冲。 那个不幸的访问者可能得到残缺的内容,但是这种坏影响却不会通过缓存扩大化。 如果你能确保所有的更新操作都是原子操作,那么可以用 0 关闭此特性。 如果你的系统由于大量的IO操作导致更新缓慢,你就需要增大此值。
apc.enable_cli integer-
是否为CLI版本启用APC功能,仅用于测试和调试目的才打开此选项。 在正常情况下不是理想的创建、 填充和销毁 CLI 的每个请求上的 APC 缓存,但各种测试方案很有用,能够轻松地使 CLI 版本的 PHP APC
apc.max_file_size integer-
默认1M, 对于大于此值的文件将不进行缓存.
apc.stat integer-
是否启用脚本更新检查。 改变这个指令值要非常小心。 默认值 On 表示APC在每次请求脚本时都检查脚本是否被更新, 如果被更新则自动重新编译和缓存编译后的内容。但这样做对性能有不利影响。 如果设为 Off 则表示不进行检查,从而使性能得到大幅提高。 但是为了使更新的内容生效,你必须重启Web服务器(译者注:如果采用cgi/fcgi类似的,需重启cgi/fcgi进程)。 生产服务器上脚本文件很少更改, 可以通过禁用本选项获得显著的性能提升。
这个指令对于include/require的文件同样有效。但是需要注意的是, 如果你使用的是相对路径,APC就必须在每一次include/require时都进行检查以定位文件。 而使用绝对路径则可以跳过检查,所以鼓励你使用绝对路径进行include/require操作。
apc.write_lock boolean-
在繁忙的服务器上,Web服务器第一次被启动,或者很多文件在同一时间被修改,APC可能会多次编译同一个文件,写锁保证只有一个进程将尝试编译并缓存未缓存的脚本。其他进程试图使用该脚本将不使用opcode缓存,而不是锁定和等待缓存生成。
apc.report_autofilter boolean-
是否记录所有由于early/late binding原因而自动未被缓存的脚本。
apc.include_once_override boolean-
优化include_once()和require_once()函数以避免执行额外的系统调用。
- apc.rfc1867 boolean
-
开启监控文件上传进度功能
- apc.rfc1867_prefix string
-
用于上传文件的缓冲项条目名称前缀
apc.rfc1867_name string-
需要由APC处理的上传文件的隐藏表单项名称
apc.rfc1867_freq string-
用户上传文件缓存项的更新频率。 取值可以是总文件大小的百分比,或者以 "k", "m", or "g" kilobytes, megabytes, or gigabytes 结尾的绝对尺寸 (大小写不敏感). 0 表示尽可能快的更新,不过这样可能会导致上传速度下降。
apc.rfc1867_ttl bool-
TTL for rfc1867 entries.
apc.localcache boolean-
使用非锁定本地进程shadow-cache ,它可以减少了向缓冲区写入时锁之间的竞争。
apc.localcache.size integer-
The size of the local process shadow-cache, should be set to a sufficiently large value, approximately half of apc.num_files_hint.
apc.coredump_unmap boolean-
启用APC的信号句柄,例如SIGSEGV信号,当信号写入核心文件。当这些信号被接收,APC将试图取消映射的共享内存段,从核心文件中排除它。此设置可以提高系统的稳定性,当接受到致命的信号或者采用APC的大型共享内存段配置方式。
- apc.stat_ctime integer
-
验证ctime(创建时间)可以避免SVN或者rsync带来的问题,确保自上次统计inode没有改变。APC通常只检查mtime(修改时间)。
apc.canonicalize bool-
如果设置为on,则在no-state 模式(不检查文件更新)时会将相对路径改为绝对路径。
apc.preload_path string-
apc.use_request_time bool-
Use the SAPI request start time for TTL.
apc.file_md5 bool-
记录文件的md5值
apc.lazy_functions integer-
启用函数延迟加载
apc.lazy_classes integer-
启用类延迟加载
Tags: php
PHP | 评论:0
| 阅读:421
Submitted by koyoz on 2011, October 10, 16:05 PM
http://www.dianping.com/shop/2770231
已这个地址为例, 在右边有一小块地图, 上面标注了餐馆所在的位置.
只要在浏览器的地址输入或者在firebug中运行
javascript:function getpos() {var shop_map_ctrl=new Map($("J_gmap-cont"),[{poi:DP.data().mapData.poi}],{css:{width:238,height:240},scaleLevel:16});
alert(shop_map_ctrl.initPoint.Ba.y+','+shop_map_ctrl.initPoint.Ba.x)};getpos();void(0);
就可以获得坐标. (28.19851,112.98604)
在google地图中搜索即可对应到正确的位置: http://maps.google.com.hk/maps?q=28.19851,112.98604&hl=en&sll=28.200158,112.984128&sspn=0.006051,0.022724&vpsrc=0&brcurrent=3,0x0:0x0,0&t=m&z=15
初步分析, 大众点评是把坐标进行了加密, 再通过JS解密出来生成地图. 不过js是透明的,总是可以简单的获取到坐标. 想必是为了防止采集.
如果要批量采集, 需要把js加密代码转换成对于的采集代码 就可以批量抓取坐标了.
Tags: javascript
javascript | 评论:0
| 阅读:483