测试

测试

Posted in 未分类 | Leave a comment

soap转载

1. 首先制作提供WebService的php页面。

//myservice.php
<?php
class service
{
public function HelloWorld()
{
return "Hello";
}
public function Add($a,$b)
{
return $a+$b;
}
}
//TestSoap.wsd需要在后面采用Zend Studio生成。
$server=new SoapServer('TestSoap.wsdl',array('soap_version' => SOAP_1_2));
$server->setClass("service");
$server->handle();
?>

2.生成WSDL文件。采用Zend Studio生成。
生成过程:选择菜单File-->Export-->PHP->WSDL FILE
也就是出现下面的图

选择 next ,出现如下WSDL选择画面

File Name:选择需要生成的WSDL文件存储文件名和路径
Exported file 选择学要前面写的myservice.php文件,可以添加多个。
Classes:选择需要制作WebService的文件,注意:URL:一定要写上myservice.php的 URL.如果提供服务的是其他php页面,那就换成其他的php服务页面。
Global Settings:如下图所示:

选择Finish,生成WSDL文件,下面是Zend Studio里的效果图

3.客户端调用该Web Service

//Client.php
<?php
$a=new SoapClient("TestSoap.wsdl");
echo $a->HelloWorld();
echo("<br />");
echo $a->Add(1,2);
?>

到此为止,一个简单的Php WebService制作完成。
扩展:如何用WebService实现数据库的GRUD操作,后续发布。

补充:
TestSoap.wsdl文件到底是什么

<?xml version='1.0' encoding='UTF-8'?>

<!-- WSDL file generated by Zend Studio. -->

<definitions name="TestSoap" targetNamespace="urn:TestSoap" xmlns:typens="urn:TestSoap" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/">
<message name="Add">
<part name="a"/>
<part name="b"/>
</message>
<message name="AddResponse">
<part name="AddReturn"/>
</message>
<message name="HelloWorld"/>
<message name="HelloWorldResponse">
<part name="HelloWorldReturn"/>
</message>
<message name="Sub">
<part name="a"/>
</message>
<message name="SubResponse">
<part name="SubReturn"/>
</message>
<portType name="servicePortType">
<operation name="Add">
<input message="typens:Add"/>
<output message="typens:AddResponse"/>
</operation>
<operation name="HelloWorld">
<input message="typens:HelloWorld"/>
<output message="typens:HelloWorldResponse"/>
</operation>
<operation name="Sub">
<input message="typens:Sub"/>
<output message="typens:SubResponse"/>
</operation>
</portType>
<binding name="serviceBinding" type="typens:servicePortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="Add">
<soap:operation soapAction="urn:serviceAction"/>
<input>
<soap:body namespace="urn:TestSoap" use="literal"/>
</input>
<output>
<soap:body namespace="urn:TestSoap" use="literal"/>
</output>
</operation>
<operation name="HelloWorld">
<soap:operation soapAction="urn:serviceAction"/>
<input>
<soap:body namespace="urn:TestSoap" use="literal"/>
</input>
<output>
<soap:body namespace="urn:TestSoap" use="literal"/>
</output>
</operation>
<operation name="Sub">
<soap:operation soapAction="urn:serviceAction"/>
<input>
<soap:body namespace="urn:TestSoap" use="literal"/>
</input>
<output>
<soap:body namespace="urn:TestSoap" use="literal"/>
</output>
</operation>
</binding>
<service name="TestSoapService">
<port name="servicePort" binding="typens:serviceBinding">
<soap:address location="http://localhost/test/soap/myservice.php"/>
</port>
</service>
</definitions>

但是我发觉他和.net 产生的WSDL不一样。而且通过这种方式有一个弊端,如果我的Service里添加了一个新的方法,需要在重新生成WSDL文件,
而且还经常出错误。但是如果采用Zend WSDL编辑器产生的WSDL感觉更标准写,而且他相对于目前这样的方法不需要删除WSDL重新建,只需要编辑目前已有的。

Posted in 未分类 | Leave a comment

phpunit的使用

1、使用pear安装
2、去phpunit.de下载

3、解压找到pear-phpunit.bat,将其改名为phpunit。
4、对其进行编辑,将phpbin换成php解析器的路径,将phpdir换成phpunit的目录路径。

