Google圣诞首页Doodle

1 Comment2011.12.26 15:53 by admin 

谷歌就是谷歌,在2011圣诞节来临之际推出了又一Doodle神作。

你可以通过点击六种颜色的按钮点亮Doodle里的字母,之后doodle就开始自己播放《铃儿响叮当》了。同时整个背景也变成黑色,配合闪亮的彩灯,非常漂亮。

面对这么有收藏价值的Doodle,当然要把它扒下来,放在自己博客上炫一下了。Google保留所有权利。

PHP使用SSH扩展

Leave a Comment2011.11.01 18:01 by admin 

PHP添加SSH扩展,就可以在WEB页面利用PHP来管理我们的Linux主机了。这样是不是对服务器管理人员来说,可以减轻不少的负担呢。

[Windows]

修改PHP.ini文件,添加extension = php_ssh2.dll;

$connection = ssh2_connect(‘*.*.*.*’, 22);
if (ssh2_auth_password($connection, ‘user’, ‘pass’)) {
echo “Authentication Successful!\n”;
} else {
die(‘Authentication Failed…’);
}
$stream = ssh2_exec($connection, ‘ls’);
stream_set_blocking($stream, true);
$data = “”;
while($buf = fread($stream, 4096)) {
$data .= $buf;
}
fclose($stream);
echo $data;

1、 R[=code](force redirect) 强制外部重定向。

强制在替代字符串加上http://www.beingexperts.com[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。

2、 F(force URL to be forbidden)禁用URL,返回403HTTP状态码。

3、 G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。

4、 P(force proxy) 强制使用代理转发。

5、 L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。

6、 N(next round) 重新从第一条规则开始运行重写过程。

7、 C(chained with next rule) 与下一条规则关联

如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。

8、 T=MIME-type(force MIME type) 强制MIME类型

9、 NS (used only if no internal sub-request) 只用于不是内部子请求

10、 NC(no case) 不区分大小写

11、 QSA(query string append) 追加请求字符串

12、 NE(no URI escaping of output) 不在输出转义特殊字符

例如:RewriteRule /foo/(.*)  /bar?arg=P1\%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zoo

13、 PT(pass through to next handler) 传递给下一个处理

14、 S=num(skip next rule(s)) 跳过num条规则

15、 E=VAR:VAL(set environment variable) 设置环境变量

我们在做系统的时候,一般都需要记录一些网站的日志信息,当然Apache服务器本身是有日志记录的,不过有时候我们也可以利用数据库来记录网站的访问日志,用数据库的目的就是方便系统管理员查询,而Apache的服务日志,对于一个一般的操作人员来说,在其中查找信息还是非常不方便的。

记录客户端的IP信息,我们也经常的需要用到,如果你是建一个销售的站点,你应该需要考虑你的客户是从哪里来的,你的客户是哪个地区(或是哪个国家)的,而这些信息都可以帮助你日后分析你的网站,当然现在的一些站点记录器(如CNZZ,StatCounter等)都带有这些功能。

if(getenv(‘HTTP_CLIENT_IP’) && strcasecmp(getenv(‘HTTP_CLIENT_IP’), ‘unknown’)) {
    $onlineip = getenv(‘HTTP_CLIENT_IP’);
} elseif(getenv(‘HTTP_X_FORWARDED_FOR’) && strcasecmp(getenv(‘HTTP_X_FORWARDED_FOR’), ‘unknown’)) {
    $onlineip = getenv(‘HTTP_X_FORWARDED_FOR’);
} elseif(getenv(‘REMOTE_ADDR’) && strcasecmp(getenv(‘REMOTE_ADDR’), ‘unknown’)) {
    $onlineip = getenv(‘REMOTE_ADDR’);
} elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], ‘unknown’)) {
    $onlineip = $_SERVER['REMOTE_ADDR'];
}

preg_match(“/[\d\.]{7,15}/”, $onlineip, $onlineipmatches);
$onlineip = $onlineipmatches[0] ? $onlineipmatches[0] : ‘unknown’;
unset($onlineipmatches);

