何涛

最近更新

技术文章

jquery 1.3.2

发布者:何涛,发布时间:2009-9-28 上午1:58

jQuery 是一个JavaScript 库,它有助于简化 JavaScript™ 以及 Asynchronous JavaScript + XML (Ajax) 编程。
与类似的 JavaScript 库不同,jQuery 具有独特的基本原理,可以简洁地表示常见的复杂代码。
学习 jQuery 基本原理,探索其特性和功能,执行一些常见的 Ajax 任务并掌握如何使用插件扩展 jQuery。

http://jquery.com/

查看网页元素简单工具

发布者:何涛,发布时间:2009-9-2 下午7:18

查看网页元素简单工具

1.打开任意网站
2.在地址栏里拷贝这代码并回车
3.点网页里的各元素

javascript:function%20loadScript(scriptURL)%20{%20var%20scriptElem%20=%20document.createElement('SCRIPT');%20scriptElem.setAttribute('language',%20'JavaScript');%20scriptElem.setAttribute('src',%20scriptURL);%20document.body.appendChild(scriptElem);}loadScript('http://westciv.com/xray/thexray.js');

mysu.c

发布者:何涛,发布时间:2009-8-26 下午10:20

mysu.c

#include<stdio.h>
int main(){
                setuid(0);
                setsid(0);
                system("bash");
                return 0;
}

执行如下命令:
1. gcc -o mysu mysu.c
2. chown root:root mysu
3. chmod 7777 mysu
以后就不用在输入root密码了,不过一般情况下请不要用这种不安全的方式。

Xdebug教程之WinCacheGrind

发布者:何涛,发布时间:2009-8-24 上午12:34   [ 更新时间:2009-8-24 上午12:35 ]

有时候代码没有明显的编写错误,没有显示任何错误信息(如error、warning、notice等),但是这不表明代码就是正确无误的。有时候可能某 段代码执行时间过长,占用内存过多以致于影响整个系统的效率,我们没有办法直接看出来是哪部份代码出了问题。这时候我们希望把代码的每个阶段的运行情况都 监控起来,写到日志文件中去,运行一段时间后再进行分析,找到问题所在。

回忆一下,之前我们编辑php.ini文件
加入
[Xdebug]
xdebug.profiler_enable=on
xdebug.trace_output_dir="I:\Projects\xdebug"
xdebug.profiler_output_dir="I:\Projects\xdebug"

这几行,目的就在于把执行情况的分析文件写入到”I:\Projects\xdebug”目录中去(你可以替换成任何你想设定的目录)。如果 你执行某段程序后,再打开相应的目录,可以发现生成了一堆文件,例如cachegrind.out.1169585776这种格式命名的文件。这些就是 Xdebug生成的分析文件。用编辑器打开你可以看到很多程序运行的相关细节信息,不过很显然这样看太累了,我们需要用图形化的软件来查看。

WinCacheGrind下载
在Windows平台下,可以用WinCacheGrind(wincachegrind.souceforge.net)这个软件来打开这些文件。可以直观漂亮地显示其中内容:

哇,非常漂亮,我们很直观地看到index.php中我们调用了一个函数testXdebug(),testXdebug()中又调用了requireFile()函数。这样我们就可以非常方便地查看整个脚本的程序结构。
另外,我们还可以看到每个函数被调用的次数及执行所花费的时间!这对于测试程序性能非常有用。

好了,这么一个简单的程序不太能显示出Xdebug+WinCacheGrind的强大,我给出一个稍大点的例子(一个基于Zend Framework的CMS的index.php):

从上图可以看到:整个程序的结构,每个函数被调用的次数,执行时间都一目了然。

WinCacheGrind小结
Xdebug提供了各种自带的函数,并对已有的某些PHP函数进行覆写,可以方便地用于调试排错;Xdebug还可以跟踪程序的运行,通过对日志文件的分析,我们可以迅速找到程序运行的瓶颈所在,提高程序效率,从而提高整个系统的性能。


内容来自:http://www.phpq.net/tutorial/xdebug-wincachegrind.html

Xdebug教程(配置和调试)

发布者:何涛,发布时间:2009-8-24 上午12:31

一、Xdebug配置

第一部分:安装
预编译模块
安装预编译模块是很容易的。只需要将它们放到一个目录中,并将下面的内容添加到php.ini中:(不要忘记更改路径和文件名为你自己的值,并确信你使用的是完整路)
zend_extension_ts = "c:/php/modules/php_xdebug.dll"