5、可以配合NetBeans使用。

Posted in 未分类 | Leave a comment

获取上一周信息

方法一:

$iLastWeek = strtotime("-1 week");
$aLastWeek = getdate($iLastWeek);

if ($aLastWeek['wday'] == 0) {
$iWeekOfFirstday = $aLastWeek['mday'] - 7 + 1;
}else{
$iWeekOfFirstday = $aLastWeek['mday'] - $aLastWeek['wday'] + 1;
}

$iWeekOfLastday = $iWeekOfFirstday + 7 - 1;
$iLastWeekOfFirstday = mktime(0,0,0, $aLastWeek['mon'], $iWeekOfFirstday, $aLastWeek['year']);
$iLastWeekOfLastday = mktime(0,0,0, $aLastWeek['mon'], $iWeekOfLastday, $aLastWeek['year']);

var_dump($iLastWeekOfFirstday, $iLastWeekOfLastday);
var_dump(date('Y:m:d', $iLastWeekOfFirstday), date('Y:m:d', $iLastWeekOfLastday));

方法二:

//获取上一周某一天的时间戳
$iLastWeek = strtotime("-1 week");
$aLastWeek = getdate($iLastWeek);

//确定上一周的第一天和最后一天的时间戳
if ($aLastWeek['wday'] == 0) {
$iWeekOfFirstday = strtotime('-6 day', $iLastWeek);
}else{
$day = 1 - $aLastWeek['wday'];
$iWeekOfFirstday = strtotime("$day day", $iLastWeek);
}
$iWeekOfLastday = strtotime('+6 day', $iWeekOfFirstday);

//获取上一周是一年中的第几周
$iWeekOfYear = date('W', $iLastWeek);

Posted in 未分类 | Leave a comment

php中的curl(转载)

原文地址:http://www.xqs.cn/index.php?load=read&id=256

摘要:

在这篇文章中主要讲解php_curl库的知识,并教你如何更好的使用php_curl。

简介

你可能在你的编写PHP脚本代码中会遇到这样的问题:怎么样才能从其他站点获取内容呢?这里有几个解决方式;最简单的就是在php中使用fopen()函数,但是fopen函数没有足够的参数来使用,比如当你想构建一个“网络爬虫”,想定义爬虫的客户端描述(IE,firefox),通过不同的请求方式来获取内容,比如POST,GET;等等这些需求是不可能用fopen()函数实现的。

为了解决我们上面提出的问题,我们可以使用PHP的扩展库-Curl,这个扩展库通常是默认在安装包中的,你可以它来获取其他站点的内容,也可以来干别的。

备注:这两段代码需要php_curl扩展库的支持,查看phpinfo(),如果curl support  enabled则表示支持curl库。
1、Windows下的PHP开启curl库支持:
打开php.ini,将extension=php_curl.dll前的;号去掉。

2、Linux下的PHP开启curl库支持:
编译PHP时在./configure后加上 –with-curl

在这篇文章中,我们一起来看看如何使用curl库,并看看它的其他用处,但是接下来,我们要从最基本的用法开始

基本用法:

第一步,我们通过函数curl_init()创建一个新的curl会话,代码如下:

<?php
// create a new curl resource
$ch = curl_init();
?>

我们已经成功创建了一个curl会话,如果需要获取一个URL的内容,那么接下的一步,传递一个URL给curl_setopt()函数,代码:

<?php
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, “http://www.google.com/”);
?>

做完上一步工作,curl的准备工作做完了,curl将会获取URL站点的内容,并打印出来。代码:

<?php
// grab URL and pass it to the browser
curl_exec($ch);
?>

最后,关闭当前的curl会话

<?php
//close curl resource, and free up system resources
curl_close($ch);
?>

下面我们来看看完成的实例代码:

<?php

// create a new curl resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, “http://www.google.nl/”);
// grab URL and pass it to the browser
curl_exec($ch);
// close curl resource, and free up system resources
curl_close($ch);
?>