上面是从Discuz源码找到一段,用来获取客户端IP地址的源码。IP地址保存在变量$onlineip中。

Linux Debian 5 安装VHCS 2面板

Leave a Comment2010.12.10 21:41 by admin 

又是好长时间没有写博客了,不过最近也比较忙,一直在买主机。以前都是用别人买好的主机,安装好的面板,直接使用;但是最近换成自己来买主机了,也体会到了管理主机的同事的痛苦。前期下单比较正常,当你拿到主机后,还能对主机进行一些配置后才能正常的使用。

这里我就来说说如何在Debian 5系统上安装VHCS 2面板。

1、 修改更新源 

编辑更新源,将更新源中的光盘源取消掉 

#vim /etc/apt/sources.list  

  

并添加下面的源

deb http://ftp.debian.org/debian/ lenny main contrib non-free

deb http://security.debian.org/ lenny/updates main contrib non-free

 

2、 安装ssh server

# apt-get install ssh openssh-server

 

3、 设置主机名

 

编辑/etc/hosts

# vim /etc/hosts

编辑后的内容如下:

127.0.0.1 localhost.localdomain localhost

192.168.0.100 host.ispcpcn.com host

# The following lines are desirable for IPv6 capable hosts

::1 localhost ip6-localhost ip6-loopback

fe00::0 ip6-localnet

ff00::0 ip6-mcastprefix

ff02::1 ip6-allnodes

ff02::2 ip6-allrouters

ff02::3 ip6-allhosts

运行下面的命令,对/etc/hostname中的主机名进行修改:

host:~# echo host.ispcpcn.com > /etc/hostname

host:~# /etc/init.d/hostname.sh start

 

4、 更新系统,并安装部分软件

# aptitude update

# aptitude upgrade

# aptitude install tar bzip2 wget lsb-release

 

5、 建立下载目录,并下载VHCS2最新版,然后解压缩

# mkdir downloads

# cd downloads

# wget http://64.56.77.168/vhcs-2.4.8.zip

      //wget http://server5.moll-newmedia.de/vhcs-2.4.8.tar.bz2

# tar -xjvf vhcs-2.4.8.tar.bz2

 

6、 切换到VHCS2的目录,建立需要安装的文件列表包:

# cd vhcs-2.4.8

# cd docs

# vim debian5-packages.txt

        文件包内容如下

apache2
apache2.2-common
apache2-mpm-prefork
bind9
bzip2
courier-authdaemon
courier-base
courier-imap
courier-maildrop
courier-pop
diff
dnsutils
gcc
gzip
iptables
libapache2-mod-php5
libberkeleydb-perl
libc6-dev
libcrypt-blowfish-perl
libcrypt-cbc-perl
libcrypt-passwdmd5-perl
libdate-calc-perl
libdate-manip-perl
libdbd-mysql-perl
libdbi-perl
libio-stringy-perl
libmail-sendmail-perl
libmailtools-perl
libmcrypt4
libmd5-perl
libmime-perl
libnet-dns-perl
libnet-netmask-perl
libnet-perl
libnet-smtp-server-perl
libperl5.10
libsasl2-2
libsasl2-modules
libsnmp-session-perl
libterm-readkey-perl
libterm-readpassword-perl
libtimedate-perl
make
mysql-client
mysql-common
mysql-server
original-awk
patch
perl
perl-base
perl-modules
php5
php5-gd
php5-mcrypt
php5-mysql
php-pear
postfix
postfix-tls
procmail
proftpd
sasl2-bin
ssh
tar
wget

wq!保存退出

 

7、 安装上述添加的软件包

# aptitude install $(cat ./debian5-packages.txt)

  

²  在安装过程中,会出现如下问题的提示或者请求,请按照如下方式进行设置和输入:

A、正在设定mysql-server-5.0

1>   New Password for MYSQL “root” user: –>设置MYSQLroot用户密码,输入您要设定的密码