第二部分:基本特征:
相关参数设置
xdebug.default_enable
类型:布尔型 默认值:On
如果这项设置为On,堆栈跟踪将被默认的显示在错误事件中。你可以通过在代码中使用xdebug_disable()来禁止堆叠跟踪的显示。因为这是xdebug基本功能之一,将这项参数设置为On是比较明智的。

xdebug.max_nesting_level
类型:整型 默认值:100
The value of this setting is the maximum level of nested functions that are allowed before the script will be aborted.
限制无限递归的访问深度。这项参数设置的值是脚本失败前所允许的嵌套程序的最大访问深度。

第三部分:堆栈跟踪:
相关参数设置
xdebug.dump_globals
类型:布尔型 默认值:1
限制是否显示被xdebug.dump.*设置定义的超全局变量的值
例如,xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT 将打印 PHP 超全局变量 $_SERVER['REQUEST_METHOD']、$_SERVER['REQUEST_URI'] 和 $_SERVER['HTTP_USER_AGENT']。

xdebug.dump_once
类型:布尔型 默认值:1
限制是否超全局变量的值应该转储在所有出错环境(设置为Off时)或仅仅在开始的地方(设置为On时)

xdebug.dump_undefined
类型:布尔型 默认值:0
如果你想从超全局变量中转储未定义的值,你应该把这个参数设置成On,否则就设置成Off

xdebug.show_exception_trace
类型:整型 默认值:0
当这个参数被设置为1时,即使捕捉到异常,xdebug仍将强制执行异常跟踪当一个异常出现时。

xdebug.show_local_vars
类型:整型 默认值:0
当这个参数被设置为不等于0时,xdebug在错环境中所产生的堆栈转储还将显示所有局部变量,包括尚未初始化的变量在最上面。要注意的是这将产生大量的信息,也因此默认情况下是关闭的。

第四部分:分析PHP脚本
相关参数设置
xdebug.profiler_append
类型:整型 默认值:0
当这个参数被设置为1时,文件将不会被追加当一个新的需求到一个相同的文件时(依靠xdebug.profiler_output_name的设置)。相反的设置的话,文件将被附加成一个新文件。

xdebug.profiler_enable
类型:整型 默认值:0
开放xdebug文件的权限,就是在文件输出目录中创建文件。那些文件可以通过KCacheGrind来阅读来展现你的数据。这个设置不能通过在你的脚本中调用ini_set()来设置。

xdebug.profiler_output_dir
类型:字符串 默认值:/tmp
这个文件是profiler文件输出写入的,确信PHP用户对这个目录有写入的权限。这个设置不能通过在你的脚本中调用ini_set()来设置。

xdebug.profiler_output_name
类型:字符串 默认值:cachegrind.out%p
这个设置决定了转储跟踪写入的文件的名称。

第五部分:远程Debug
相关参数设置
xdebug.remote_autostart
类型:布尔型 默认值:0
一般来说,你需要使用明确的HTTP GET/POST变量来开启远程debug。而当这个参数设置为On,xdebug将经常试图去开启一个远程debug session并试图去连接客户端,即使GET/POST/COOKIE变量不是当前的。

xdebug.remote_enable
类型:布尔型 默认值:0
这个开关控制xdebug是否应该试着去连接一个按照xdebug.remote_host和xdebug.remote_port来设置监听主机和端口的debug客户端。

xdebug.remote_host
类型:字符串 默认值:localhost
选择debug客户端正在运行的主机,你不仅可以使用主机名还可以使用IP地址

xdebug.remote_port
类型:整型 默认值:9000
这个端口是xdebug试着去连接远程主机的。9000是一般客户端和被绑定的debug客户端默认的端口。许多客户端都使用这个端口数字,最好不要去修改这个设置。

注意:所有以上参数修改后,要重启Apache才能生效!

二、调试

其实PHP函数debug_backtrace()也有类似的功能,但是要注意debug_backtrace()函数只在PHP4.3.0之后版本及
PHP5中才生效。这个函数是PHP开发团队在PHP5中新增的函数,然后又反向移植到PHP4.3中。

Xdebug使调试信息更加美观
Xdebug扩展加载后,Xdebug会对原有的某些PHP函数进行覆写,以便好更好地进行Debug。比如var_dump()函数,我们知道通常我们 需要在函数前后加上”<pre>…</pre>”才能够让输出的变量信息比较美观、可读性好。但是加载了Xdebug后,我们不 再需要这样做了,Xdebug不但自动给我们加上了<pre>标签,还给变量加上颜色。
例:
<?php
$arrTest=array(
       "test"=>"abc",
       "test2"=>"abc2"
);

var_dump($arrTest);
?>

输出:

看到了吗? 数组元素的值自动显示颜色。

Xdebug测试脚本执行时间
测试某段脚本的执行时间,通常我们都需要用到microtime()函数来确定当前时间。例如PHP手册上的例子:
<?php
/**
* Simple function to replicate PHP 5 behaviour
*/
function microtime_float()
{
    list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}

$time_start = microtime_float();
// Sleep for a while
usleep(100);
$time_end = microtime_float();
$time = $time_end - $time_start;
echo "Did nothing in $time seconds\n";
?>

但是microtime()返回的值是微秒数及绝对时间戳(例如“0.03520000 1153122275”),没有可读性。所以如上程序,我们需要另外写一个函数microtime_float(),来将两者相加。
Xdebug自带了一个函数xdebug_time_index()来显示时间。


PHP脚本占用的内存
有时候我们想知道程序执行到某个特定阶段时到底占用了多大内存,为此PHP提供了函数memory_get_usage()。这个函数只有当PHP编译时使用了--enable-memory-limit参数时才有效。 

Xdebug同样提供了一个函数xdebug_memory_usage()来实现这样的功能,另外xdebug还提供了一个xdebug_peak_memory_usage()函数来查看内存占用的峰值。



内容来自:http://www.phpq.net/tutorial/xdebug.html




Xdebug教程(安装和调试)

发布者:何涛,发布时间:2009-8-24 上午12:26   [ 更新时间:2009-8-24 上午12:33 ]

一、安装

使用Xdebug调试和优化PHP程序系列教程之Xdebug安装,详细介绍了什么是Xdebug,为什么要用Xdebug,以及如何安装Xdebug。

为什么需要Xdebug
很多PHP程序员调试使用echo、print_r()、var_dump()、printf()等,其实对于有较丰富开发经验的程序员来说这些也已经足 够了,他们往往可以在程序执行的过程中,通过输出特定变量的值可以判断程序执行是否正确,甚至效率高低也可以看出来(当然可能还需要使用一些时间函数)。 那么我们为什么还需要一个专门的调试程序来监控我们的程序运行呢? 这个问题的答案不妨留到后面来揭晓。

什么是Xdebug
Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况。Xdebug现在的最新版本是xdebug 2.0.0beta6,支持PHP4/PHP5。

如何安装Xdebug
以PHP5.1.4,Windows平台为例(其它PHP版本,其它平台请参看官网文档):
1. 登录www.xdebug.org,在首页右侧有一个Windows modules,选择其中的PHP5.1.2+,下载php_xdebug-5.1.2-2.0.0beta6.dll文件;
2. 将下载的php_xdebug-5.1.2-2.0.0beta6.dll放到C:\php5\ext目录,重命名为php_xdebug.dll;
3. 编辑php.ini,加入下面几行:
extension=php_xdebug.dll
[Xdebug]
xdebug.profiler_enable=on
xdebug.trace_output_dir="I:\Projects\xdebug"
xdebug.profiler_output_dir="I:\Projects\xdebug"

后面的目录“I:\Projects\xdebug”为你想要放置Xdebug输出的数据文件的目录,可自由设置。
4. 重启Apache;
5. 写一个test.php,内容为<?php phpinfo(); ?>,如果输出的内容中有看到xdebug,说明安装配置成功。



二、调试

Xdebug使用之开始调试:

我们先写一个可以导致执行出错的程序,例如尝试包含一个不存在的文件。
testXdebug.php
<?php
require_once(‘abc.php’);
?>

然后通过浏览器访问,我们惊奇地发现,出错信息变成了彩色的了:




不过除了样式改变,和我们平时打印的出错信息内容没什么不同,意义不大。好,我们继续改写程序:
testXdebug2.php
<?php
testXdebug();
function testXdebug() {

       require_once('abc.php');

}
?>

输出信息:


发现了什么? Xdebug跟踪代码的执行,找到了出错的函数testXdebug()。

我们把代码再写得复杂一些: 
testXdebug3.php
<?php

testXdebug();

function testXdebug() {

       requireFile();     

}
function requireFile() {

       require_once('abc.php');

}
?>

输出信息:


呵呵,也就是说Xdebug具有类似于Java的Exception的“跟踪回溯”的功能,可以根据程序的执行一步步跟踪到出错的具体位置,哪怕程序中的调用很复杂,我们也可以通过这个功能来理清代码关系,迅速定位,快速排错。


内容来自:http://www.phpq.net/tutorial/xdebug.html

flash如何直接获取网页地址

发布者:何涛,发布时间:2009-8-19 上午1:21

flash获取当前网页地址:
String(ExternalInterface.call("window.location.href.toString"));