(查看在线demo)
我们刚刚把另外一个站点的内容,获取过来以后自动输出到浏览器,我们有没有其他的方式组织获取的信息,然后控制其输出的内容呢?完全没有问题,在curl_setopt()函数的参数中,如果希望获得内容但不输出,使用CURLOPT_RETURNTRANSFER参数,并设为非0值/true!,完整代码请看:

<?php

// create a new curl resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, “http://www.google.nl/”);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// grab URL, and return output
$output = curl_exec($ch);
// close curl resource, and free up system resources
curl_close($ch);
// Replace ‘Google’ with ‘PHPit’
$output = str_replace(’Google’, ‘PHPit’, $output);
// Print output
echo $output;
?>

(查看在线demo)

在上面的2个实例中,你可能注意到通过设置函数curl_setopt()的不同参数,可以获得不同结果,这正是curl强大的原因,下面我们来看看这些参数的含义。

CURL的相关选项:

如果你看过php手册中的curl_setopt()函数,你可以注意到了,它下面长长的参数列表,我们不可能一一介绍,更多的内容请查看PHP手册,这里只介绍常用的和有的一些参数。

第一个很有意思的参数是 CURLOPT_FOLLOWLOCATION ,当你把这个参数设置为true时,curl会根据任何重定向命令更深层次的获取转向路径,举个例子:当你尝试获取一个PHP的页面,然后这个PHP的页面中有一段跳转代码 <?php header(”Location:http://new_url”);….?>,curl将从http://new_url获取内容,而不是返回跳转代码。完整的代码如下:

<?php

// create a new curl resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, “http://www.google.com/”);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// grab URL, and print
curl_exec($ch);
?>

(查看在线demo),
如果Google发送一个转向请求,上面的例子将根据跳转的网址继续获取内容,和这个参数有关的两个选项是CURLOPT_MAXREDIRSCURLOPT_AUTOREFERER .
参数CURLOPT_MAXREDIRS选项允许你定义跳转请求的最大次数,超过了这个次数将不再获取其内容。如果CURLOPT_AUTOREFERER 设置为true时,curl会自动添加Referer header在每一个跳转链接,可能它不是很重要,但是在一定的案例中却非常的有用。

下一步介绍的参数是CURLOPT_POST,这是一个非常有用的功能,因为它可以让您这样做POST请求,而不是GET请求,这实际上意味着你可以提交
其他形式的页面,无须其实在表单中填入。下面的例子表明我的意思:

<?php
// create a new curl resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL,”http://projects/phpit/content/using%20curl%20php/demos/handle_form.php”);
// Do a POST
$data = array(’name’ => ‘Dennis’, ’surname’ => ‘Pallett’);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
// grab URL, and print
curl_exec($ch);
?>

(View Live Demo)
And the handle_form.php file:

<?php
echo ‘<h3>Form variables I received: </h3>’;
echo ‘<pre>’;
print_r ($_POST);
echo ‘</pre>’;
?>

正如你可以看到,这使得它真的很容易提交形式,这是一个伟大的方式来测试您的所有形式,而不以填补他们在所有的时间。
参数CURLOPT_CONNECTTIMEOUT 通常用来设置curl尝试请求链接的时间,这是一个非常重要的选项,如果你把这段时间设置的太短了,可能会导致curl请求失败。
但是如果你把它设置的时间太长了,可能PHP脚本将死掉。和这个参数相关的一个选项是 CURLOPT_TIMEOUT,这是用来设置curl允许执行的时间需求。如果您设置这一个很小的值,它可能会导下载的网页上是不完整的,因为他们需要一段时间才能下载。
最后一个选项是 CURLOPT_USERAGENT,它允许你自定义请求是的客户端名称,比如webspilder或是IE6.0.示例代码如下:

<?php
// create a new curl resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, “http://www.useragent.org/”);
curl_setopt($ch, CURLOPT_USERAGENT, ‘My custom web spider/0.1′);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// grab URL, and print
curl_exec($ch);
?>

(View Live Demo)

现在我们把最有意思的一个参数都介绍过了,下面我们来介绍一个curl_getinfo() 函数,看看它能为我们做些什么。

获取页面的信息:

函数curl_getinfo()可以使得我们获取接受页面各种信息,你能编辑这些信息通过设定选项的第二个参数,你也可以传递一个数组的形式。就像下面的例子:

<?php
// create a new curl resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, “http://www.google.com”);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FILETIME, true);
// grab URL
$output = curl_exec($ch);
// Print info
echo ‘<pre>’;
print_r (curl_getinfo($ch));
echo ‘</pre>’;
?>

(View Live Demo)

大部分返回的信息是请求本身的,像:这个请求花的时间,返回的头文件信息,当然也有一些页面的信息,像页面内容的大小,最后修改的时间。

那些全是关于curl_getinfo()函数的,现在让我们看看它的实际用途。

实际用途:

curl库的第一用途可以查看一个URL页面是否存在,我们可以通过查看这个URL的请求返回的代码来判断比如404代表这个页面不存在,我们来看一些例子:

<?php
// create a new curl resource
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, “http://www.google.com/does/not/exist”);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// grab URL
$output = curl_exec($ch);
// Get response code
$response_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// Not found?
if ($response_code == ‘404′) {
echo ‘Page doesn\’t exist’;
} else {
echo $output;
}
?>

(View Live Demo)

其他的用户可能是创建一个自动检查器,验证每个请求的页面是否存在。
我们可以用curl库来写和google类似的网页蜘蛛(web spider),或是其他的网页蜘蛛。这篇文章不是关于如何写一个网页蜘蛛的,因此所以我们没有讲任何关于网页蜘蛛的细节问题,但是以后在PHPit 将会介绍用 curl来构造一个web spider.

结论:

在这篇文章我已经表明,如何使用php中的curl库和其大部分的选项。

为最基本的任务,只想获得一个网页,你可能不会需要CURL库,但是,一旦你想要做任何事情稍微先进的,您可能会想要使用curl库。

在近未来,我会告诉您究竟如何建立自己的网络蜘蛛,类似Google的网络蜘蛛,敬请期待,

Posted in 未分类 | Leave a comment

php中的static关键字

一、PHP static静态变量

变量范围的另一个重要特性是静态变量(static variable)。静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失。看看下面的例子:

例子 演示需要静态变量的例子

<?PHP
   function Test()
   {
   $w3sky = 0;
   echo $w3sky;
   $w3sky++;
   }
   ?>

本函数没什么用处,因为每次调用时都会将 $w3sky 的值设为 0 并输出 "0"。将变量加一的 $w3sky++ 没有作用,因为一旦退出本函数则变量 $w3sky 就不存在了。要写一个不会丢失本次计数值的计数函数,要将变量 $w3sky 定义为静态的:

例子 使用静态变量的例子

<?PHP
   function Test()
   {
   static $w3sky = 0;
   echo $w3sky;
   $w3sky++;
   }
   ?>
现在,每次调用 Test() 函数都会输出 $w3sky 的值并加一。

注: 静态变量可以按照上面的例子声明。如果在声明中用表达式的结果对其赋值会导致解析错误。例如:
static $int = 1+2;   // wrong (as it is an expression)

二、类中的static,以及与const的区别

(1) static
static关键字在类中是,描述一个成员是静态的,static能够限制外部的访问,因为static后的成员是属于类的,是不属于任何对象实例,其他类是无法访问的,只对类的实例共享,能一定程序对该成员尽心保护。类的静态变量,非常类似全局变量,能够被所有类的实例共享,类的静态方法也是一样的,类似于全局函数。类的静态方法能访问类的静态的属性。另外说明的是,static的成员,必须使用self来访问,使用this会出错。
(关于this和self的异同,请参考: http://blog.csdn.net/heiyeshuwu/archive/2004/11/03/165828.aspx )

(2)const
const是一个定义常量的关键字,类似于C中的#define,能够定义一个常量,如果在程序中改变了它的值,那么会出现错误。

(3)定义他们时都不能使用表达式,否则解析出错。

 

举例说明上面的代码:(注:以下代码来自phpe.net)

<?php

class Counter
{
private static $count = 0;//定义一个静态属性
const VERSION = 2.0;//定义一个常量

//构造函数
function __construct()
{
   self::$count++;
}
//析构函数
function __destruct()
{
   self::$count--;
}
//定义一个静态的方法
static function getCount()
{
   return self::$count;
}
}

//创建一个实例
$c = new Counter();

//执行打印
print( Counter::getCount(). "<br>\n" ); //使用直接输入类名来访问静态方法Counter::getCount

//打印类的版本
print( "Version useed: " .Counter::VERSION. "<br>\n" );

?>

Posted in 未分类 | Leave a comment

导出数据

1、insert into table select语句。将一个表的数据插入到另一个表中

2、sleect语句 into outfile filename快速将表转储到服务器上,要求必须要file的权限。

3、mysql -u table -p -e "select * from db.table where …." > data.txt,没有file权限亦可。

Posted in 未分类 | Leave a comment

apache虚拟主机配置

一、在一个IP地址上运行多个基于域名的web站 点。

1、配置如下:

NameVirtualHost 127.0.0.1

<VirtualHost 127.0.0.1>
ServerName "www.my.com"
DocumentRoot "D:/wamp/apps/thinkphp"

<Directory "D:/wamp/apps/thinkphp">
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

<VirtualHost 127.0.0.1>
ServerName "www.blog.com"
DocumentRoot "D:/wamp/apps/wp"

<Directory "D:/wamp/apps/wp">
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

这种配置下,www.my.com将访问第一个站点,www.blog.com将访问第二个站点,其他未配置的域名都直接访问第一个站点。
将NameVirtualHost哪一行删除,所有域名都直接访问第一个站点。

二、在不同的端口上运行不同的站点。

1、配置如下:

Listen 8080
NameVirtualHost 127.0.0.1:80
NameVirtualHost 127.0.0.1:8080

<VirtualHost 127.0.0.1:80>
ServerName "www.my.com"
DocumentRoot "D:/wamp/apps/thinkphp"

<Directory "D:/wamp/apps/thinkphp">
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

<VirtualHost 127.0.0.1:8080>
ServerName "www.blog.com"
DocumentRoot "D:/wamp/apps/wp"

<Directory "D:/wamp/apps/wp">
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

如果是该配置,所有8080端口的访问都将转到第二个站点。

Posted in 未分类 | Leave a comment

date_default_timezone_set

date_default_timezone_set() 设定用于所有日期时间函数的默认时区。

格式:

bool date_default_timezone_set ( string $timezone_identifier )

 

时区列表可以到php手册查询的{附录 J. 所支持时区列表}查找。

Asia/Shanghai、Asia/Chongqing等是我国时区。

Posted in 未分类 | Leave a comment

魔法引用函数magic_quotes_gpc和magic_quotes_runtime的区别和用法

PHP提供两个方便我们引用数据的魔法引用函数magic_quotes_gpc和 magic_quotes_runtime,这两个函数如果在php.ini设置为ON的时候,就会为我们引用的数据碰到单引号'和双引号"是自动加上反斜线,帮我们自动转译符号,确保数据操作的正确运行,可是我们在php不同的版本或者不同的服务器配置下,有的magic_quotes_gpc和 magic_quotes_runtime设置为on,有的又是off,所以我们写的程序必须符合on和off两种情况。那么 magic_quotes_gpc和magic_quotes_runtime两个函数有什么区别呢?看下面的说明:

magic_quotes_gpc
作用范围是:WEB客户服务端;
作用时间:请求开始是,例如当脚本运行时.

magic_quotes_runtime
作用范围:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的;
作用时间:每次当脚本访问运行状态中产生的数据.

所以

magic_quotes_gpc的设定值将会影响通过Get/Post/Cookies获得的数据
magic_quotes_runtime的设定值将会影响从文件中读取的数据或从数据库查询得到的数据

例子说明:

$data1 = $_POST['aaa'];
$data2 = implode(file('1.txt'));
if(get_magic_quotes_gpc()){
      //把数据$data1直接写入数据库
}else{
      $data1 = addslashes($data1);
      //把数据$data1写入数据库
}
if(get_magic_quotes_runtime()){
      //把数据$data2直接写入数据库
//从数据库读出的数据要经过一次stripslashes()之后输出
}else{
      $data2 = addslashes($data2);
      //把数据$data2写入数据库
//从数据库读出的数据直接输出
}

另外magic_quotes_runtime可以通过set_magic_quotes_runtime设定,0 for off,1 for on。

Posted in 未分类 | Leave a comment