2>   Repeat password for the MySQL “root” User: –> 重复输入密码进行确认

BPostfix Configuration

1>   直接按回车确定

2>   General type of mail configuration: –>选择Internet Site回车

3>   System mail name: –>保持默认,回车

CProFTPd configuration

出现要求Run proftpd: –>选择standalone,回车

D、编辑/etc/default/saslauthd

       vim /etc/default/saslauthd

       START=no改成START=yes,如下:

[......]

START=yes

[......]

 

注:若mysql在安装过程中有Innodb报错,则需要需要修改配置文件mysql.conf,找到#skip-innodb这一行,将注释去掉。

 

8、 切换回VHCS2的解压包主目录,编译VHCS2

    # make -f Makefile install

 

9、 拷贝编译好的文件进系统:

# cp -R /tmp/vhcs-2.4.8/* /

 

 

10、        切换进入VHCS2安装目录,安装VHCS2

# cd /var/www/vhcs2/engine/setup/

# ./vhcs2-setup

 

安装过程要求填写如下内容,请根据提示填写:
   
1Please enter system hostname (Enter for defaults) [server]: –>回车
   
2Please enter system network address (Enter for defaults) [192.168.0.100]: –>直接回车
   
3Please enter SQL server host (Enter for defaults) [localhost]: –>直接回车
   
4Please enter system SQL database (Enter for defaults) [vhcs2]: –>直接回车
   
5Please enter system SQL user (Enter for defaults) [root]: –>直接回车
   
6Please enter system SQL password (Enter for defaults) [none]: –>输入MySQLroot用户的密码
   
7Please repeat system SQL password: –>重复输入密码,进行确认
   
8Please enter VHCS ftp SQL user (Enter for defaults) [vftp]: –>FTP的数据库连接用户,保持默认直接回车
   
9Please enter VHCS ftp SQL user password (Enter for defaults) [none]:输入FTP的数据库连接密码
   
10Please repeat VHCS ftp SQL user password: –>重复输入FTP的数据库连接密码
   
11Please enter administration login name (Enter for defaults) [admin]: –>输入VHCS管理员的用户名
   
12Please enter administrator password: –>输入VHCS管理员的密码
   
13Please repeat administrator password: –>重复输入VHCS管理员的密码,进行确认
   
14Please enter administrator email address: –>输入管理员的电子邮件地址
     
然后开始正式安装了,耐心等候,等待安装结束。

 

11、        修改proftpd的配置:

A编辑/etc/proftpd/proftpd.conf

# vim /etc/proftpd/proftpd.conf

 

1>   “#include /etc/proftpd/modules.conf”,将其前面的“#”去掉

2>   修改“DisplayfirstChdir               .message”“DisplayChdir       .message”

如下

[......]
include /etc/proftpd/modules.conf
[......]
DisplayChdir .message
[......]

 

B编辑/etc/proftpd/modules.conf,去掉“#LoadModule mod_sql.c”“#LoadModule mod_sql_mysql.c”前面的注释,如下

[......]
LoadModule mod_sql.c
[......]
LoadModule mod_sql_mysql.c
[......]

 

启动proftpd

# /etc/init.d/proftpd start

 

重启服务器,然后从http://yourip/vhcs2使用管理员和密码登录。

安装完成!

 

12、        安装完成后,不要忘了如下几个步骤

A#apt-get install php5-curl   // 安装php5-curl

Bvim /etc/php5/apache2/php.ini

   display_errors = On display_errors = Off

C、安装重写命令以及ssl相关

#cp /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enable/

#cp /etc/apache2/mods-available/ssl.* /etc/apache2/mods-enable/

rewrite.load/ssl.*文件由mods-available复制至mods-enable

curl开启PHP多线程操作

Leave a Comment2010.11.13 11:09 by admin 

上一篇curl模拟浏览器使用代理获取网页内容里面介绍了使用curl进行网页内容的获取,但有时我们需要同时访问多个地址,如果用curl一个地址一个地址的来访问,速度上还是有点慢,如何一次性访问多个地址来节省时间了?