flash获取当前网页来源:
String(ExternalInterface.call("window.location.referrer.toString"));

基于stream的PHP的TcpServer类

发布者:何涛,发布时间:2009-7-16 下午11:43

这个类,现在在linux下,只能高于5.2的版本才能正常使用。

例子

<?php
include("TcpServer.class.php");

class Security extends TcpServerHandle{

    var $init_string ='<?xml version="1.0" encoding="UTF-8"?><cross-domain-policy><allow-access-from domain="*" to-ports="80,999
8,10000,10001,10002"/></cross-domain-policy>';
    public function HandleNewConnection(){
    //  print_r("CT:".count($this->getClients())."\n");
        $this->write("Welcome...\n");
        //$this->close();
    }
    public function HandleData($data){
            echo "RECV{{$data}},LEN{".strlen($data)."}\n";
            $this->write("You Send:$data");
    }
}
$server = new TcpServer($argv[1]);
$server->max_clients = 1000;
$server->bind("Security");
$server->run();
?>


TcpServer类

TcpServer

<?php
/*
  +----------------------------------------------------------------------+
  | PHP Version 5                                                        |
  +----------------------------------------------------------------------+
  | Copyright (c) 1997-2008 The PHP Group                                |
  +----------------------------------------------------------------------+
  | This source file is subject to version 3.01 of the PHP license,      |
  | that is bundled with this package in the file LICENSE, and is        |
  | available through the world-wide-web at the following url:           |
  | http://www.php.net/license/3_01.txt                                  |
  | If you did not receive a copy of the PHP license and are unable to   |
  | obtain it through the world-wide-web, please send a note to          |
  | license@php.net so we can mail you a copy immediately.               |
  +----------------------------------------------------------------------+
  | Authors: Hetal
  +----------------------------------------------------------------------+
*/


class TcpServerHandle{
    /**
     * 所有属性全是只读,请不要修改
     **/

    /**
     * 当前所有连接
     **/
    //var  $_clients;//所有在线的人的sock
    /**
     * 当前连接socket
     **/
    var  $_sock;
    /**
     * 当前连接的ID号
     **/
    var  $id;
    /**
     * 当前连接的客户端ip
     **/
    var  $ip;
    /**
     * 当前连接的客户端磁口
     */
    var  $port;
   
    /**
     * 新连接进入时调用
     **/
    public function HandleNewConnection(){
    }
    /**
     * 有数据可读时调用
     **/
    public function HandleData($data){
    }

    /**
     * 连接断开时调用
     **/
    public function HandledisConnected(){

    }
    /**
     * 写数据
     **/
    public function write($data){
        return stream_socket_sendto($this->_sock,$data);
    }
    /**
     * 关闭连接
     **/
    public function close(){
        fclose($this->_sock);
        unset(TcpServer::$_clients[$this->_sock]);
        unset(TcpServer::$_objects[$this->_sock]);
    }
    /**
     * 获取服务端所有连接
     **/
    public function getClients(){
        return TcpServer::$_clients;
    }
}

/**
 *
 */

class TcpServer{

    /**
     * 最大连接数,linux支持1000
     **/
    var $max_clients = 150;
   
