日志分类:Develop

apache下多站点的架设

2009年01月15日 11:05 上午  |  分类:Develop

这里是指同一IP绑定N个域名,有二种方式实现
方法1、仅修改httpd.conf
假设二个域名bbs.xxx.com与blog.xxx.com
打开httpd.conf
将文件拖到最下面,加上

<VirtualHost *:80>
ServerName bbs.xxx.com #域名
DocumentRoot “F:/website/bbs” #该域名对应的目录地址
<Directory “F:/website/bbs”> #该节点是配置权限、默认首页啊等等东东。
Options FollowSymLinks IncludesNOEXEC Indexes
DirectoryIndex index.php
AllowOverride None
Order Deny,Allow
Allow from all
</Directory>
</VirtualHost>

<VirtualHost *:80>
ServerName blog.xxx.com
DocumentRoot “D:/PHPSite/wordpress”
<Directory “D:/PHPSite/wordpress”>
Options FollowSymLinks IncludesNOEXEC Indexes
DirectoryIndex index.php
AllowOverride None
Order Deny,Allow
Allow from all
</Directory>
</VirtualHost>

重启apache,就OK啦。当然你要修改你的hosts文件。

方法2、修改PhpServerApache2.2confextrahttpd-vhosts.conf
直接将上面一段copy到httpd-vhosts.conf的最后即可。
实际上看名字就知道httpd-vhosts.conf是一个虚拟站点配置集中地,方便管理。
也就是如下:

#
# Virtual Hosts
#
# If you want to maintain multiple domains/hostnames on your
# machine you can setup VirtualHost containers for them. Most configurations
# use only name-based virtual hosts so the server doesn’t need to worry about
# IP addresses. This is indicated by the asterisks in the directives below.
#
# Please see the documentation at
# <URL:http://httpd.apache.org/docs/2.2/vhosts/>
# for further details before you try to setup virtual hosts.
#
# You may use the command line option ‘-S’ to verify your virtual host
# configuration.

#
# Use name-based virtual hosting.
#
NameVirtualHost *:80

#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for all requests that do not
# match a ServerName or ServerAlias in any <VirtualHost> block.
#

<VirtualHost *:80>
ServerName bbs.xxx.com #域名
DocumentRoot “F:/website/bbs” #该域名对应的目录地址
<Directory “F:/website/bbs”> #该节点是配置权限、默认首页啊等等东东。
Options FollowSymLinks IncludesNOEXEC Indexes
DirectoryIndex index.php
AllowOverride None
Order Deny,Allow
Allow from all
</Directory>
</VirtualHost>

<VirtualHost *:80>
ServerName blog.xxx.com
DocumentRoot “D:/PHPSite/wordpress”
<Directory “D:/PHPSite/wordpress”>
Options FollowSymLinks IncludesNOEXEC Indexes
DirectoryIndex index.php
AllowOverride None
Order Deny,Allow
Allow from all
</Directory>
</VirtualHost>

重启apache。
如果不行的话,看你的httpd.conf是否启用了vhost
打开httpd.conf,找到
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
看是否启用,即去掉Include conf/extra/httpd-vhosts.conf前的#
重启apache,爽去吧。

php调用webservice(续)

2009年01月5日 9:31 上午  |  分类:Develop

在上一文中提到了如何调用一个webservice并获取其返回值。
http://www.yibin001.com/Archives/soapclient.aspx
昨天在调用服务器端为asp.net的webservice时遇到一些问题,在这里提出来,希望能给遇到同样问题的朋友们一点帮助。
具体表现为:
客户端用SoapClient发起一个请求,正常地传递参数,而webservice却无法正确获取参数值,每个值均为null!
通常在传递参数时我们是这样完成的:

$client = new SoapClient(‘http://xxxxxxxxxxx.asmx?wsdl’);
$res = $client->__Call(‘getWeatherbyCityName’,array(‘参数1′=>‘值’,’参数2′=>‘值’));

但调用对于用.net编写的ws,上面的代码有点无能为力了,参数传递失败。
昨天遇到这个问题时我头大了许久,后来才找到解决方案

If your service is a .NET doc/lit, which means the input message has a single part named ‘parameters’ that is a structure that wraps the parameters.
Your call should look like this:
<?php
$params = array(‘param_name_1′=>$val_1,’param_name_2′=>$val_2);
$client->call(‘MethodName’, array(‘parameters’ => $params));
?>

原文:http://cn.php.net/manual/en/function.soap-soapclient-soapcall.php
知道原因,也就好解决了。
回头看看下面的例子,也就相当容易了

<?php
header('Content-type:text/html;charset=utf-8');
require_once 'city.php';  //这里为城市与城市编码的缓存文件,也是从webxml上获取的。
if($_POST['submit']==='OK')
{
$client = new SoapClient('http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl');
$code = $_POST['city'];
$para = array('theCityName'=>$code);  //getWeatherbyCityName只需要一个参数,参数名theCityName
//每调用一个方法,都会有一个对应的返回结果,结果名称为:方法名+Result,如下面的getWeatherbyCityNameResult,该返回结果为object
$res = $client->__Call('getWeatherbyCityName',array('paramters'=>$para))->getWeatherbyCityNameResult->string;
echo "<pre>";
echo "城市:".$res[1];
echo "<br/>气温:".$res[5];
echo "<br/>天气:".$res[6];
echo "<br/>风力:".$res[7];
echo "</pre>";
}
?>
在线demo
http://demo.yibin001.com/weather/index.php

可惜我的服务器不支持SoapClient扩展,无法放demo。
soap.rar (4.91 kb)

另外发现一个提供巨多免费webservice的网站:
http://www.webxml.com.cn/zh_cn/web_services.aspx

php中的字符串处理函数

2009年01月3日 8:07 下午  |  分类:Develop

addcslashes —— 为字符串里面的部分字符添加反斜线转义字符
addslashes —— 用指定的方式对字符串里面的字符进行转义
bin2hex —— 将二进制数据转换成十六进制表示
chr —— 返回一个字符的ASCII码
chunk_split —— 按一定的字符长度将字符串分割成小块
convert_cyr_string —— 将斯拉夫语字符转换为别的字符
convert_uudecode —— 解密一个字符串
convert_uuencode —— 加密一个字符串
count_chars —— 返回一个字符串里面的字符使用信息
crc32 —— 计算一个字符串的crc32多项式
crypt —— 单向散列加密函数
explode —— 将一个字符串用分割符转变为一数组形式
fprintf —— 按照要求对数据进行返回,并直接写入文档流
get_html_translation_table —— 返回可以转换的HTML实体
html_entity_decode —— htmlentities ()函数的反函数,将HTML实体转换为字符
htmlentities —— 将字符串中一些字符转换为HTML实体
htmlspecialchars_decode —— htmlspecialchars()函数的反函数,将HTML实体转换为字符
htmlspecialchars —— 将字符串中一些字符转换为HTML实体
implode —— 将数组用特定的分割符转变为字符串
join —— 将数组转变为字符串,implode()函数的别名
levenshtein —— 计算两个词的差别大小
localeconv —— 获取数字相关的格式定义
ltrim —— 去除字符串左侧的空白或者指定的字符
md5_file —— 将一个文件进行MD5算法加密
md5 —— 将一个字符串进行MD5算法加密
metaphone —— 判断一个字符串的发音规则
money_format —— 按照参数对数字进行格式化的输出
nl_langinfo —— 查询语言和本地信息
nl2br —— 将字符串中的换行符“n”替换成“<br />”
number_format —— 按照参数对数字进行格式化的输出
ord —— 将一个ASCII码转换为一个字符
parse_str —— 把一定格式的字符串转变为变量和值
print —— 用以输出一个单独的值
printf —— 按照要求对数据进行显示
quoted_printable_decode —— 将一个字符串加密为一个8位的二进制字符串
quotemeta —— 对若干个特定字符进行转义
rtrim —— 去除字符串右侧的空白或者指定的字符
setlocale —— 设置关于数字,日期等等的本地格式
sha1_file —— 将一个文件进行SHA1算法加密
sha1 —— 将一个字符串进行SHA1算法加密
similar_text —— 比较两个字符串,返回系统认为的相似字符个数
soundex —— 判断一个字符串的发音规则
sprintf —— 按照要求对数据进行返回,但是不输出
sscanf —— 可以对字符串进行格式化
str_ireplace —— 像str_replace()函数一样匹配和替换字符串,但是不区分大小写
str_pad —— 对字符串进行两侧的补白
str_repeat —— 对字符串进行重复组合
str_replace —— 匹配和替换字符串
str_rot13 —— 将字符串进行ROT13加密处理
str_shuffle —— 对一个字符串里面的字符进行随机排序
str_split —— 将一个字符串按照字符间距分割为一个数组
str_word_count —— 获取字符串里面的英文单词信息
strcasecmp —— 对字符串进行大小比较,不区分大小写
strchr —— 通过比较返回一个字符串的部分strstr()函数的别名
strcmp —— 对字符串进行大小比较
strcoll – 根据本地设置对字符串进行大小比较
strcspn —— 返回字符连续非匹配长度的值
strip_tags —— 去除一个字符串里面的HTML和PHP代码
stripcslashes —— 反转义addcslashes()函数转义处理过的字符串
stripos —— 查找并返回首个匹配项的位置,匹配不区分大小写
stripslashes —— 反转义addslashes()函数转义处理过的字符串
stristr —— 通过比较返回一个字符串的部分,比较时不区分大小写
strlen —— 获取一个字符串的编码长度
strnatcasecmp —— 使用自然排序法对字符串进行大小比较,不区分大小写
strnatcmp —— 使用自然排序法对字符串进行大小比较
strncasecmp —— 对字符串的前N个字符进行大小比较,不区分大小写
strncmp —— 对字符串的前N个字符进行大小比较
strpbrk —— 通过比较返回一个字符串的部分
strpos —— 查找并返回首个匹配项的位置
strrchr —— 通过从后往前比较返回一个字符串的部分
strrev —— 将字符串里面的所有字母反向排列
strripos —— 从后往前查找并返回首个匹配项的位置,匹配不区分大小写
strrpos —— 从后往前查找并返回首个匹配项的位置
strspn —— 匹配并返回字符连续出现长度的值
strstr —— 通过比较返回一个字符串的部分
strtok —— 用指定的若干个字符来分割字符串
strtolower —— 将字符串转变为小写
strtoupper —— 将字符串转变为大写
strtr —— 对字符串比较替换
substr_compare —— 对字符串进行截取后的比较
substr_count —— 计算字符串中某字符段的出现次数
substr_replace —— 对字符串中的部分字符进行替换
substr —— 对字符串进行截取
trim —— 去除字符串两边的空白或者指定的字符
ucfirst —— 将所给字符串的第一个字母转换为大写
ucwords —— 将所给字符串的每一个英文单词的第一个字母变成大写
vfprintf —— 按照要求对数据进行返回,并直接写入文档流
vprintf —— 按照要求对数据进行显示
vsprintf —— 按照要求对数据进行返回,但是不输出
wordwrap —— 按照一定的字符长度分割字符串

简易rss阅读器[php版]

2009年01月1日 4:49 下午  |  分类:Develop

2009年的第一天,我在公司度过。
php对于xml和json的支持非常强大,下面要提到的阅读器就是基于simplexml与json来完成的。

整个过程采用异步加载:
jquery访问提供rss数据的接口文件,然后分析数据并返回结果。

demo :
http://www.yibin001.com/phpdemo/home.php

首先要了解simplexml类的相关方法,这里只需用到simplexml_load_file加载一个rss就行了。
简易rss类,该类用来加载一个rss

<?php
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
* Description of rssclass
*
* @author yibin
*/
class rss {
private $rssurl;
private $info = array();
private $items = array();

function RssUrl()
{
return $this->rssurl;
}
function GetItems()
{
return $this->items;
}

function GetRssInfo()
{
return $this->info;
}

function Load()
{
if(!empty($this->rssurl))
{
$channel = simplexml_load_file($this->rssurl);
$this->info['title'] = $channel->channel->title;
$this->info['link'] = $channel->channel->link;

foreach($channel->channel->item as $item)
{
$this->items[] = $item;
}
}
}
function __construct($rss='')
{
$this->rssurl = $rss;
}
}
?>

服务接口:

<?php
require "rss.cache.php";
$url = $_GET['url'];
$rss = new RssProvider();
$item = $rss->LoadRss($url);
echo json_encode($item);    //将数据转成json形式。
?>

前台的js将访问上面的服务接口。
js部分:

//url为rss地址
//obj为HTML容器ID。
function getContent(url,obj){
url = 'clib/rss.service.php?url='+url;
$.getJSON(url,function(json){
var info = json.info;
var items = json.items;
var s='<dl><dt><a href="'+info.link[0]+'" target="_blank">'+info.title[0]+'</a></dt>';
for(var i = 0;i<items.length;i++)
{
s+='<dd><em>'+(i+1)+'</em><a href="'+items[i].link+'" target="_blank">'+items[i].title+'</a></dd>';
}
s+='</dl>';
$('#'+obj).html(s);
});
}

html部分:

<div id="main">
<div class="news" id="news_1">
数据加载中......
</div>
<div class="news" id="news_2">
数据加载中......
</div>
<div class="news" id="news_3">
数据加载中......
</div>
<div class="news" id="news_4">
数据加载中......
</div>

</div>
<script>
getContent('<?php echo urlencode('http://news.google.cn/nwshp?tab=wn&ned=ccn&topic=e&output=rss')?>','news_1');
getContent('<?php echo urlencode('http://news.google.cn/nwshp?tab=wn&ned=ccn&topic=y&output=rss')?>','news_2');
getContent('<?php echo urlencode('http://feed.feedsky.com/yibin')?>','news_3');
getContent('<?php echo urlencode('http://www.iceapple.net/syndication.axd')?>','news_4');
</script>

搞定。
phpdemo.rar (32.61 kb)