分类归档:Web相关

php如果降低服务消耗

1.如果一个方法可静态化,就对它做静态声明。速率可提升至4倍。

2.echo 比 print 快。

3.使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接。

4.在执行for循环之前确定最大循环数,不要每循环一次都计算最大值。

5.注销那些不用的变量尤其是大数组,以便释放内存。

6.尽量避免使用__get,__set,__autoload。

7.require_once()代价昂贵。

8.在包含文件时使用完整路径,解析操作系统路径所需的时间会更少。

9.如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()。

10.函数代替正则表达式完成相同功能。

11.str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。

12.如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。

13.使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。

14.用@屏蔽错误消息的做法非常低效。

15.打开apache的mod_deflate模块。

16.数据库连接当使用完毕时应关掉。

17.$row[‘id’]的效率是$row[id]的7倍。

18.错误消息代价昂贵。

19.尽量不要在for循环中使用函数,比如for ($x=0; $x < count($array); $x)每循环一次都会调用count()函数。

20.在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。

21.递增一个全局变量要比递增一个局部变量慢2倍。

22.递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。

23.递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。

24.仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。

25.方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。

26.派生类中的方法运行起来要快于在基类中定义的同样的方法。

27.调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。

28.用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会。当然,只有当你不需要在字符串中包含变量时才可以这么做。

29.输出多个字符串时,用逗号代替句点来分隔字符串,速度更快。注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。

30.Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。

31.除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。