PHP CURL为我们提供了Multi的操作来开启多个curl操作,在PHP手册中搜索“curl_multi”,可以看到下图所有的函数,利用这些函数就可以实现PHP的多线程操作。

附上源文件:

        /** begin http request
        * @param proxy       true or false
        * @return text(array)
        */
        function HttpRequest($proxy = false) {
            if(!is_array($this->urls) or count($this->urls) == 0){
                return false;
            }
            $curl = $text = array();
            $handle = curl_multi_init();
            foreach($this->urls as $k=>$v){
                $curl[$k] = $this->addHandle($handle, $v, $proxy);
            }
            $this->execHandle($handle);
            foreach($this->urls as $k=>$v){
                curl_multi_getcontent($curl[$k]);
                //echo $curl[$k]."\n";
                $text[$k] = array(
                    'request_id'=>$curl[$k],
                    'content'=>curl_multi_getcontent($curl[$k])
                );
                //echo htmlspecialchars($text[$k])."\n\n<br /><br />";
                curl_multi_remove_handle($handle, $curl[$k]);
            }
            curl_multi_close($handle);
            return $text;
        }


        /** add curl handle
        * @param handle
        * @param url       want to visit url
        * @param proxy     true or false
        * @return curl
        */
        private function addHandle($handle, $url, $proxy) {
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_HEADER, $this->curlopt_header);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            if($proxy && !empty($this->proxy)) {
                curl_setopt($curl, CURLOPT_PROXY, $this->proxy['host'].':'.$this->proxy['port']);
                if(strtolower($this->proxy['type'])=='socks5') {
                    curl_setopt($curl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
                }
                if(!empty($this->proxy['username']) && !empty($this->proxy['userpass'])) {
                    curl_setopt($curl, CURLOPT_PROXYUSERPWD, $this->proxy['username'].':'.$this->proxy['userpass']);
                }
            }
            curl_setopt($curl, CURLOPT_TIMEOUT, $this->timeout);
            curl_multi_add_handle($handle, $curl);
            return $curl;
        }

源文件下载地址:MultiHttpRequest.class.php

这几天在做工具,需要从一个站获取数据,然后对得到的数据再进行处理;访问网站获取网站的内容,大家可能想到的是PHP的file_get_contents()函数,因为这个函数相对简单,但我要说的是,虽然file_get_contents()函数使用起来比较简单,但在实在应用中,对于获取网络上的内容并不是很实用,原因在于:1、file_get_contents对于某些动态的URL不能很好的解析;2、对于网速慢的时候可能会获取不到值。

这里我推荐使用curl实现获取网站内容的功能,curl相对于file_get_contens也有一定的优势,1、curl可以动态设定超时的时间;2、curl本来就是用于模拟数据提交的,对于数据的组合较好,且能够很好的解析需要访问的URL;3、使用curl时,还可以在其中加入代理(http)或(socks5);4、curl可以模拟浏览器;

基于上述的优势,我也选择了curl方式,下面我就来谈谈如何使用curl来模拟浏览器及如何使用代理:

通过查看PHP手册,我们可以找到curl的相关资料,CURLOPT_USERAGENT    The contents of the “User-Agent: “ header to be used in a HTTP request, 这个就是用来模拟我们的浏览器的选项


curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; InfoPath.1; CIBA)");

CURLOPT_PROXY   The HTTP proxy to tunnel requests through.  这个就是用来设置代理的选项

上面讲述了代理设置选项,那默认情况下是http的代理,现在网络上的http代理并不是很多,当然我们需要使用socks代理的时候怎么办呢?

当然PHP curl为我们提供了使用socks代理的方法,不过curl只支持socks5的代理,socks4的代理不能使用;

CURLOPT_PROXYTYPE  设置代理类型,默认为http