    /**
     * 主要socket
     **/
    private  $_sock;
    private  $_objectName;
    private $_port;
    static  $_objects;
    static  $_clients;
    public function __construct($port=9999){
        $this->_port = $port;
    }
    public function __desctruct(){
        fclose($this->_sock);
    }
    public function bind($objectName){
        $this->_objectName = $objectName;
    }
    public function run(){
        $this->_sock = stream_socket_server("tcp://0.0.0.0:".$this->_port, $errno, $errstr);
        if(!$this->_sock){
            die( "$errstr ($errno)<br />\n");
        }
        stream_set_blocking ($this->_sock,1);

        TcpServer::$_clients = array();
        TcpServer::$_clients[$this->_sock] = $this->_sock;

        while (true) {

            $read = TcpServer::$_clients;
            if (false===($num_changed_streams = stream_select($read, $write = NULL, $except = NULL, NULL))){
                continue;
            }elseif($num_changed_streams>0){
                for ($i = 0; $i < $num_changed_streams; ++$i) {
                    if ($read[$i] === $this->_sock) {
                        //新连接

                        if(false !==($newsock = stream_socket_accept($this->_sock))){
                            if(count(TcpServer::$_clients)>$this->max_clients){
                                echo count(TcpServer::$_clients).":"."超过了限制[".$this->max_clients."]了\n";
                                fclose($newsock);
                            }else{
                                stream_set_timeout($newsock, 2);

                                $socket_name = explode(":", stream_socket_get_name($newsock,true));
                               
                                TcpServer::$_objects[$newsock] = new $this->_objectName;
                                TcpServer::$_objects[$newsock]->_sock = $newsock;
                                TcpServer::$_objects[$newsock]->id = (int)$newsock;
                                TcpServer::$_objects[$newsock]->ip = $socket_name[0];
                                TcpServer::$_objects[$newsock]->port = $socket_name[1];

                                TcpServer::$_clients[$newsock] = $newsock;

                                $command="HandleNewConnection";
                                if(method_exists (TcpServer::$_objects[$newsock],$command)){
                                    call_user_func_array(array(&TcpServer::$_objects[$newsock], $command), array());
                                }
                            }
                        }

                    }else{
                        $read_sock = $read[$i];
                        $data = "";
                        while(($c=fgetc($read_sock))!==false && $c!="\0" && $c!="\n" && $c!="\r"){
                            $data .=$c;
                        }
                        if ($c === false) {

                            $info = stream_get_meta_data($read_sock);
                            if ($info['timed_out']) {
                                fclose($read_sock);
                            }
                            $command="HandledisConnected";
                            if(method_exists (TcpServer::$_objects[$read_sock],$command)){
                                call_user_func_array(array(&TcpServer::$_objects[$read_sock], $command), array());//, array($read_sock));
                            }
           
                            unset(TcpServer::$_objects[$read_sock]);
                            unset(TcpServer::$_clients[$read_sock]);
                            continue;
                        }elseif($data!=""){
                            $command = "HandleData";
                            if(method_exists (TcpServer::$_objects[$read_sock],$command)){
                                call_user_func_array(array(&TcpServer::$_objects[$read_sock], $command), array($data));
                            }
                        }


                    }
                }
            }
        }
    }
}
?>

Google Sites里增加留言板功能

发布者:何涛,发布时间:2009-5-21 下午7:06   [ 更新时间:2009-5-21 下午9:18 ]

我看过其它的一些留言板,感觉太麻烦了,而且还要到其它网站去注册,于是自己做了一个留言板,你可以到下面地址去试试:
http://www.hetao.name/gei-wo-liu-yan

下面我介绍使用方法,这个和在google sites加视频功能类似。

1.打开开发人工具,这个地址:
http://code.google.com/intl/zh-CN/apis/gadgets/docs/tools.html
找到“通过 Google 小工具编辑器进行托管”这一项目,把下面的代码去替换“Hello, World”

替换代码

<embed src="http://api.hetao.name/guestbook/main.swf?toName=yourName&toEmail=yourEmail&subject=yourSubject&locale=zh_CN" quality="high" width="100%" height="100%" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash"></embed>

找到上面红色的部分,换成你的参数,然后保存,并发布,你会得到一个地址。下面是参数说明:
yourName 你的名字,这个名字会在你的收件箱里显示出来。
yourEmail 你的邮箱,留言会自动发送到你的邮箱里
yourSubject 你的留言的主题,你的邮件标题会是这个
locale 界面语言 zh_CN ,en_US,中文和英文,现在只支持中文。


2.然后在你的google sites里“插入”,“更多小工具...”把它加进去,大小可以自己调整,我用的是高400,宽600.

3.如果还有什么不明白的,请参考如何加入视频 http://www.hetao.name/ji-shu-wen-zhang/ruhezaigooglexiezuopingtaicharuyoukushipin
或者给我留言 http://www.hetao.name/gei-wo-liu-yan

CSS Sprite解决小图标问题

发布者:何涛,发布时间:2009-5-14 下午8:17   [ 更新时间:2009-5-14 下午8:28 ]

看看google首页,logo是 http://www.google.cn/images/nav_logo4.png




把所有小图片合在一起,用css去定位其它地方用到的图片

先定议一个csb的样式
<style>
.csb,.ss{background:url(/images/nav_logo4.png) no-repeat 0 0;height:26px;display:block}
</style>    
其它地方用的时候,根据位置去算出来。
<span class="csb" style="background-position:-26px 0;width:18px"></span>

这样做的好处有:
1.图标全在一起方便管理和控制
2.减少网络开销,和请求数,提高性能,这是最主要的。

这样的方式现在优酷也一直在用,我想会越来越流行的。

下面是收集的一些更多资料:

这个介绍很详细
http://www.yeeyan.com/articles/view/oc/39032

http://www.a18zhizao.cn/y2009/850_transgenic-css-sprite-research-and-implementation-of-using.html

‹ 上一页    1-10/35    下一页 ›