32.尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码 (OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。

33. 当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset() 技巧加速执行你的代码。

(举例如下)
if (strlen($foo) < 5) { echo “Foo is too short”$$ }
(与下面的技巧做比较)
if (!isset($foo{5})) { echo “Foo is too short”$$ }

调用isset()恰巧比strlen()快,因为与后者不同的是,isset()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。

34. 当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java代码并指望它们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。

35.并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。

36.并非要用类实现所有的数据结构,数组也很有用。

37.不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码?

38.当你需要时,你总能把代码分解成方法。

39.尽量采用大量的PHP内置函数。

40.如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。

41.评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。

42.mod_zip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%

PHP http抓取类 HttpRequest

static function HttpRequest($url, $data=array(), $abort=false) {
		if ( !function_exists('curl_init') ) { return empty($data) ? self::DoGet($url) : self::DoPost($url, $data); }
		$timeout = $abort ? 1 : 2;
		$ch = curl_init();
		if (is_array($data) && $data) {
			$formdata = http_build_query($data);
			curl_setopt($ch, CURLOPT_POST, true);
			curl_setopt($ch, CURLOPT_POSTFIELDS, $formdata);
		}
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
		curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
		$result = curl_exec($ch);
		return (false===$result && false==$abort)? ( empty($data) ? self:: DoGet($url) : self::DoPost($url, $data) ) : $result;
	}
	static public function DoGet($url){
		$url2 = parse_url($url);
		$url2["path"] = ($url2["path"] == "" ? "/" : $url2["path"]);
		$url2["port"] = ($url2["port"] == "" ? 80 : $url2["port"]);
		$host_ip = @gethostbyname($url2["host"]);
		$fsock_timeout = 2;  //2 second
		if(($fsock = fsockopen($host_ip, $url2['port'], $errno, $errstr, $fsock_timeout)) < 0){
			return false;
		}
		$request =  $url2["path"] .($url2["query"] ? "?".$url2["query"] : "");
		$in  = "GET " . $request . " HTTP/1.0\r\n";
		$in .= "Accept: */*\r\n";
		$in .= "User-Agent: Payb-Agent\r\n";
		$in .= "Host: " . $url2["host"] . "\r\n";
		$in .= "Connection: Close\r\n\r\n";
		if(!@fwrite($fsock, $in, strlen($in))){
			fclose($fsock);
			return false;
		}
		return self::GetHttpContent($fsock);
	}

	static public function DoPost($url,$post_data=array()){
		$url2 = parse_url($url);
		$url2["path"] = ($url2["path"] == "" ? "/" : $url2["path"]);
		$url2["port"] = ($url2["port"] == "" ? 80 : $url2["port"]);
		$host_ip = @gethostbyname($url2["host"]);
		$fsock_timeout = 2; //2 second
		if(($fsock = fsockopen($host_ip, $url2['port'], $errno, $errstr, $fsock_timeout)) < 0){
			return false;
		}
		$request =  $url2["path"].($url2["query"] ? "?" . $url2["query"] : "");
		$post_data2 = http_build_query($post_data);
		$in  = "POST " . $request . " HTTP/1.0\r\n";
		$in .= "Accept: */*\r\n";
		$in .= "Host: " . $url2["host"] . "\r\n";
		$in .= "User-Agent: Lowell-Agent\r\n";
		$in .= "Content-type: application/x-www-form-urlencoded\r\n";
		$in .= "Content-Length: " . strlen($post_data2) . "\r\n";
		$in .= "Connection: Close\r\n\r\n";
		$in .= $post_data2 . "\r\n\r\n";
		unset($post_data2);
		if(!@fwrite($fsock, $in, strlen($in))){
			fclose($fsock);
			return false;
		}
		return self::GetHttpContent($fsock);
	}
	static private function GetHttpContent($fsock=null) {
		$out = null;
		while($buff = @fgets($fsock, 2048)){
			$out .= $buff;
		}
		fclose($fsock);
		$pos = strpos($out, "\r\n\r\n");
		$head = substr($out, 0, $pos);    //http head
		$status = substr($head, 0, strpos($head, "\r\n"));    //http status line
		$body = substr($out, $pos + 4, strlen($out) - ($pos + 4));//page body
		if(preg_match("/^HTTP\/\d\.\d\s([\d]+)\s.*$/", $status, $matches)){
			if(intval($matches[1]) / 100 == 2){
				return $body;
			}else{
				return false;
			}
		}else{
			return false;
		}
	}

 

csshack

CSS hack:区分IE6,IE7,firefox
区别不同浏览器,CSS hack写法:
区别IE6与FF:
background:orange;*background:blue;
区别IE6与IE7:
background:green !important;background:blue;
区别IE7与FF:
background:orange; *background:green;
区别FF,IE7,IE6:
background:orange;*background:green;_background:blue;
background:orange;*background:green !important;*background:blue;
注:IE都能识别*;标准浏览器(如FF)不能识别*;
IE6能识别*;不能识别 !important;
IE7能识别*,能识别!important;
FF不能识别*,但能识别!important;
IE6 IE7 FF
* √ √ ×
!important √
√ √
浏览器优先级别:FF

通过snoopy模拟登陆其他有验证码的网站

实现需求:
通过snoopy获得A站sessionid和验证码图片,在自己的网站上显示登陆表单,提交后,snoopy提交输入信息到A站实现登陆,并获取里面的资料作分析。

验证码和sessionid的获取:
//获取图片
$snoopy->fetch(‘http://www.a.com/imgcode.gif’);
//从header信息里面分析出sessionid
preg_match(‘/JSESSIONID=([\w]+);/’, $snoopy->headers[2],$sessionid);
$jsessionid=$sessionid[1];
$imgcode=base64_encode($snoopy->results);
//显示登陆表单
?>
<form action=”” method=”post”>
<table>
<tr>
<th>用户名</th>
<td><input name=”username”></td>
</tr>
<tr>
<th>密码</th>
<td><input name=”password”></td>
</tr>
<tr>
<th>验证码</th>
<td><input name=”loginValidateCode”>
<img alt=”” src=”data:image/gif;base64,<?php echo $imgcode?>”>
</td>
</tr>
<tr>
<td><input type=”submit”></td>
</tr>
</table>
<input type=”hidden” name=”jsessionid” value=”<?php echo $jsessionid?>”>
</form>

提交表单信息到A站并显示登陆后页面:

$snoopy->cookies[‘JSESSIONID’]=post(‘jsessionid’);
$snoopy->submit(‘http://www.a.com/signin.html’,$_POST);
echo $snoopy->results;

小技巧总结:
可以对获取的图片二进制码通过base64编码直接用在img的src属性
<img alt=”” src=”data:image/gif;base64,<?php echo $base64code?>”>

 

 

 

 

//—-

Snoopy PHP网页抓取工具

snoopy是一个php类,用来模仿web浏览器的功能,它能完成获取网页内容和发送表单的任务。
下面是它的一些特征:
1、方便抓取网页的内容
2、方便抓取网页的文字(去掉HTML代码)
3、方便抓取网页的链接
4、支持代理主机
5、支持基本的用户/密码认证模式
6、支持自定义用户agent,referer,cookies和header内容
7、支持浏览器转向,并能控制转向深度
8、能把网页中的链接扩展成高质量的url(默认)
9、方便提交数据并且获取返回值
10、支持跟踪HTML框架(v0.92增加)
11、支持再转向的时候传递cookies
12、支持sock
类属性: (缺省值在括号里)
$host 连接的主机
$port 连接的端口
$proxy_host 使用的代理主机,如果有的话
$proxy_port 使用的代理主机端口,如果有的话
$agent 用户代理伪装 (Snoopy v0.1)
$referer 来路信息,如果有的话
$cookies cookies, 如果有的话
$rawheaders 其他的头信息, 如果有的话
$maxredirs 最大重定向次数, 0=不允许 (5)
$offsiteok whether or not to allow redirects off-site. (true)
$expandlinks          是否将链接都补全为完整地址 (true)
$user 认证用户名, 如果有的话
$pass 认证用户名, 如果有的话
$accept http 接受类型 (image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*)
$error 哪里报错, 如果有的话
$response_code 从服务器返回的响应代码
$headers 从服务器返回的头信息
$maxlength 最长返回数据长度
$read_timeout 读取操作超时 (requires PHP 4 Beta 4+)
设置为0为没有超时
$timed_out 如果一次读取操作超时了,本属性返回 true (requires PHP 4 Beta 4+)
$maxframes 允许追踪的框架最大数量
$status 抓取的http的状态
$temp_dir 网页服务器能够写入的临时文件目录 (/tmp)
$curl_path cURL binary 的目录, 如果没有cURL binary就设置为 false
类方法:
fetch($URI)
———–
这是为了抓取网页的内容而使用的方法。
$URI参数是被抓取网页的URL地址。
抓取的结果被存储在 $this->results 中。
如果你正在抓取的是一个框架,Snoopy将会将每个框架追踪后存入数组中,然后存入 $this->results。

fetchtext($URI)
—————
本方法类似于fetch(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回网页中的文字内容。

fetchform($URI)
—————
本方法类似于fetch(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回网页中表单内容(form)。

fetchlinks($URI)
—————-
本方法类似于fetch(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回网页中链接(link)。
默认情况下,相对链接将自动补全,转换成完整的URL。

submit($URI,$formvars)
———————-
本方法向$URL指定的链接地址发送确认表单。$formvars是一个存储表单参数的数组。

submittext($URI,$formvars)
————————–
本方法类似于submit(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回登陆后网页中的文字内容。

submitlinks($URI)
—————-
本方法类似于submit(),唯一不同的就是本方法会去除HTML标签和其他的无关数据,只返回网页中链接(link)。
默认情况下,相对链接将自动补全,转换成完整的URL。

例子:
<?php
include “Snoopy.class.php”;
$url = “http://www.re1d.com/”;
$snoopy = new Snoopy;
$snoopy->fetchtext($url);//抓取内容(去掉html代码)
#$snoopy->fetchlinks($url);//抓取链接
#$snoopy->fetchform($url); //获取表单
print_r($snoopy->results);打出结果

/******************************表单提交****************************/
$submit_url = “http://www.baidu.com/index.php”;//提交页面
$formvars[“wd”] = “QQ:26818750”;//搜索的词
$snoopy->submit($submit_url,$formvars);
print_r($snoopy->results);//获取表单提交后的 返回的结果
# $snoopy->submittext; //提交后只返回 去除html的 文本
# $snoopy->submitlinks;//提交后只返回 链接

/******************************来伪装ip,伪装浏览器****************************/
$formvars[“username”] = “admin”;
$formvars[“pwd”] = “admin”;
$action = “http://www.taoav.com”; //提交页面
$snoopy->cookies[“PHPSESSID”] = ‘fc106b1918bd522cc863f36890e6fff7’; //伪装sessionid
$snoopy->agent = “(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)”; //伪装浏览器
$snoopy->referer = http://www.re1d.com; //伪装来源页地址 http_referer
$snoopy->rawheaders[“Pragma”] = “no-cache”; //cache 的http头信息
$snoopy->rawheaders[“X_FORWARDED_FOR”] = “127.0.0.101”; //伪装ip
$snoopy->submit($action,$formvars);
echo $snoopy->results;

原来我们可以伪装session 伪装浏览器 ,伪装ip, haha 可以做很多事情了。
例如 带验证码,验证ip 投票, 可以不停的投。
ps:这里伪装ip ,其实是伪装http头, 所以一般的通过 REMOTE_ADDR 获取的ip是伪装不了,
反而那些通过http头来获取ip的(可以防止代理的那种) 就可以自己来制造ip。
关于如何验证码 ,简单说下:
首先用普通的浏览器, 查看页面 , 找到验证码所对应的sessionid,
同时记下sessionid和验证码值,
接下来就用snoopy去伪造 。
原理:由于是同一个sessionid 所以取得的验证码和第一次输入的是一样的。
有时我们可能需要伪造更多的东西,snoopy完全为我们想到了

$snoopy->proxy_host = “www.re1d.com”;
$snoopy->proxy_port = “8080”; //使用代理
$snoopy->maxredirs = 2; //重定向次数
$snoopy->expandlinks = true; //是否补全链接 在采集的时候经常用到
// 例如链接为 /images/taoav.gif 可改为它的全链接 http://www.taoav.com/images/taoav.gif ;
$snoopy->maxframes = 5 //允许的最大框架数
//注意抓取框架的时候 $snoopy->results 返回的是一个数组
$snoopy->error //返回报错信息

例子: 抓取一个页面并显示他的头信息和页面内容 (去掉HTML标签的页面):

include “Snoopy.class.php”;
$snoopy = new Snoopy;

$snoopy->user = “joe”;
$snoopy->pass = “bloe”;

if($snoopy->fetch(“http://www.re1d.com/”))
{
echo “response code: “.$snoopy->response_code.”<br>\n”;
while(list($key,$val) = each($snoopy->headers))
echo $key.”: “.$val.”<br>\n”;
echo “<p>\n”;

echo “<PRE>”.htmlspecialchars($snoopy->results).”</PRE>\n”;
}
else
echo “error fetching document: “.$snoopy->error.”\n”;

例子: 提交一个表单并且打印出头信息和去掉HTML标签的页面:

include “Snoopy.class.php”;
$snoopy = new Snoopy;

$submit_url = “http://lnk.ispi.net/texis/scripts/msearch/netsearch.html”;

$submit_vars[“q”] = “amiga”;
$submit_vars[“submit”] = “Search!”;
$submit_vars[“searchhost”] = “Altavista”;

if($snoopy->submit($submit_url,$submit_vars))
{
while(list($key,$val) = each($snoopy->headers))
echo $key.”: “.$val.”<br>\n”;
echo “<p>\n”;

echo “<PRE>”.htmlspecialchars($snoopy->results).”</PRE>\n”;
}
else
echo “error fetching document: “.$snoopy->error.”\n”;

例子: 展示所有属性的功能:

include “Snoopy.class.php”;
$snoopy = new Snoopy;

$snoopy->proxy_host = “my.proxy.host”;
$snoopy->proxy_port = “8080”;

$snoopy->agent = “(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)”;
$snoopy->referer = “http://www.microsnot.com/”;

$snoopy->cookies[“SessionID”] = 238472834723489l;
$snoopy->cookies[“favoriteColor”] = “RED”;

$snoopy->rawheaders[“Pragma”] = “no-cache”;

$snoopy->maxredirs = 2;
$snoopy->offsiteok = false;
$snoopy->expandlinks = false;

$snoopy->user = “joe”;
$snoopy->pass = “bloe”;

if($snoopy->fetchtext(“http://www.re1d.com”))
{
while(list($key,$val) = each($snoopy->headers))
echo $key.”: “.$val.”<br>\n”;
echo “<p>\n”;

echo “<PRE>”.htmlspecialchars($snoopy->results).”</PRE>\n”;
}
else
echo “error fetching document: “.$snoopy->error.”\n”;

例子: 抓取框架内容并展示结果:

include “Snoopy.class.php”;
$snoopy = new Snoopy;

$snoopy->maxframes = 5;

if($snoopy->fetch(“http://www.re1d.com/”))
{
echo “<PRE>”.htmlspecialchars($snoopy->results[0]).”</PRE>\n”;
echo “<PRE>”.htmlspecialchars($snoopy->results[1]).”</PRE>\n”;
echo “<PRE>”.htmlspecialchars($snoopy->results[2]).”</PRE>\n”;
}
else
echo “error fetching document: “.$snoopy->error.”\n”;

PHP批量检查网站的sitemap是否存在

<?php
$webfile = "sitexml.txt";
$opensite = fopen($webfile, 'r');

function curl($url) {
    /*
    * 测试用的浏览器信息
    *

    */
    $browsers = array (

        "user_agent" => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)",
        "language" => "en-us,en;q=0.5"
    );
    $ch = curl_init();
    // 设置 url
    curl_setopt($ch, CURLOPT_URL, $url);
    // 设置浏览器的特定header
    //CURLOPT_HTTPHEADER: An array of HTTP header fields to set.
    //curl_setopt($ch, CURLOPT_HTTPHEADER, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)');
    curl_setopt($ch, CURLOPT_HTTPHEADER, array (
        "User-Agent: {$browsers['user_agent']}",
        "Accept-Language: {$browsers['language']}"
    ));

    // 页面内容我们并不需要
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    // 只需返回HTTP header
    curl_setopt($ch, CURLOPT_HEADER, 1);
    // 返回结果,而不是输出它
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    //执行curl操作
    //return (curl_exec($ch)!==false) ? true : false;
    $output = curl_exec($ch);
    return $output;
    curl_close($ch);
}
while (!feof($opensite)) {
    $onesite = fgets($opensite, 4096);
    $onesite = str_replace("\n", "", $onesite);
    $url = $onesite . "/sitemap.xml";
    if (!empty ($onesite)) {

        echo "[URL]: $url<br>";
        echo curl($url);

        if (curl($url) == false) {
            echo '<FONT color=#ff0000>' . "网站不能打开" . '</font>' . "<br>";

        }
        preg_match('/HTTP\/1.1\s*(\d+)[\s\S]+/', curl($url), $http_status);
        //print_r($http_status);
        if ($http_status[1] == 200) {
            echo $url . "存在sitemap" . "<br>";
        }
        if ($http_status[1] == 301) {
            $url = 'www.' . $url;
            preg_match('/HTTP\/1.1\s*(\d+)[\s\S]+/', curl($url), $http_status);
            if ($http_status[1] == 200) {
                echo $url . "存在sitemap" . "<br>";
            } else {
                echo '<FONT color=#ff0000>' . $url . "没有sitemap" . '</font>';
            }
        }
        if ($http_status[1] == (404|400|403|500|501|502|503|504|505)) {
            echo '<FONT color=#ff0000>' . $url . "没有sitemap" . '</font>';

        }

        echo "<br><br>";
    }
}
?>

 

IIS配置PHP环境(快速最新版)

我们知道php配置有几种:

1、CGI方式加载PHP环境,通常就是IIS里面配置解释器为php.exe,早期比较常见,目前使用较少。
特点是:稳定,但效率太低。

2、ISAPI方式加载PHP环境,通常就是IIS里面配置解释器为php5isapi.dll,目前使用最多,应用最广。
特点是:多线程,效率较高,但不够稳定。

3、FastCGI方式加载PHP环境,在IIS环境里并不常见,但其它系统环境应用还是有的,不过IIS7.0开始内置FastCGI了。
特点是:高效率,高稳定性,属于将来发展趋势。

我试过其他的特别麻烦,PHP 5.3发布的Windows版已经不支持ISAPI模式了,所以我打算按微软推荐的FastCGI方式运行PHP。

我用的就第三种,也是最好最快的,因为FastCGI大大加强了IIS处理PHP的能力,能迅速提高PHP站点的反应速度和生产力,

并具有更高的稳定性和安全性.

下载地址:http://windows.php.net/download/里面有好多种,要那种呢?

PHP现在推出5.3.2版本了,不过下载的时候有几个不同版本选择。那就是VC6 X86和VC9 X86。
首先我来解答:
VC6是什么?
VC6就是legacy Visual Studio 6 compiler,就是使用这个编译器编译的。
VC9是什么?
VC9就是the Visual Studio 2008 compiler,就是用微软的VS编辑器编译的。

那我们如何选择下载哪个版本的PHP呢?
如果你是在windows下使用Apache+PHP的,请选择VC6版本;
如果你是在windows下使用IIS+PHP的,请选择VC9版本;

那Non Thread Safe是什么?
Non Thread Safe就是非线程安全;
Thread Safe 是什么?
Non Thread Safe 是线程安全;

FastCGI执行方式是以单一线程来执行操作,所以不需要进行线程的安全检查,除去线程安全检查的防护反而可以提高执行效率,所以,如果是以 FastCGI(无论搭配 IIS 6 或 IIS 7)执行 PHP ,都建议下载、执行 non-thread safe 的 PHP (PHP 的二進位檔有兩種包裝方式:msi 、zip ,請下載 zip 套件)所以我们选择NO-Thread Safe 版本的PHP来使用
而线程安全检查正是为ISAPI方式的PHP准备的,因为有许多php模块都不是线程安全的,所以需要使用Thread Safe的PHP。

 

下载安装,我安装默认路径了:

曾祥展

记得选中第三项:IIS FASTCGI

曾祥展

如果没有安装IIS FASTCGI的 下一步会提示没有安装的,下载安装就行了

FastCGI  for IIS 6  7   http://www.iis.net/expand/fastcgi

曾祥展

2-1

安装好后,继续下一步,我按照默认了:

曾祥展

安装完毕后,就是配置了。

这种配置有两种方法,我用cmd配置,一条命令就行了。

 

 

 

转到刚才安装CGI的目录下:

>cd C:\WINDOWS\system32\inetsrv

>cscript fcgiconfig.js -add -section:”PHP” -extension:php -path:”C:\Program Files\PHP\php-cgi.exe”

注意:path:”xxxx\php-cgi.exe” 是你安装php的目录

cscript fcgiconfig.js -set -section:”PHP” -InstanceMaxRequests:10000
cscript fcgiconfig.js -set -section:”PHP” -EnvironmentVars:PHP_FCGI_MAX_REQUESTS:10000

曾祥展

ok!完毕!

测试下:

新建一个.php文件,里面

<?php

phpinfo();

?>

保存!

运行,出现下面页面,说明配置成功了!

曾祥展

这样的方法 IIS就不用怎么配置,他都会自动配置好了!微软提供的配置更加详细 !

如果按上面的教程配置好后,运行php测试页面,出现了500错误。

那就设置php.ini中的date.timezone项。

我这里设置成上海时区:date.timezone = Asia/beijing

设置完后就一切正常了!

php数组排序函数

如果你已经使用了一段时间PHP的话,那么,你应该已经对它的数组比较熟悉了——这种数据结构允许你在单个变量中存储多个值,并且可以把它们作为一个集合进行操作。

经常,开发人员发现在PHP中使用这种数据结构对值或者数组元素进行排序非常有用。PHP提供了一些适合多种数组的排序函数,这些函数允许你在数组内部对元素进行排列,也允许用很多不同的方法对它们进行重新排序。在这篇文章中我们将讨论该排序中最重要的几个函数。

简单排序

首先,让我们来看看最简单的情况:将一个数组元素从低到高进行简单排序,这个函数既可以按数字大小排列也可以按字母顺序排列。PHP的sort()函数实现了这个功能,如Listing A所示:

Listing A

<?php

? $data = array(5,8,1,7,2);

? sort($data);

? print_r($data);

? ?>

输出结果如下所示:

Array ([0] => 1

[1] => 2

[2] => 5

[3] => 7

[4] => 8

)

也能使用rsort()函数进行排序,它的结果与前面所使用的sort()简单排序结果相反。Rsort()函数对数组元素进行从高到低的倒排,同样可以按数字大小排列也可以按字母顺序排列。Listing B给我们展示了它的一个例子:

Listing B

<?php $data = array(5,8,1,7,2);rsort($data); print_r($data);

?>

它的输出结果如下:

Array ([0] => 8

[1] => 7

[2] => 5

[3] => 2

[4] => 1

)

根据关键字排序

当我们使用数组的时候,经常根据关键字对数组重新排序,从高到低。Ksort()函数就是根据关键字进行排序的函数,同时,它在排序的过程中会保持关键字的相关性。Listing C就是一个例子:

Listing C

<?php $data = array(“US” => “United States”, “IN” => “India”, “DE” => “Germany”, “ES” => “Spain”);ksort($data); print_r($data);

?>

它的输出结果如下:

Array ([DE] => Germany

[ES] => Spain

[IN] => India

[US] => United States

)

Krsort()函数是根据关键字对数组进行倒排,Listing D就是这样的例子:

Listing D

<?php $data = array(“US” => “United States”, “IN” => “India”, “DE” => “Germany”, “ES” => “Spain”);krsort($data); print_r($data);

?>

它的输出结果如下:

Array ([US] => United States

[IN] => India

[ES] => Spain

[DE] => Germany

)

根据值排序

如果你想使用值排序来取代关键字排序的话,PHP也能满足你的要求。你只要使用asort()函数来代替先前提到的ksort()函数就可以了。如Listing E所示:

Listing E

<?php $data = array(“US” => “United States”, “IN” => “India”, “DE” => “Germany”, “ES” => “Spain”);asort($data); print_r($data);

?>

下面就是它的输出结果。请注意这个结果与上面使用ksort()函数所得到的结果的不同——在这两种情况中,都是按字母顺序进行排序的,但是它们是根据数组的不同字段进行排序的。

同时,请注意关键字-值之间的联系会始终保持;它只是关键字-值对排序后的一种方式,排序并不会改变它们的对应关系。

Array ([DE] => Germany

[IN] => India

[ES] => Spain

[US] => United States

)

现在,你肯定能猜到这种排序也可以进行倒排,它使用arsort()函数完成这个功能。Listing F就是一个例子:

Listing F

<?php $data = array(“US” => “United States”, “IN” => “India”, “DE” => “Germany”, “ES” => “Spain”);arsort($data); print_r($data);

?>

下面是它的输出结果,根据值按字母表顺序进行倒排。将下面的结果与用krsort()函数进行倒排后生成的结果进行比较,就能很容易明白两者的不同了。

Array ([US] => United States

[ES] => Spain

[IN] => India

[DE] => Germany

)

自然语言排序

PHP有一个非常独特的排序方式,这种方式使用认知而不是使用计算规则。这种特性称为自然语言排序,当创建模糊逻辑应用软件的时候这种排序方式非常有用。下面大家可以来看看它的一个简单例子,如Listing G所示:

Listing G

<?php $data = array(“book-1”, “book-10”, “book-100”, “book-5”); sort($data);print_r($data);

natsort($data); print_r($data);?>

它的输出结果如下:

Array ([0] => book-1

[1] => book-10

[2] => book-100

[3] => book-5

)

Array

(

[0] => book-1

[3] => book-5

[1] => book-10

[2] => book-100

)

它们的不同已经很清楚了:第二个排序结果更直观,更“人性化”,然而第一个则更符合算法规则,更具“计算机”特点。

自然语言能进行倒排吗?答案是肯定的!只要对natsort()的结果使用array_reverse()函数就可以了,Listing H就是一个简单例子:

Listing H

<?php $data = array(“book-1”, “book-10”, “book-100”, “book-5”);natsort($data); print_r(array_reverse($data));

?>

下面是它的输出结果:

Array ([0] => book-100

[1] => book-10

[2] => book-5

[3] => book-1

)

根据用户自定义的规则排序

PHP也能让你定义自己的排序算法,你可以通过创建你自己的比较函数,并把它传递给usort()函数。如果第一个参数比第二个参数“小”的话,比较函数必须返回一个比0小的数,如果第一参数比第二个参数“大”的话,比较函数应该返回一个比0大的数。

Listing I就是这样的一个例子,在这个例子中根据它们的长度对数组元素进行排序,最短的项放在最前面:

Listing I

<?php $data = array(“joe@”, “@”, “asmithsonian@”, “jay@”);usort($data, ‘sortByLen’);

print_r($data); function sortByLen($a, $b) {

if (strlen($a) == strlen($b)) {

return 0;

} else {

return (strlen($a) > strlen($b)) ? 1 : -1;

}

}

?>

这样,就创建了我们自己的比较函数,这个函数使用strlen()函数比较每一个字符串的个数,然后分别返回1,0或-1.这个返回值是决定元素排列的基础。下面是它的输出结果:

Array ([0] => jay@

[1] => joe@

[2] => @

[3] => asmithsonian@

)

自然语言排序

PHP有一个非常独特的排序方式,这种方式使用认知而不是使用计算规则。这种特性称为自然语言排序,当创建模糊逻辑应用软件的时候这种排序方式非常有用。下面大家可以来看看它的一个简单例子,如Listing G所示:

Listing G

<?php $data = array(“book-1”, “book-10”, “book-100”, “book-5”); sort($data);print_r($data);

natsort($data); print_r($data);?>

它的输出结果如下:

Array ([0] => book-1

[1] => book-10

[2] => book-100

[3] => book-5

)

Array

(

[0] => book-1

[3] => book-5

[1] => book-10

[2] => book-100

)

它们的不同已经很清楚了:第二个排序结果更直观,更“人性化”,然而第一个则更符合算法规则,更具“计算机”特点。

自然语言能进行倒排吗?答案是肯定的!只要对natsort()的结果使用array_reverse()函数就可以了,Listing H就是一个简单例子:

Listing H

<?php $data = array(“book-1”, “book-10”, “book-100”, “book-5”);natsort($data); print_r(array_reverse($data));

?>

下面是它的输出结果:

Array ([0] => book-100

[1] => book-10

[2] => book-5

[3] => book-1

)

根据用户自定义的规则排序

PHP也能让你定义自己的排序算法,你可以通过创建你自己的比较函数,并把它传递给usort()函数。如果第一个参数比第二个参数“小”的话,比较函数必须返回一个比0小的数,如果第一参数比第二个参数“大”的话,比较函数应该返回一个比0大的数。

Listing I就是这样的一个例子,在这个例子中根据它们的长度对数组元素进行排序,最短的项放在最前面:

Listing I

<?php $data = array(“joe@”, “@”, “asmithsonian@”, “jay@”);usort($data, ‘sortByLen’);

print_r($data); function sortByLen($a, $b) {

if (strlen($a) == strlen($b)) {

return 0;

} else {

return (strlen($a) > strlen($b)) ? 1 : -1;

}

}

?>

这样,就创建了我们自己的比较函数,这个函数使用strlen()函数比较每一个字符串的个数,然后分别返回1,0或-1.这个返回值是决定元素排列的基础。下面是它的输出结果:

Array ([0] => jay@

[1] => joe@

[2] => @

[3] => asmithsonian@

)

多维排序

最后,PHP也允许在多维数组上执行一些比较复杂的排序——例如,首先对一个嵌套数组使用一个普通的关键字进行排序,然后再根据另一个关键字进行排序。这与使用SQL的ORDER BY语句对多个字段进行排序非常相似。为了能更好的明白它是如何工作的,请仔细看Listing J所举的例子:

Listing J

<?php $data = array(array(“id” => 1, “name” => “Boney M”, “rating” => 3),

array(“id” => 2, “name” => “Take That”, “rating” => 1),

array(“id” => 3, “name” => “The Killers”, “rating” => 4),

array(“id” => 4, “name” => “Lusain”, “rating” => 3),

); foreach ($data as $key => $value) {

$name[$key] = $value[‘name’];

$rating[$key] = $value[‘rating’];

}

array_multisort($rating, $name, $data); print_r($data);?>

这里,我们在$data数组中模拟了一个行和列数组。然后,我使用array_multisort()函数对数据集合进行重排,首先是根据rating进行排序,然后,如果rating相等的话,再根据name排序。它的输出结果如下:

Array ([0] => Array

(

[id] => 2

[name] => Take That

[rating] => 1

) [1] => Array

(

[id] => 1

[name] => Boney M

[rating] => 3

)

[2] => Array

(

[id] => 4

[name] => Lusain

[rating] => 3

)

[3] => Array

(

[id] => 3

[name] => The Killers

[rating] => 4

)

)

array_multisort()函数是PHP中最有用的函数之一,它有非常广泛的应用范围。另外,就如你在例子中所看到的,它能对多个不相关的数组进行排序,也可以使用其中的一个元素作为下次排序的基础,还可以对数据库结果集进行排序。

这些例子应该让你对PHP中各种数组排序函数的使用有了初步的了解,也向你展示了一些隐藏在PHP数组处理工具包的内部功能。

The resource is not on the build path of a PHP project

修改 .project 为

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
 <name>z</name>
 <comment></comment>
 <projects>
 </projects>
 <buildSpec>
  <buildCommand>
   <name>net.sourceforge.phpeclipse.parserbuilder</name>
  <arguments>
  </arguments>
  </buildCommand>
 </buildSpec>
<natures>
<nature>net.sourceforge.phpeclipse.phpnature</nature>
</natures>
</projectDescription>