我想到这里大家又会遇到一个问题,那就是现在网络上的免费代理并不是很多了,虽然每次搜索的时候都会得到一大批的代理,不过里面能用的就没几个,假如我们从ISP那里购买的代理,又该如何使用呢?我的答案是还是这样使用,只是在curl再加入用户名和密码而已。

CURLOPT_PROXYUSERPWD   设置代理服务器的用户名和密码

同样这里附上curl部分代码:

    /** Get Web source-code from Designated URL
    * @param http_url       string
    * @param proxy          array('type','host','port','username','userpass','timeout')
    * @param result         array('header','nobody','follow','f_charset','t_charset')
    * @param cookie         string
    * @return string        string
    * @exception Exception  none
    */
    function get_url_contents($http_url,$proxy=NULL,$result=false,$cookie=NULL) {
        if(empty($http_url)) {
            return '';
        }
        if(empty($proxy['timeout'])) {
            $proxy['timeout']=30;
        }
        if(!empty($result['header'])) {
            $result['header']=false;
        }
        if(!empty($result['nobody'])) {
            $result['nobody']=false;
        }
        $ch = curl_init();            // 初始化curl
        if(!empty($proxy['host']) && !empty($proxy['port'])) {
            curl_setopt($ch, CURLOPT_PROXY, $proxy['host'].':'.$proxy['port']);//  设置代理服务器IP和站端口
        }
        if(!empty($proxy['type']) && $proxy['type']=='socks5') {
            curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);    //   设置代理代理为socks5,默认为http,即不需要设置
        }
        if(!empty($proxy['username']) && !empty($proxy['userpass'])) {
            curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxy['username'].':'.$proxy['userpass']);//   设置代理的用户名和密码
        }
        curl_setopt($ch, CURLOPT_URL, $http_url);//  添加需要访问的URL地址
        if(!empty($cookie)) {
            curl_setopt ( $ch, CURLOPT_COOKIEJAR, $cookie );    //  设置cookie
            curl_setopt ( $ch, CURLOPT_COOKIE, $cookie );    //
  设置cookie
        }
        curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );   //  设置返回类型,
        if($result['follow']) {
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true ); // 自动获取,防止中间有301的跳转
        }
        curl_setopt ( $ch, CURLOPT_HEADER, $result['header'] );//  设置是否需要返回头部信息
        curl_setopt ( $ch, CURLOPT_NOBODY, $result['nobody'] );//  设置是否不需要内容
        $contents = curl_exec($ch);//grab URL and pass it to the browser
        if(!empty($result['f_charset']) && !empty($result['t_charset']) && $result['f_charset']!=$result['t_charset']) {
            $contents=iconv($result['f_charset'],$result['t_charset'],$contents);
        }
        //echo curl_error ($ch);
        curl_close($ch);            //   关闭curl资源
        return $contents;
    }

 

上一篇说了利用yahoo inlink api来开发适合自己的yahoo 反向链接查询工具,但我们直接在Yahoo首页使用link:www.beingexperts.com查询反向链接的时候,还可以看到Yahoo收录的Pages,其实Yahoo Pages也为我们提供了API接口(Yahoo PageData)。Yahoo Pages API同样限止为一个IP,每天可以有5000次的访问)。

API获取地址:http://search.yahooapis.com/SiteExplorerService/V1/pageData

URL参数:

Parameter Value Description
appid string (required) API编号
query string (required) 需要查询的域名或URL路径. 注意: 域名或URL必须带上“http://”
results integer: default 50, max 100 需要返回的记录数,默认为50条记录,最大值为100
start integer: default 1 记录开始的位置,默认值为1,结束位置为 (start + results – 1) ,但不超过1000
domain_only no value (default), or 1 是否需要提供所有的子域名;如:查询http://www.beingexperts.com站点时,是否显示http://test.beingexperts.com等子域名的记录,或者是明确的域名。这个参数要求query参数后面是一个完整的URL(如:http://www.beingexperts.com/),否则这个将无效。
output string: xml (default), json, php 结果返回值,默认以xml格式返回,但也可以以JSON形式或PHP数组序列化后的形式返回
callback string 回调函数,用于执行取得数据之后的操作,可以没有

典型的例子如:http://search.yahooapis.com/SiteExplorerService/V1/pageData?appid=Vsd5u2LV34FbuuNJtkSaI_ICFDVwMPO3k2ROxe5JPU8AW.jD6BYVH22_PxmLtyfP_Q–&query=http://www.beingexperts.com&start=1&results=100

Yahoo返回值:

参数 描述
ResultSet

包含了以后下几个查询返回值:

  • totalResultsAvailable: 查询的站点URL在Yahoo数据库中的记录数。
  • totalResultsReturned: 返回的记录条数,这个值可能小于查询URL参数results的值(total Results Available的数量可能会小于查询的记录数(results)
  • firstResultPosition: 返回记录开始的位置
Result 每个记录的组合
Title 页面的标题
Url 页面的URL
ClickUrl 链接页面的URL

在获取到数据后,可以使用PHP Dom来操作得到的xml数据来达到自己需要实现的功能。

附上源文件,


<?php
$http_url="http://search.yahooapis.com/SiteExplorerService/V1/pageData?appid=Vsd5u2LV34FbuuNJtkSaI_ICFDVwMPO3k2ROxe5JPU8AW.jD6BYVH22_PxmLtyfP_Q--&query=http://www.beingexperts.com&start=1&results=100";
$dom = new DomDocument("1.0");
$dom->load($http_url);
$res=xml_to_result($dom);
function xml_to_result($dom) {
$root = $dom->firstChild;
foreach($root->attributes as $attr) {
$res[$attr->name] = $attr->value;
}
$node = $root->firstChild;
$i=0;
while($node) {
switch($node->nodeName) {
case 'Result':
$subnode = $node->firstChild;
while($subnode) {
if($subnode->hasChildNodes()) {
foreach($subnode->childNodes as $cn)
$res[$i][$subnode->nodeName]=trim($cn->nodeValue);
}
$subnode = $subnode->nextSibling;
}
break;
default:
$i--;
break;
}
$i++;
$node = $node->nextSibling;
}
return $res;
?>

对于SEO来源,关注一个或一群网站的反向链接的变化情况,有利于掌握对手或自己的站点的推广程度、优化程度等。但我们都知道在Google的反向链接数据需要通过加入google webmaster tools之后,才能看到相对完整的网站外链,而通过在搜索框中输入link:www.beingexperts.com命令看到的网站反向链接是少之又少;于是大家也都转到Yahoo,利用Yahoo Site Explorer,但是在中国的IP查询Yahoo外链的时候,经常出现的一个问题就是访问不到数据,yahoo 返回999页面,提示获取失败。

当然对于这个问题,有人采用代理(爬墙)方式来访问Yahoo,在这里这种方式我不想细说;

下面就我个人的经验来说,Yahoo提供一个很好的方式,利用Yahoo Inlinks API接口去获取数据,而且几乎是没有限止的获取数据哦(因为Yahoo的限止是每个IP,每天可以有5000次的访问)。我们只需要写一个系统,就可以在Yahoo里面获取我们想要查询的站点的外链情况,另外还可以根据我们的需要进行更深层次的功能开发,如将查询结果保存到我们自己的数据库、积累资源等都是很好的选择。

API获取地址:http://search.yahooapis.com/SiteExplorerService/V1/inlinkData

URL参数:

Parameter Value Description
appid string (required) API编号
query string (required) 需要查询的域名或URL路径. 注意: 域名或URL必须带上“http://”
results integer: default 50, max 100 需要返回的记录数,默认为50条记录,最大值为100
start integer: default 1 记录开始的位置,默认值为1,结束位置为 (start + results – 1) ,但不超过1000
entire_site no value (default), or 1 选择是查询整站还是单独某个URL;分别对应siteexplorer中{Only this URL、Entire Site}
omit_inlinks none (default), domain, or subdomain 选择结果的来源,默认为none,也可以是domain或subdomain;分别对应siteexplorer中{From All Pages、Except from this domain、Except from this subdomain}
output string: xml (default), json, php 结果返回值,默认以xml格式返回,但也可以以JSON形式或PHP数组序列化后的形式返回
callback string 回调函数,用于执行取得数据之后的操作,可以没有

典型的例子如:http://search.yahooapis.com/SiteExplorerService/V1/inlinkData?appid=Vsd5u2LV34FbuuNJtkSaI_ICFDVwMPO3k2ROxe5JPU8AW.jD6BYVH22_PxmLtyfP_Q–&query=http://www.beingexperts.com&start=1&results=100

在获取到数据后,可以使用PHP Dom来操作得到的xml数据来达到自己需要实现的功能。

附上源文件,


<?php
$http_url="http://search.yahooapis.com/SiteExplorerService/V1/inlinkData?appid=Vsd5u2LV34FbuuNJtkSaI_ICFDVwMPO3k2ROxe5JPU8AW.jD6BYVH22_PxmLtyfP_Q--&query=http://www.beingexperts.com&start=1&results=100";
$dom = new DomDocument("1.0");
$dom->load($http_url);
$res=xml_to_result($dom);
function xml_to_result($dom) {
$root = $dom->firstChild;
foreach($root->attributes as $attr) {
$res[$attr->name] = $attr->value;
}
$node = $root->firstChild;
$i=0;
while($node) {
switch($node->nodeName) {
case 'Result':
$subnode = $node->firstChild;
while($subnode) {
if($subnode->hasChildNodes()) {
foreach($subnode->childNodes as $cn)
$res[$i][$subnode->nodeName]=trim($cn->nodeValue);
}
$subnode = $subnode->nextSibling;
}
break;
default:
$i--;
break;
}
$i++;
$node = $node->nextSibling;
}
return $res;
}
?>

利用xmlrpc上传图片(PHP篇)

1 Comment2010.10.26 14:26 by admin 

前篇文章中提到了wordpress xmlrpc 支持图片文件的上传,那如何来上传图片呢?

首先上传图片用到的是xmlrpc的metaWeblognewMediaObject方法metaWeblog.newMediaObject (blogid, username, password, struct),blogid, username 和 password 和Blogger API 的参数一样。
1、blogid  博客的编号
2、username  博客登录用户名
3、password  博客登录密码
4、struct  结构体,该结构体必须包含三个元素,名称(name)、类型(type)和内容(bits)。

  • name   上传文件的名称(类型为字符串),决定了文件上传到服务器的文件名。
  • type     上传文件的内类(类型为字符串),决定了文件在服务器上文件类型,是最基本的MIME类型,如:audio/mpeg、image/jpeg或者video/quicktime等。
  • bits      上传文件的内容,它是一个经过64位编码的二进制字符串,这里需要注意的是,它是由自己的编辑规则进行的,不能单纯的在PHP中使用base64_encode进行编码。

newMediaObject函数如果上传失败,会抛出一个错误信息,如果上传成功,则会返回一个结构体,在这个结构中至少有一个文件存储的URL地址,并且这个地址一定可以通过FTP或HTTP协议进行访问的。
例:
$filesrc=”../text.jpg”;
$name = “text.jpg”;
$type = mime_content_type($filesrc); //获取文件类型,php.ini需要启用pecl模块
$bits = new xmlrpcval(file_get_contents($filesrc),”base64″);
$data = array(
        ‘name’ => $name,
        ‘type’ => $type,
        ‘bits’ => $bits
);
 $x = new xmlrpcmsg(“metaWeblog.newMediaObject”,
                array(
                    php_xmlrpc_encode(“1″),
                    php_xmlrpc_encode($username),
                    php_xmlrpc_encode($userpass),
                    php_xmlrpc_encode($data),
                    php_xmlrpc_encode(“1″)
                )
);
$c->return_type = ‘phpvals’;
$r =$c->send($x);

Live Chat Software