"飘云" 发布的文章

最近管理的服务器,结果,打开phpmyadmin的时候就出现了这样的错误,在网上看了很多解答,看起来都对,但是我还是费了很大的劲才搞好,所以写下来已帮助记忆。

首先:在php的目录下建立个文件夹temp,这个有权限的问题,如果是ntfs的分区,就一定要添加evryone的控制权限,否则是没用的。

其次:在php.ini找到:

;session.save_path

这一行,修改成:

session.save_path = "C:/php/tmp"

把分号弄掉。这里要注意,php.ini里面有三处session.save_path ,如果只修改一个地方,还是不行的。

将php.ini中的session.auto_start的值改为1(启动),默认是0(禁用),

最后,是在phpmyadmin中找到:

config.sample.inc.php

修改成:config.inc.php

找到 $cfg['blowfish_secret'] 将后面的赋值,加入数字和字母组合。

全部修改完以后,重启iis或者apache,就可以看到熟悉的phpmyadmin的登陆界面了。

最近不知道什么原因公司服务器上的Apache服务会莫名其妙的挂掉,Apache就这样,压力大了就罢工,考虑找别的软件代替Apache。。现在有个问题:要在Apache 挂掉时自动启动Apache,呵呵,又搬出强大的CMD,简单的写了一段命令,直接运行成功~~

@echo off
net start | find /c /i "apache2.2" > nul
if "%errorlevel%" == "1" goto startapache
goto exit

:startapache
net start apache2.2

:exit

把上面代码保存为 apache.bat ,运行一下,如果Apache正常的话不会有任何提示,如果挂掉的话会自动启动Apache,注意Apache的服务名(这里是 apache2.2),不分大小写,打开系统服务先确认一下,改成相应的名字。

至于怎么定时运行,更简单了,拉出系统的计划任务,设定1分钟运行一次,不登陆也运行,用最高权限的用户运行就行了。

我的本地测试环境是php5.4+mysql5.60,用帝国备份王备份数据库,结果出错,提示下面的错误代码:

PHP Deprecated: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead. in E:\wwwroot\piaoyun.cc\ebak\class\functions.php on line 912
PHP Deprecated: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead. in E:\wwwroot\piaoyun.cc\ebak\class\functions.php on line 912
PHP Deprecated: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead. in E:\wwwroot\piaoyun.cc\ebak\class\functions.php on line 912

解决办法:
搜索帝国备份王所在目录文件夹,找到fuctions.php,在912行

找到函数:
mysql_escape_string

修改为:
mysql_real_escape_string

再次备份数据库就不再提示错误了。

现在很多PHP程序都需要ZendOptimizer环境,但是ZendOptimizer在PHP5.2之后已经被支持,那怎么办,Zend也不会这么做,原来PHP5.3开始ZendOptimizer正式改为Zend Guard Loader。

Zend Guard Loader的发布,而且Zend Optimizer不会再更新,并且由于差异很大使用Zend Guard加密代码时将提示你是否使用php5.3,如果使用5.3那么代码就无法在php5.2上运行。

Zend Guard Loader安装说明
1、下载Zend Guard Loader包。(官方地址:http://www.zend.com/en/products/guard/downloads)
下面的下载地址包含了Linux版本和Windows版本
下载地址:
360云盘:http://yunpan.cn/cJNjrwRyriYTy (提取码:029e)
百度网盘:http://pan.baidu.com/s/1hqmtXLM

2. 并提取ZendGuardLoader.so(Linux)或ZendLoader.dll(Windows)上传到服务器。

3. 加载ZendGuardLoader,配置PHP.INI
例子:

zend_extension=C:\web\PHP\ext\ZendLoader.dll
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=3
zend_loader.license_path=

 

下面逐一说明:
注意windows版的只支持NTS(非线程安全)版的PHP5.3,即phpinfo中Thread Safety为disabled的!

在你的php.ini文件中添加以下行:

Linux和Mac OS X:zend_extension=<ZendGuardLoader.so的绝对路径>
Windows的非线程安全的:zend_extension=<ZendLoader.dll的绝对路径>

4. 添加下面这行加载ZendGuardLoader:
;启用加载编码脚本。默认开启
zend_loader.enable=1

5. 可选:配置ZendGuardLoader
;禁用检查授权(出于性能原因)
zend_loader.disable_licensing=0
;配置混淆水平 0 – 不支持混淆
zend_loader.obfuscation_level_support=3
;配置寻找授权文件的路径
zend_loader.license_path=

6. 如果你同时使用Zend debugger,请保证加载Zend guard Loader后再加载Zend debugger

7. 如果你同时使用Ioncube loader,请保证加载Ioncube loader后再加载Zend guard Loader

8. 重启Web服务。

如果在phpinfo中看到如下内容(不同的版本可能会有所不同):

This program makes use of the Zend Scripting Language Engine:Zend Engine v2.4.0, Copyright (c) 1998-2011 Zend Technologies

说明安装已经成功!

附(Windows版本):

[Zend.loader]
zend_extension=X:\ZendGuardLoader\php-5.4.x\ZendLoader.dll
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=3
zend_loader.license_path=

附(Linux版本):
zend_extension=/usr/lib64/php/modules/ZendGuardLoader.so

第一步:打开-》开始》控制面板》Internet信息服务(IIS)管理器,在左侧的树形列表找到“应用程序池
01

第二步:在右侧的列表中右击“设置应用程序池默认设置”弹出菜单,
02

第三步:找到“标识”选项卡,点击右侧的方形按钮,弹出“应用程序标识”对话框中的“内置账户”的下拉菜单中选择“LocalSystem”,然后重启IIS服务器,至此,这个问题就彻底解决了。
03

使用普通方法会使系统出现异常,比如开始菜单程序无法删除、收藏夹无法展开等,网上流传使用透明图标的方法会在快捷方式上留下一块黑痣,下面的方法是小君研究出来的,对系统不会有任何影响,此方法并不是删除了小箭头,而是将小箭头变成了透明,实际上小箭头是以透明状态存在的

去掉Windows7快捷方式小箭头的代码如下:

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /v 29 /d "%systemroot%\system32\imageres.dll,196" /t reg_sz /f
taskkill /f /im explorer.exe
attrib -s -r -h "%userprofile%\AppData\Local\iconcache.db"
del "%userprofile%\AppData\Local\iconcache.db" /f /q
start explorer

pause

XP去掉小箭头的方和和Win7一样,但代码略有不同:
去掉XP快捷方式小箭头的代码如下:

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /v 29 /d "%systemroot%\system32\shell32.dll,49" /t reg_sz /f
taskkill /f /im explorer.exe
attrib -s -r -h "%userprofile%\Local Settings\Application Data\iconcache.db"
del "%userprofile%\Local Settings\Application Data\iconcache.db" /f /q
start explorer

pause

恢复Win7快捷方式箭头,注意代码格式不要复制错误:

reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /v 29 /f
taskkill /f /im explorer.exe
attrib -s -r -h "%userprofile%\AppData\Local\iconcache.db"
del "%userprofile%\AppData\Local\iconcache.db" /f /q
start explorer

pause

恢复XP快捷方式箭头,注意代码格式不要复制错误:

reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /v 29 /f
taskkill /f /im explorer.exe
attrib -s -r -h "%userprofile%\Local Settings\Application Data\iconcache.db"
del "%userprofile%\Local Settings\Application Data\iconcache.db" /f /q
start explorer

pause

注意的是,上面两种恢复方法只针对本文去掉小箭头的方法,如果各位使用别的方法去掉了小箭头,用这个方法恢复,不一定会有效果

查了下网络资料,对Nginx配置文件nginx.conf的理解整理如下:

#定义Nginx运行的用户和用户组
user www www;

#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 8;

#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;

#进程文件
pid /var/run/nginx.pid;

#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
worker_rlimit_nofile 65535;

#工作模式与连接数上限
events {

	#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
	use epoll;
	
	#单个进程最大连接数(最大连接数=连接数*进程数)
	worker_connections 65535;
}

#设定http服务器
http {
	include mime.types; #文件扩展名与文件类型映射表
	default_type application/octet-stream; #默认文件类型
	#charset utf-8; #默认编码
	server_names_hash_bucket_size 128; #服务器名字的hash表大小
	client_header_buffer_size 32k; #上传文件大小限制
	large_client_header_buffers 4 64k; #设定请求缓
	client_max_body_size 8m; #设定请求缓
	sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
	autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
	tcp_nopush on; #防止网络阻塞
	tcp_nodelay on; #防止网络阻塞
	keepalive_timeout 120; #长连接超时时间,单位是秒

	#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
	fastcgi_connect_timeout 300;
	fastcgi_send_timeout 300;
	fastcgi_read_timeout 300;
	fastcgi_buffer_size 64k;
	fastcgi_buffers 4 64k;
	fastcgi_busy_buffers_size 128k;
	fastcgi_temp_file_write_size 128k;

	#gzip模块设置
	gzip on; #开启gzip压缩输出
	gzip_min_length 1k; #最小压缩文件大小
	gzip_buffers 4 16k; #压缩缓冲区
	gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
	gzip_comp_level 2; #压缩等级
	gzip_types text/plain application/x-javascript text/css application/xml;
	
	#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
	gzip_vary on;
	#limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用

	upstream snsgou.com {
		#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
		server 192.168.80.121:80 weight=3;
		server 192.168.80.122:80 weight=2;
		server 192.168.80.123:80 weight=3;
	}

	#虚拟主机的配置
	server {

		#监听端口
		listen 80;
		
		#域名可以有多个,用空格隔开
		server_name blog.snsgou.com snsgou.com;
		index index.html index.htm index.php;
		root /data/www/qianyunlai;

		location ~ .*.(php|php5)?$ {
			fastcgi_pass 127.0.0.1:9000;
			fastcgi_index index.php;
			include fastcgi.conf;
		}

		#图片缓存时间设置
		location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
			expires 10d;
		}

		#JS和CSS缓存时间设置
		location ~ .*.(js|css)?$ {
			expires 1h;
		}

		#日志格式设定
		log_format access '$remote_addr - $remote_user [$time_local] "$request" '
		'$status $body_bytes_sent "$http_referer" '
		'"$http_user_agent" $http_x_forwarded_for';
		
		#定义本虚拟主机的访问日志
		access_log /var/log/nginx/qianyunlai.log access;

		#对 "/" 启用反向代理
		location / {
			proxy_pass http://127.0.0.1:88;
			proxy_redirect off;
			proxy_set_header X-Real-IP $remote_addr;
			
			#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			
			#以下是一些反向代理的配置,可选。
			proxy_set_header Host $host;
			client_max_body_size 10m; #允许客户端请求的最大单文件字节数
			client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
			proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
			proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
			proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
			proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
			proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置
			proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
			proxy_temp_file_write_size 64k;
			#设定缓存文件夹大小,大于这个值,将从upstream服务器传
		}

		#设定查看Nginx状态的地址
		location /NginxStatus {
			stub_status on;
			access_log on;
			auth_basic "NginxStatus";
			auth_basic_user_file conf/htpasswd;
			#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
		}

		#本地动静分离反向代理配置
		#所有jsp的页面均交由tomcat或resin处理
		location ~ .(jsp|jspx|do)?$ {
			proxy_set_header Host $host;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_pass http://127.0.0.1:8080;
		}

		#所有静态文件由nginx直接读取不经过tomcat或resin
		location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ {
			expires 15d; 
		}
		
		location ~ .*.(js|css)?$ {
			expires 1h;
		}
	}
}

Nginx参数:

--prefix= 指向安装目录
--sbin-path 指向(执行)程序文件(nginx)
--conf-path= 指向配置文件(nginx.conf)
--error-log-path= 指向错误日志目录
--pid-path= 指向pid文件(nginx.pid)
--lock-path= 指向lock文件(nginx.lock)(安装文件锁定,防止安装文件被别人利用,或自己误操作。)
--user= 指定程序运行时的非特权用户
--group= 指定程序运行时的非特权用户组
--builddir= 指向编译目录
--with-rtsig_module 启用rtsig模块支持(实时信号)
--with-select_module 启用select模块支持(一种轮询模式,不推荐在高载环境下使用)禁用:--without-select_module
--with-poll_module 启用poll模块支持(功能与select相同,与select特性相同,为一种轮询模式,不推荐在高载环境下使用)
--with-file-aio 启用file aio支持(一种APL文件传输格式)
--with-ipv6 启用ipv6支持
--with-http_ssl_module 启用ngx_http_ssl_module支持(使支持https请求,需已安装openssl)
--with-http_realip_module 启用ngx_http_realip_module支持(这个模块允许从请求标头更改客户端的IP地址值,默认为关)
--with-http_addition_module 启用ngx_http_addition_module支持(作为一个输出过滤器,支持不完全缓冲,分部分响应请求)
--with-http_xslt_module 启用ngx_http_xslt_module支持(过滤转换XML请求)
--with-http_image_filter_module 启用ngx_http_image_filter_module支持(传输JPEG/GIF/PNG 图片的一个过滤器)(默认为不启用。gd库要用到)
--with-http_geoip_module 启用ngx_http_geoip_module支持(该模块创建基于与MaxMind GeoIP二进制文件相配的客户端IP地址的ngx_http_geoip_module变量)
--with-http_sub_module 启用ngx_http_sub_module支持(允许用一些其他文本替换nginx响应中的一些文本)
--with-http_dav_module 启用ngx_http_dav_module支持(增加PUT,DELETE,MKCOL:创建集合,COPY和MOVE方法)默认情况下为关闭,需编译开启
--with-http_flv_module 启用ngx_http_flv_module支持(提供寻求内存使用基于时间的偏移量文件)
--with-http_gzip_static_module 启用ngx_http_gzip_static_module支持(在线实时压缩输出数据流)
--with-http_random_index_module 启用ngx_http_random_index_module支持(从目录中随机挑选一个目录索引)
--with-http_secure_link_module 启用ngx_http_secure_link_module支持(计算和检查要求所需的安全链接网址)
--with-http_degradation_module 启用ngx_http_degradation_module支持(允许在内存不足的情况下返回204或444码)
--with-http_stub_status_module 启用ngx_http_stub_status_module支持(获取nginx自上次启动以来的工作状态)
--without-http_charset_module 禁用ngx_http_charset_module支持(重新编码web页面,但只能是一个方向--服务器端到客户端,并且只有一个字节的编码可以被重新编码)
--without-http_gzip_module 禁用ngx_http_gzip_module支持(该模块同-with-http_gzip_static_module功能一样)
--without-http_ssi_module 禁用ngx_http_ssi_module支持(该模块提供了一个在输入端处理处理服务器包含文件(SSI)的过滤器,目前支持SSI命令的列表是不完整的)
--without-http_userid_module 禁用ngx_http_userid_module支持(该模块用来处理用来确定客户端后续请求的cookies)
--without-http_access_module 禁用ngx_http_access_module支持(该模块提供了一个简单的基于主机的访问控制。允许/拒绝基于ip地址)
--without-http_auth_basic_module禁用ngx_http_auth_basic_module(该模块是可以使用用户名和密码基于http基本认证方法来保护你的站点或其部分内容)
--without-http_autoindex_module 禁用disable ngx_http_autoindex_module支持(该模块用于自动生成目录列表,只在ngx_http_index_module模块未找到索引文件时发出请求。)
--without-http_geo_module 禁用ngx_http_geo_module支持(创建一些变量,其值依赖于客户端的IP地址)
--without-http_map_module 禁用ngx_http_map_module支持(使用任意的键/值对设置配置变量)
--without-http_split_clients_module 禁用ngx_http_split_clients_module支持(该模块用来基于某些条件划分用户。条件如:ip地址、报头、cookies等等)
--without-http_referer_module 禁用disable ngx_http_referer_module支持(该模块用来过滤请求,拒绝报头中Referer值不正确的请求)
--without-http_rewrite_module 禁用ngx_http_rewrite_module支持(该模块允许使用正则表达式改变URI,并且根据变量来转向以及选择配置。如果在server级别设置该选项,那么他们将在 location之前生效。如果在location还有更进一步的重写规则,location部分的规则依然会被执行。如果这个URI重写是因为location部分的规则造成的,那么 location部分会再次被执行作为新的URI。 这个循环会执行10次,然后Nginx会返回一个500错误。)
--without-http_proxy_module 禁用ngx_http_proxy_module支持(有关代理服务器)
--without-http_fastcgi_module 禁用ngx_http_fastcgi_module支持(该模块允许Nginx 与FastCGI 进程交互,并通过传递参数来控制FastCGI 进程工作。 )FastCGI一个常驻型的公共网关接口。
--without-http_uwsgi_module 禁用ngx_http_uwsgi_module支持(该模块用来医用uwsgi协议,uWSGI服务器相关)
--without-http_scgi_module 禁用ngx_http_scgi_module支持(该模块用来启用SCGI协议支持,SCGI协议是CGI协议的替代。它是一种应用程序与HTTP服务接口标准。它有些像FastCGI但他的设计 更容易实现。)
--without-http_memcached_module 禁用ngx_http_memcached_module支持(该模块用来提供简单的缓存,以提高系统效率)
--without-http_limit_zone_module 禁用ngx_http_limit_zone_module支持(该模块可以针对条件,进行会话的并发连接数控制)
--without-http_limit_req_module 禁用ngx_http_limit_req_module支持(该模块允许你对于一个地址进行请求数量的限制用一个给定的session或一个特定的事件)
--without-http_empty_gif_module 禁用ngx_http_empty_gif_module支持(该模块在内存中常驻了一个1*1的透明GIF图像,可以被非常快速的调用)
--without-http_browser_module 禁用ngx_http_browser_module支持(该模块用来创建依赖于请求报头的值。如果浏览器为modern ,则$modern_browser等于modern_browser_value指令分配的值;如 果浏览器为old,则$ancient_browser等于 ancient_browser_value指令分配的值;如果浏览器为 MSIE中的任意版本,则 $msie等于1)
--without-http_upstream_ip_hash_module 禁用ngx_http_upstream_ip_hash_module支持(该模块用于简单的负载均衡)
--with-http_perl_module 启用ngx_http_perl_module支持(该模块使nginx可以直接使用perl或通过ssi调用perl)
--with-perl_modules_path= 设定perl模块路径
--with-perl= 设定perl库文件路径
--http-log-path= 设定access log路径
--http-client-body-temp-path= 设定http客户端请求临时文件路径
--http-proxy-temp-path= 设定http代理临时文件路径
--http-fastcgi-temp-path= 设定http fastcgi临时文件路径
--http-uwsgi-temp-path= 设定http uwsgi临时文件路径
--http-scgi-temp-path= 设定http scgi临时文件路径
--without-http 禁用http server功能
--without-http-cache 禁用http cache功能
--with-mail 启用POP3/IMAP4/SMTP代理模块支持
--with-mail_ssl_module 启用ngx_mail_ssl_module支持
--without-mail_pop3_module 禁用pop3协议(POP3即邮局协议的第3个版本,它是规定个人计算机如何连接到互联网上的邮件服务器进行收发邮件的协议。是因特网电子邮件的第一个离线协议标 准,POP3协议允许用户从服务器上把邮件存储到本地主机上,同时根据客户端的操作删除或保存在邮件服务器上的邮件。POP3协议是TCP/IP协议族中的一员,主要用于 支持使用客户端远程管理在服务器上的电子邮件)
--without-mail_imap_module 禁用imap协议(一种邮件获取协议。它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。IMAP协议运行在TCP/IP协议之上, 使用的端口是143。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。)
--without-mail_smtp_module 禁用smtp协议(SMTP即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。)
--with-google_perftools_module 启用ngx_google_perftools_module支持(调试用,剖析程序性能瓶颈)
--with-cpp_test_module 启用ngx_cpp_test_module支持
--add-module= 启用外部模块支持
--with-cc= 指向C编译器路径
--with-cpp= 指向C预处理路径
--with-cc-opt= 设置C编译器参数(PCRE库,需要指定--with-cc-opt=”-I /usr/local/include”,如果使用select()函数则需要同时增加文件描述符数量,可以通过--with-cc- opt=”-D FD_SETSIZE=2048”指定。)
--with-ld-opt= 设置连接文件参数。(PCRE库,需要指定--with-ld-opt=”-L /usr/local/lib”。)
--with-cpu-opt= 指定编译的CPU,可用的值为: pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64
--without-pcre 禁用pcre库
--with-pcre 启用pcre库
--with-pcre= 指向pcre库文件目录
--with-pcre-opt= 在编译时为pcre库设置附加参数
--with-md5= 指向md5库文件目录(消息摘要算法第五版,用以提供消息的完整性保护)
--with-md5-opt= 在编译时为md5库设置附加参数
--with-md5-asm 使用md5汇编源
--with-sha1= 指向sha1库目录(数字签名算法,主要用于数字签名)
--with-sha1-opt= 在编译时为sha1库设置附加参数
--with-sha1-asm 使用sha1汇编源
--with-zlib= 指向zlib库目录
--with-zlib-opt= 在编译时为zlib设置附加参数
--with-zlib-asm= 为指定的CPU使用zlib汇编源进行优化,CPU类型为pentium, pentiumpro
--with-libatomic 为原子内存的更新操作的实现提供一个架构
--with-libatomic= 指向libatomic_ops安装目录
--with-openssl= 指向openssl安装目录
--with-openssl-opt 在编译时为openssl设置附加参数
--with-debug 启用debug日志

实例一:

./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-ipv6

实例二:

./configure --sbin-path=/usr/local/nginx/nginx \
--conf-path=/usr/local/nginx/nginx.conf \
--pid-path=/usr/local/nginx/nginx.pid \
--with-http_ssl_module \
--with-pcre=/usr/local/src/pcre-8.21 \
--with-zlib=/usr/local/src/zlib-1.2.8 \
--with-openssl=/usr/local/src/openssl-1.0.1c
make
make install

参考了万网,服务器Windows2008 IIS7.5可以做一下设置禁用脚本的执行方法--------需要禁止某个目录的脚本执行权限,您可以在要禁用脚本执行权限的目录建立一个web.config文件,里面加入下面的代码:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <handlers>
            <remove name="ASPClassic" />
            <remove name="PHP-FastCGI" />
            <remove name="ASPNET-ISAPI-1.1-AXD" />
            <remove name="ASPNET-ISAPI-1.1-HttpRemotingHandlerFactory-rem" />
            <remove name="ASPNET-ISAPI-1.1-HttpRemotingHandlerFactory-soap" />
            <remove name="ASPNET-ISAPI-1.1-PageHandlerFactory" />
            <remove name="ASPNET-ISAPI-1.1-SimpleHandlerFactory" />
            <remove name="ASPNET-ISAPI-1.1-WebServiceHandlerFactory" />
            <remove name="AssemblyResourceLoader-Integrated" />
            <remove name="AXD-ISAPI-2.0" />
            <remove name="AXD-ISAPI-2.0-64" />
            <remove name="HttpRemotingHandlerFactory-rem-Integrated" />
            <remove name="HttpRemotingHandlerFactory-rem-ISAPI-2.0" />
            <remove name="HttpRemotingHandlerFactory-rem-ISAPI-2.0-64" />
            <remove name="HttpRemotingHandlerFactory-soap-Integrated" />
            <remove name="HttpRemotingHandlerFactory-soap-ISAPI-2.0" />
            <remove name="HttpRemotingHandlerFactory-soap-ISAPI-2.0-64" />
            <remove name="PageHandlerFactory-Integrated" />
            <remove name="PageHandlerFactory-ISAPI-2.0" />
            <remove name="PageHandlerFactory-ISAPI-2.0-64" />
            <remove name="Perl-CGI" />
            <remove name="Perl-ISAPI" />
            <remove name="rules-64-ISAPI-2.0" />
            <remove name="rules-Integrated" />
            <remove name="rules-ISAPI-2.0" />
            <remove name="SecurityCertificate" />
            <remove name="SimpleHandlerFactory-Integrated" />
            <remove name="SimpleHandlerFactory-ISAPI-2.0" />
            <remove name="SimpleHandlerFactory-ISAPI-2.0-64" />
            <remove name="svc-Integrated" />
            <remove name="svc-ISAPI-2.0" />
            <remove name="svc-ISAPI-2.0-64" />
            <remove name="TraceHandler-Integrated" />
            <remove name="TRACEVerbHandler" />
            <remove name="WebAdminHandler-Integrated" />
            <remove name="WebServiceHandlerFactory-Integrated" />
            <remove name="WebServiceHandlerFactory-ISAPI-2.0" />
            <remove name="WebServiceHandlerFactory-ISAPI-2.0-64" />
            <remove name="xoml-64-ISAPI-2.0" />
            <remove name="xoml-Integrated" />
            <remove name="xoml-ISAPI-2.0" />
        </handlers>
    </system.webServer>
</configuration>

保存后就设置了该文件夹以及子容器只有读的权限,而没有脚本执行权限。如果要恢复脚本权限就直接删除该目录下的web.config文件。

最近浏览有关互联网的资讯多了,发现了一个不少人提到的问题,为什么网址结尾会加上反斜杠呢?又为什么我们在浏览器地址栏上打出一个网址(如我的主页piaoyun.cc),按回车后地址末尾会自动加上一个反斜杠(部分浏览器如chorme会自动隐藏网址末尾的反斜杠)。很诡异是吧!好了,进入正题,推广一下小知识。

在传统意义上说,网址末尾是没有反斜杠的。有没有反斜杠的意义在于该url是指向一个文件还是一个目录,例如:
http://piaoyun.cc/piaoyun 指向的是网站根目录下一个名为piaoyun的文件
http://piaoyun.cc/piaoyun/ 指向的是网站根目录下一个名为piaoyun的目录

于是在网址末尾加了反斜杠是能加快网站载入,因为网址末尾加了反斜杠会直接告知浏览器现在指向的是一个目录,浏览器就能直接读取该目录下如index或home等默认文件。而没有加上反斜杠时浏览器首先会尝试读取根目录下的一个文件,如果没有该文件再查找一个与该文件同名的目录,最后才读取目录下的默认文件。这样一来加上反斜杠就会加快网站加载速度。对于网站所在的服务器,网址没有加上反斜杠会给服务器增加一个查找是否有同名文件的过程,这明显会增加服务器的负担,当然这个影响并不会很大,但如果你的网站的直接流量很大,那么给url末尾加上反斜杠便能较大的减轻服务器的负担了。

当然给网址末尾加上反斜杠还有其他的好处:1.在seo方面考虑,习惯性的给自己网站的网址末尾加上反斜杠能避免重复内容。正如域名中是否带”www”的问题,url末尾是否有反斜杠也会造成重复内容的问题,这对于网站的seo无疑是不利的,要知道,重复内容绝对是seo的大忌。
2.因为服务器对url不能正确解析,有可能会出现404错误,习惯地给网址末尾加上反斜杠则可以避免这种情况。

总的来说给网址末尾加上反斜杠对对网站建设者是有很大好处的,这可以说是网站建设者应该养成的一个好习惯。当然,在交换友情链接时别忘了提醒一下对方,记得为你的网站url末尾加上反斜杠了。

为什么很多网站都是采用在网址的结尾后加上反斜杠,比如百度 sina都是这样的处理方法。为什么要给网址结尾加上反斜杠,这样做对于用户体验,以及速度优化有什么好处呢。

网站使用反斜杠和不使用反斜杠的区别不加斜杠指向的是网站根目录下一个名为的文件,加了斜杠指向的是网站根目录下一个名为的目录,也就是目录与文件的区别

 

首页网站使用反斜杠的好处使用斜杠能加快网站载入,原因是因为网址末尾加了反斜杠会直接告知浏览器现在指向的是一个目录,目录的话会直接读取index。或者home等默认文件。没有加上反斜杠时浏览器首先会尝试读取根目录下的一个文件,如果没有该文件再查找一个与该文件同名的目录,最后才读取目录下的默认文件。网址没有加上反斜杠会给服务器增加一个查找是否有同名文件的过程.

seo方面考虑
网站只存在带斜杠的模式,避免网站权重流失(和不带www和带www的概念相同)。同时有另外一种理解:有加了是一个文件夹 默认情况下应该是目录的权重大于网站页面权重

最后附上Apache开启自动将不同的url以301重定向至一个标准的url上的.htaccess代码(前提是你的服务器开启了mod_rewrite,至于IIS,就没有方便的方法去实现这个功能了):

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://piaoyun.cc/$1/ [L,R=301]

说明:
* RewriteCond %{REQUEST_FILENAME} !-f : 指定操作仅针对目录,对指向文件的url不进行rewrite操作;
* RewriteCond %{REQUEST_URI} !(.*)/$ :判断url是否以斜杠“/”结尾;
* RewriteRule ^(.*)$ http://piaoyun.cc/$1/ [L,R=301] : 自动将符合上述条件的url以301跳转重定向至以斜杠结尾的版本,比如说将“http://piaoyun.cc/piaoyun”重定向至 “http://piaoyun.cc/piaoyun/”,其中“L”指该行为规则的最后一行,而“R=301”则指明采用301 Redirect。当然,您在使用时应将“http://piaoyun.cc/”替换成自己网站的url。

当然我的网站并没有对于该使用目录的时候使用目录,当时是处于扁平状网站布局考虑而有所失误。而现在想要修改对于网站结构变动较大而不是很现实所以还是以后考虑进一步修改。

getYear()

使用getYear()函数的本意是获取年份,以2014年为例,如:

var date = new Date();
var year = date.getYear();

在IE中是可以正确获取年份:2014,但是在FF等浏览器下则为:114。
原因则是 在 Firefox等浏览器内 getYear 返回的是 "当前年份-1900"的值(年份基数是1900)
而IE则是 当today的年份大于等于2000的时,直接将1900加上了,返回的2014。

getFullYear()

getFullYear()方法返回的是四位数的年份,各浏览器返回的结果都一样都是2014.没有争议。

getUTCFullYear()

getUTCFullYear() 方法可返回根据世界时 (UTC) 表示的年份的四位数字。返回 dateObject 用世界时表示时的年份,该值是一个四位的整数,而不是两位数的缩写。

var date = new Date();
var year = date.getUTCFullYear()

执行上面的js脚本,year的值也是2014.

借助Windows系统自带的一个命令XCOPY,我们可以轻易地通过命令提示符窗口或用记事本,实现在窗口环境下菜单命令不便实现的文件复制或备份功能。

按类备份文件时,有时会涉及到不同文件夹中的不同文件根据某种条件备份的问题,如果涉及到连同文件夹结构也一同备份,这种情况下,我们往往需要借助于一些专用的备份工具来实现,设置起来也比较繁琐。实际上,无论是低版本的Windows XP操作系统,还是更高级的Windows 7、Windows 8系统,均提供一个强大的XCOPY命令程序,借助于这个命令,我们只需用命令提示符窗口直接输入一行命令,或用记事本写一句简单的BAT代码执行一下,就可以随心所欲地进行自己的文件备份,较之用窗口操作要效率高得多。

一、Xcopy参数介绍

命令格式:XCOPY source [destination] 一堆可选的参数

参数介绍:

source 指定要复制的文件。
destination 指定新文件的位置和/或名称。
/A 只复制有存档属性集的文件, 但不改变属性。
/M 只复制有存档属性集的文件, 并关闭存档属性。
/D:m-d-y 复制在指定日期或指定日期以后改变的文件。如果没有提供日期,只复制那些源时间比目标时间新的文件。
/EXCLUDE:file1[+file2][+file3]...
指定含有字符串的文件列表。如果有任何字符串与要被复制的文件的绝对路径相符,那个文件将不会得到复制。
例如,指定如 \obj\ 或 .obj 的字符串会排除目录 obj 下面的所有文件或带有 .obj 扩展名的文件。
/P 创建每个目标文件前提示。
/S 复制目录和子目录,除了空的。
/E 复制目录和子目录,包括空的。 与 /S /E 相同。可以用来修改 /T。
/V 验证每个新文件。
/W 提示您在复制前按键。
/C 即使有错误,也继续复制。
/I 如果目标不存在,又在复制一个以上的文件, 则假定目标一定是一个目录。
/Q 复制时不显示文件名。
/F 复制时显示完整的源和目标文件名。
/L 显示要复制的文件。
/G 允许将没有经过加密的文件复制到不支持加密的目标。
/H 也复制隐藏和系统文件。
/R 改写只读文件。
/T 创建目录结构,但不复制文件。不包括空目录或子目录。/T /E 包括空目录和子目录。
/U 只复制已经存在于目标中的文件。
/K 复制属性。一般的 Xcopy 会重设只读属性。
/N 用生成的短名复制。
/O 复制文件所有权和 ACL 信息。
/X 复制文件审核设置(隐含 /O)。
/Y 禁止提示以确认改写一个现存目标文件。
/-Y 导致提示以确认改写一个现存目标文件。
/Z 用重新启动模式复制网络文件。

二、Xcopy命令实例介绍

案例一:用好XCOPY的排除备份

XCOPY可以排除不想要的文件或文件夹进行复制。不过这个命令用起来并不像Windows帮助里写的那么简单。我们先看看XCOPY的帮助是怎么写的:

/EXCLUDE:file1[+file2][+file3]...

指定含有字符串的文件列表。每一个字符串必须在文件的单独行中。如果有任何字符串与要被复制的文件的绝对路径相符,那个文件将不会得到复制。

例如,指定如 \obj\ 或 .obj 的字符串会排除目录 obj 下面的所有文件或带有.obj 扩展名的文件。

看了这个帮助甚至它举的例子,你会用了吗?我相信你也仍然是一头雾水!没关系!下面就让我们来通过具体案例来作说明。

我们假设有两个文件夹,一个名为DATA,存放了如下表所示的文件夹或文件。一个名为BACKUP,是用作备份筛选结果的目标文件夹。

Z:.

├─DATA

│ ├─计划

│ └─总结

│ └─piaoyuncc

│ └─piaoyuncc1

│ 计划.TXT

│ 总结.TXT

│ piaoyuncc.php

│ 1.计划

│ 2.总结

│ 3.计划

│ 4.总结

│ 5.总结

└─BACKUP

假设我们的备份目标就是把凡是标记了“总结”的文件夹和文件拷贝到BACKUP这个目录里面,而排除标记了“计划”的文件和目录。

我们只需执行如下命令即可达到目的:

XCOPY /E /S /H /EXCLUDE:UNCOPY.TXT Z:\DATA Z:\BACKUP

其中的文本列表文件UNCOPY.TXT里面,要包含我们想要排除的文件以及文件夹,这个文件需要我们另行编好保存,具体内容如下:

\piaoyuncc
\飘云\
飘云.TXT
.飘云

注意:上面的\piaoyuncc这个不要结尾的 \ 代表可以排除多个piaoyuncc文件夹,例如:piaoyuncc1  piaoyuncc2 都可以同时排除

本例的用法还有一个很实用的应用场合:比如你硬盘上有文件损坏了,你又想备份硬盘,可以使用这个方法避开损坏的文件。

案例二:快速备份某一类文件

XCOPY *.PDF /S E:\MYPDFBAK

随后,当前驱动器(或文件夹)以及其下各级子文件夹下面的PDF类型文件均被复制到E盘的MYDOCBAK文件夹中了,而且保持原来的目录结构。
其中,参数/S的意思是在复制指定类型文件时包含本级目录和各级子目录(空目录除外)。
小提示:以上是复制一类文件的命令,如果希望迁移一批文件,而不是复制文件,那么只需在记事本中使用迁移文件命令MOVE就可以了。

案例三:按文件名中的关键词备份

XCOPY F:\2014物资总目\*材料*.* F:\材料 /S

存盘之后,将文件的扩展名改为BAT,得到“备份.BAT”文件,双击该文件,在“F:\材料”目录中便自动生成了所有材料类的文件。
说明:以上命令中“*材料*.*”是采用通配符来描述所有含有“材料”字样的文件,不管“材料”字样出现在文件名的什么位置。

案例四:给系统重要文件留个备份

XCOPY C:\*.DLL /S /H E:\SYSFILEBAK

命令行中的参数/H表示复制具有隐藏属性的文件,同时也复制系统属性的文件。/S表示包含系统的各级子目录。*.DLL表示对C盘的所有文件进行过滤筛选。
将该批处理文件拷贝到C盘的根目录中并执行以下,最后我们就会在E:\SYSFILEBAK文件夹中获得所有这些重要文件的备份了。

案例五:随时自动续传大量文件

很简单,在命令提示符下,执行XCOPY E:\*.* F: /S /H /D /Y 命令即可。它能查出哪些文件是已经复制过去的,跳过复制;同时查出哪些文件还没有复制过去,立即进行复制。其中起作用的一个主要参数/D:m-d-y的意义是,复制在指定日期或指定日期以后更改的文件。如果没有提供日期,只复制那些源时间比目标时间新的文件。

案例六:自动跳过复制错误提示

还有一种备份的情况,我们经常也碰到的:不管是用窗口复制还是在命令提示符下操作,在复制过程中,因为复制某个文件出错或者这个文件在使用中,而停止了复制工作,如果我们这时不在电脑旁边,那么复制工作暂停并将一直等下去,直到我们人为干预。
如果我们事先想到这一情况,想让复制过程自动跳过某个出错的文件和某个正在使用中的文件而继续复制其他文件,可用下面的方法。
具体办法就是在XCOPY命令中加入参数 /C一个,也就是将命令行变成XCOPY E:\*.* D: /S /H /D /C /Y 就行了。参数/C的作用就是,即使有错,也继续复制。

案例七:复制完毕自动关掉电脑

如果备份复制工作量很大,需要耗费很多时间,这时又正好到了下班时间,怎么办?需要加班等待吗?不用!我们可以用一个简单的批处理让XCOPY备份的过程变为自动复制,并且复制完成后关闭电脑。

新建文本文档,输入如下命令,然后更名为XCOPY.BAT

XCOPY E:\*.* D: /S /H /C /Y
SHUTDOWN -S

需要备份时,双击XCOPY.BAT运行它,你这时候可以出去玩或下班了。电脑会自己复制备份完成文件然后自动关机。
可以看出,这里是应用了SHUTDOWN -S命令和XCOPY命令联合使用的一个技巧来完成备份和自动关机操作的。

案例八:本机复制文件或文件夹的实例

Xcopy d:\UpdateFiles e:\123 /s /e /y

命令解释:将D盘的UpdateFiles文件夹中包含的所有东西,全部复制到E盘的123文件夹内;/s /e /y 参数说明:在复制文件的同时也复制空目录或子目录,如果目标路径已经有相同文件了,使用覆盖方式而不进行提示。

案例九:在局域网中的应用实例

Xcopy \\192.168.0.168\UpdateFiles e:\123 /s /e /y

命令解释:将192.168.0.168这台计算机的名称为UpdateFiles的文件夹内的所有东西,全部复制到本机的e:\123 文件夹;参数说明:在复制文件的同时也复制空目录或子目录,如果目标路径已经有相同文件了,使用覆盖方式而不进行提示。

对于一些访问没有明显错误提示的php页面,我们可以通过error_log来做进一步的判定。但出于种种原因,有些服务器并没有开启PHP的error_log功能。可以暂时开一下:

编辑php.ini,将log_errors设置为on:
log_errors = On
然后重启apache即可。

如成功开启,就可以跟踪到对应的错误提示:
[Mon Sep 24 16:57:01 2012] [error] [client 218.5.80.210] PHP Warning: fsockopen() has been disabled for security reasons in /home/piaoyun.cc/fsockopen.php on line 2
[Mon Sep 24 16:57:02 2012] [error] [client 218.5.80.210] PHP Warning: fsockopen() has been disabled for security reasons in /home/piaoyun.cc/fsockopen.php on line 2
[Mon Sep 24 16:57:03 2012] [error] [client 218.5.80.210] PHP Warning: fsockopen() has been disabled for security reasons in /home/piaoyun.cc/fsockopen.php on line 2
[Mon Sep 24 16:57:04 2012] [error] [client 218.5.80.210] PHP Warning: fsockopen() has been disabled for security reasons in /home/piaoyun.cc/fsockopen.php on line

如果是Windows环境,除了将log_errors设置为on外,还需要定义error_log的路径及文件名:
error_log = d:/temp/error.log
(此目录需要授予php标识用户的修改权限,否则日志文件无法生成)
因为IIS没有error_log的概念,需要另外定义。

032

应用程序“PIAOYUN.CC”中的服务器错误
Internet Information Services 7.5

错误摘要
HTTP 错误 500.0 - Internal Server Error
FastCGI 进程最近常常失败。请过一会再尝试此请求

详细错误信息
模块 FastCgiModule
通知 ExecuteRequestHandler
处理程序 PHP for FastCgi
错误代码 0x80004005

请求的 URL http://piaoyun.cc:80/index.php
物理路径 D:\wwwroot\piaoyun.cc\index.php
登录方法 匿名
登录用户 匿名

解决办法:
修改FastCGI参数配置,将每分钟快速故障数设置为0即可解决该问题。

 

服务器环境为:windows2008+IIS7.5+PHP5

一、Discuz!和Ucenter后台不能登陆(登录自动退出)

康盛的Discuz和Ucenter经常有人反应后台没法登录或登陆后自动退出的问题,实在很让人蛋疼,有时候出现验证码CCCC问题然后提示验证码出错。

Discuz比较好解决,把config.inc.php里面的chekip关掉就可以登陆了,

$admincp['checkip'] = 0; // 后台管理操作是否验证管理员的 IP, 1=是[安全], 0=否。仅在管理员无法登陆后台时设置 0。
$admincp['tpledit'] = 0; // 是否允许在线编辑论坛模板 1=是 0=否[安全]
$admincp['runquery'] = 1; // 是否允许后台运行 SQL 语句 1=是 0=否[安全]
$admincp['dbimport'] = 1; // 是否允许后台恢复论坛数据 1=是 0=否[安全]
$admincp['checkip'] = 0; // 后台管理操作是否验证管理员的 IP, 1=是[安全], 0=否。仅在管理员无法登陆后台时设置 0。
$admincp['tpledit'] = 0; // 是否允许在线编辑论坛模板 1=是 0=否[安全] $admincp['runquery'] = 1; // 是否允许后台运行 SQL 语句 1=是 0=否[安全]
$admincp['dbimport'] = 1; // 是否允许后台恢复论坛数据 1=是 0=否[安全]

二、Ucenter后台不能登陆(登录自动退出)

但是UCenter却不能用这种方法解决, 谷歌了很久,官方论坛也没有解决方法, 只好自己动手了。 通过测试发现因为我本地是双宽带的原因,每次访问刷新,IP就会变一次,动态IP引起了这个问题。 只好用COOKIE解决了这个问题。 现在可以正常登陆了。
通过这个代码检查数据,然后把COOKIE的在线IP借过来用了。修改以后问题解决了。 试试吧。
根据目录找到文件: UCenter的 model/base.php
查找:

$this->onlineip = $match[0] ? $match[0] : 'unknown';

在这代码之后插入一段代码:

//COOKIE <=> onlineIP : 2014年12月10日 piaoyun.cc
$isonlineIP = isset($_COOKIE['onlineipd']) && !empty($_COOKIE['onlineipd']);
if($isonlineIP){
$this->onlineip = $_COOKIE['onlineipd'];
}else{
setcookie("onlineipd", $this->onlineip, time()+3600, "/");
}
unset($isonlineIP);

保存后上传覆盖问题就解决了。

三、UCenter后台应用通知列表空白的解决办法

今天遇到了一个奇葩的问题UCenter后台通知列表空白并且500,通过xdebug调试发现是

uc_server/control/admin/note.php 第68行代码有问题!IDE都报错了

原代码:

$this->_format_notlist(&$notelist);

修改为:

$this->_format_notlist($notelist);

去掉&就好了。

php没有取地址这个说法, 只有引用的时候才会使用 &

由于 libuv 版本的 SS 不稳定,并且安装步骤繁琐,因此推荐安装 libev 版本。安装参考如下

1、Shadowsocks 是什么

Shadowsocks 是一种安全的 socks5 代理,可以保护你的上网流量。基于多种加密方式,推荐使用 aes-256-cfb 加密。安装和使用需要本地端和服务端。
本地客户端已经包含了多种版本,包括iOS,Android,Windows,MAC,甚至是路由器 (基于OpenWRT),所以使用方便,各取所需。
远程服务端则一般安装在基于 Linux 的各种发行版操作系统,比如 Debian, CentOS, Fedora, Redhat, Ubuntu, openSUSE等。

2、Shadowsocks 的作者是谁

最初只有 Python 版,由 @clowwindy 开发和维护,后来随着知名度提高,开始出现各种语言的版本,其中比较知名的是 libev , go, nodejs 等版本,需要注意的是,nodejs 的作者也是 @clowwindy,但最近已不再维护该版本。libev 的维护者是 @madeye,长期更新。

3、Shadowsocks 一键安装脚本

虽然作者的安装教程已经很完备了,但还是有不少人不会安装和使用,因此我编写了 Shadowsocks 一键安装脚本,主要基于 CentOS 系统下的一键安装(也有 Debian 系统),分别有 Python, libev, nodejs 版,个人推荐使用 Python 和 libev 版。
该脚本会自动下载,编译安装最新版的 Shadowsocks,并且可以完全卸载 Shadowsocks ,自动生成配置文件,安装完成即可使用。

4、Shadowsocks 如何升级

安装完 Shadowsocks,一段时间后,作者已经更新了版本(修正 bug 或升级功能),那么如何一键升级到最新版呢?
Python 版,执行命令: pip install -U shadowsocks ,命令执行成功后,重新启动 Shadowsocks ,命令: service shadowsocks restart
libev 版,先卸载旧版本,执行命令:./shadowsocks-libev.sh uninstall ,再安装新版本,执行命令: ./shadowsocks-libev.sh 安装
Debian 下的 libev 版,升级方式同上。
nodejs 版,也是先卸载再重新安装,因为作者已经不更新,所以不推荐用这版本。

5、Shadowsocks 安装失败怎么办

由于 CentOS 5.x 的默认 gcc 版本过低,在编译 libev 版时会出错;同时默认 Python 的版本也过低,所以也无法安装 Python 版的。因此,请确保安装的环境为 CentOS 6.x 或 CentOS 7.x 。
更多其他错误,请根据实际错误提示,自行在 google 上搜索关键字。

6、Shadowsocks 的客户端程序

大多数人都是在 Windows 下使用电脑,因此最好用的 Windows 客户端是 shadowsocks-gui,下载最新版后解压即可使用。
shadowsocks-gui客户端下载地址:https://sourceforge.net/projects/shadowsocksgui/files/dist/

7、Shadowsocks 本地代理上网

本地电脑启动客户端,连接上远程服务端后,即在本地开启了 socks5 代理,本地端口号默认为 1080,如果提示被占用,也可以改为其他端口号。在浏览器中安装插件,Chrome 下是 SwitchySharp, Firefox 下是 AutoProxy,新建配置文件,SOCKS Host 填 127.0.0.1,Port 填 1080(默认,跟 Shadowsocks 客户端的本地端口号一致即可)

参考链接:
1、http://shadowsocks.org/en/index.html
2、https://github.com/clowwindy/shadowsocks
3、https://github.com/madeye/shadowsocks-libev

以下的一键安装脚本来源于网络:秋水逸冰的博客!【博主在搬瓦工的MICRO64型号VPS运行安装通过了】

CentOS下shadowsocks-libev一键安装脚本

搬瓦工Micro-64型号配置,博主是在某宝上面淘到的。价格是每年的。

Self-managed
HDD: 1.5 GB
RAM: 64 MB
CPU: 1x Intel Xeon
BW: 100 GB/mo

本脚本适用环境:
系统支持:CentOS 6.x 32或64位
内存要求:≥128M
日期:2014年07月12日

关于本脚本:
一键安装 libev 版的 shadowsocks 最新版本。该版本的特点是内存占用小(600k左右),低 CPU 消耗,甚至可以安装在基于 OpenWRT 的路由器上。

默认配置:
服务器端口:8989
客户端端口:1080
密码:自己设定(如不设定,默认为teddysun.com)

客户端下载:
http://sourceforge.net/projects/shadowsocksgui/files/dist/

使用方法:
使用root用户登录,运行以下命令:

wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev.sh
chmod +x shadowsocks-libev.sh
./shadowsocks-libev.sh 2>&1 | tee shadowsocks-libev.log

安装完成后,脚本提示如下:

Congratulations, shadowsocks-libev install completed!
Your Server IP:your_server_ip
Your Server Port:8989
Your Password:your_password
Your Local IP:127.0.0.1
Your Local Port:1080
Your Encryption Method:aes-256-cfb

Welcome to visit:http://teddysun.com/357.html
Enjoy it!

卸载方法:
使用 root 用户登录,运行以下命令:

./shadowsocks-libev.sh uninstall

其他事项:
安装完成后即已后台启动 shadowsocks ,运行:

ps -ef | grep ss-server | grep -v ps | grep -v grep

可以查看进程是否存在。
本脚本安装完成后,会将 shadowsocks-libev 加入开机自启动。

使用命令:
启动:/etc/init.d/shadowsocks start
停止:/etc/init.d/shadowsocks stop
重启:/etc/init.d/shadowsocks restart
查看状态:/etc/init.d/shadowsocks status

更多版本 shadowsocks 安装:
CentOS 下 shadowsocks-python 一键安装脚本
CentOS 下 shadowsocks-nodejs 一键安装脚本
Debian 下 shadowsocks-libev 一键安装脚本

特别说明:
1、已安装旧版本的 shadowsocks 需要升级的话,需下载本脚本的最新版,运行卸载命令./shadowsocks-libev.sh uninstall 后,再次执行本脚本即可安装最新版。
2、关于 CentOS 的默认 iptables 防火墙规则 icmp-host-prohibited ,如果安装之后发现已经启动 shadowsocks,本地客户端却不能连接上,请检查 iptables 是不是有如下的一条规则:

REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

运行命令:

/etc/init.d/iptables status

可以查看。如果有这条规则,则添加的 8989 端口需手动更改一下,放到这条规则的上一行。编辑 /etc/sysconfig/iptables 文件,将:

-A INPUT -p tcp -m state --state NEW -m tcp --dport 8989 -j ACCEPT

放在:

-A INPUT -j REJECT --reject-with icmp-host-prohibited

的前面。最终效果如下:

-A INPUT -p tcp -m state --state NEW -m tcp --dport 8989 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited

编辑完后,重启 iptables 防火墙。命令:/etc/init.d/iptables restart

秋水逸冰博主的CentOS下shadowsocks-libev一键安装脚本内容:

#! /bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
#===============================================================================================
#   System Required:  CentOS6.x (32bit/64bit)
#   Description:  Install Shadowsocks(libev) for CentOS
#   Author: Teddysun <i@teddysun.com>
#   Intro:  http://teddysun.com/357.html
#===============================================================================================

clear
echo "#############################################################"
echo "# Install Shadowsocks(libev) for CentOS6.x (32bit/64bit)"
echo "# Intro: http://teddysun.com/357.html"
echo "#"
echo "# Author: Teddysun <i@teddysun.com>"
echo "#"
echo "#############################################################"
echo ""

# Install Shadowsocks-libev
function install_shadowsocks_libev(){
    rootness
    disable_selinux
    pre_install
    download_files
    config_shadowsocks
    iptables_set
    install
}

# Make sure only root can run our script
function rootness(){
if [[ $EUID -ne 0 ]]; then
   echo "Error:This script must be run as root!" 1>&2
   exit 1
fi
}

# Disable selinux
function disable_selinux(){
if [ -s /etc/selinux/config ] && grep 'SELINUX=enforcing' /etc/selinux/config; then
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
    setenforce 0
fi
}

# Pre-installation settings
function pre_install(){
    #Set shadowsocks-libev config password
    echo "Please input password for shadowsocks-libev:"
    read -p "(Default password: teddysun.com):" shadowsockspwd
    if [ "$shadowsockspwd" = "" ]; then
        shadowsockspwd="teddysun.com"
    fi
    echo "password:$shadowsockspwd"
    echo "####################################"
    get_char(){
        SAVEDSTTY=`stty -g`
        stty -echo
        stty cbreak
        dd if=/dev/tty bs=1 count=1 2> /dev/null
        stty -raw
        stty echo
        stty $SAVEDSTTY
    }
    echo ""
    echo "Press any key to start...or Press Ctrl+C to cancel"
    char=`get_char`
    #Install necessary dependencies
    yum install -y wget unzip openssl-devel gcc swig python python-devel python-setuptools autoconf libtool libevent
    yum install -y automake make curl curl-devel zlib-devel openssl-devel perl perl-devel cpio expat-devel gettext-devel
    # Get IP address
    echo "Getting Public IP address, Please wait a moment..."
    IP=`curl -s checkip.dyndns.com | cut -d' ' -f 6  | cut -d'<' -f 1`
    if [ -z $IP ]; then
        IP=`curl -s ifconfig.me/ip`
    fi
    #Current folder
    cur_dir=`pwd`
    cd $cur_dir
}

# Download latest shadowsocks-libev
function download_files(){
    if [ -f shadowsocks-libev.zip ];then
        echo "shadowsocks-libev.zip [found]"
    else
        if ! wget --no-check-certificate https://github.com/madeye/shadowsocks-libev/archive/master.zip -O shadowsocks-libev.zip;then
            echo "Failed to download shadowsocks-libev.zip"
            exit 1
        fi
    fi
    unzip shadowsocks-libev.zip
    if [ $? -eq 0 ];then
        cd $cur_dir/shadowsocks-libev-master/
    else
        echo ""
        echo "Unzip shadowsocks-libev failed! Please visit http://teddysun.com/357.html and contact."
        exit 1
    fi
    # Download start script
    if ! wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev; then
        echo "Failed to download shadowsocks-libev start script!"
        exit 1
    fi
}

# Config shadowsocks
function config_shadowsocks(){
    if [ ! -d /etc/shadowsocks-libev ];then
        mkdir /etc/shadowsocks-libev
    fi
    cat > /etc/shadowsocks-libev/config.json<<-EOF
{
    "server":"${IP}",
    "server_port":8989,
    "local_address":"127.0.0.1",
    "local_port":1080,
    "password":"${shadowsockspwd}",
    "timeout":600,
    "method":"aes-256-cfb"
}
EOF
}

# iptables set
function iptables_set(){
    /sbin/service iptables status 1>/dev/null 2>&1
    if [ $? -eq 0 ]; then
        /etc/init.d/iptables status | grep '8989' | grep 'ACCEPT' >/dev/null 2>&1
        if [ $? -ne 0 ]; then
            /sbin/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 8989 -j ACCEPT
            /etc/init.d/iptables save
            /etc/init.d/iptables restart
        fi
    fi
}


# Install 
function install(){
    # Build and Install shadowsocks-libev
    if [ -s /usr/local/bin/ss-server ];then
        echo "shadowsocks-libev has been installed!"
        exit 0
    else
        ./configure
        make && make install
        if [ $? -eq 0 ]; then
            mv $cur_dir/shadowsocks-libev-master/shadowsocks-libev /etc/init.d/shadowsocks
            chmod +x /etc/init.d/shadowsocks
            # Add run on system start up
            chkconfig --add shadowsocks
            chkconfig shadowsocks on
            # Start shadowsocks
            /etc/init.d/shadowsocks start
            if [ $? -eq 0 ]; then
                echo "Shadowsocks-libev start success!"
            else
                echo "Shadowsocks-libev start failure!"
            fi
        else
            echo ""
            echo "Shadowsocks-libev install failed! Please visit http://teddysun.com/357.html and contact."
            exit 1
        fi
    fi
    cd $cur_dir
    # Delete shadowsocks-libev floder
    rm -rf $cur_dir/shadowsocks-libev-master/
    # Delete shadowsocks-libev zip file
    rm -f shadowsocks-libev.zip
    clear
    echo ""
    echo "Congratulations, shadowsocks-libev install completed!"
    echo -e "Your Server IP: \033[41;37m ${IP} \033[0m"
    echo -e "Your Server Port: \033[41;37m 8989 \033[0m"
    echo -e "Your Password: \033[41;37m ${shadowsockspwd} \033[0m"
    echo -e "Your Local IP: \033[41;37m 127.0.0.1 \033[0m"
    echo -e "Your Local Port: \033[41;37m 1080 \033[0m"
    echo -e "Your Encryption Method: \033[41;37m aes-256-cfb \033[0m"
    echo ""
    echo "Welcome to visit:http://teddysun.com/357.html"
    echo "Enjoy it!"
    echo ""
}

# Uninstall Shadowsocks-libev
function uninstall_shadowsocks_libev(){
    printf "Are you sure uninstall shadowsocks_libev? (y/n) "
    printf "\n"
    read -p "(Default: n):" answer
    if [ -z $answer ]; then
        answer="n"
    fi
    if [ "$answer" = "y" ]; then
        ps -ef | grep -v grep | grep -v ps | grep -i "ss-server" > /dev/null 2>&1
        if [ $? -eq 0 ]; then
            /etc/init.d/shadowsocks stop
        fi
        chkconfig --del shadowsocks
        # delete config file
        rm -rf /etc/shadowsocks-libev
        # delete shadowsocks
        rm -f /usr/local/bin/ss-local
        rm -f /usr/local/bin/ss-tunnel
        rm -f /usr/local/bin/ss-server
        rm -f /usr/local/bin/ss-redir
        rm -f /usr/local/share/man/man8/shadowsocks.8
        rm -f /etc/init.d/shadowsocks
        echo "Shadowsocks-libev uninstall success!"
    else
        echo "uninstall cancelled, Nothing to do"
    fi
}

# Initialization step
action=$1
[  -z $1 ] && action=install
case "$action" in
install)
    install_shadowsocks_libev
    ;;
uninstall)
    uninstall_shadowsocks_libev
    ;;
*)
    echo "Arguments error! [${action} ]"
    echo "Usage: `basename $0` {install|uninstall}"
    ;;
esac

Shadowsocks一键安装包(Debian/Ubuntu适用)脚本内容[脚本内容来源于网络]:

#!/bin/bash

if [ $(id -u) != "0" ]; then
    echo "Error: You must be root to run this script"
    exit 1
fi

ssport=443
echo -e "Shadowsocks server port(Default 443)>>\c"
read ssport
echo "===========shadowsocks port is $ssport============"

sspasswd=5y2n
echo -e "Shadowsocks server password(Default 5y2d)>>\c"
read sspasswd
echo "=========shadowsocks password is $sspasswd========"

ssmethod=rc4-md5
echo -e "Shadowsocks server encrypte method"
echo -e "Allow: rc4-md5(Default),aes-128,aes-256>>\c"
read ssmethod
echo "=====shadowsocks encrypte method is $ssmethod====="

apt-get -y update
apt-get -y install git &&
mkdir /tmp/shadowsocks &&
cd /tmp/shadowsocks &&
git clone https://github.com/madeye/shadowsocks-libev.git
cd shadowsocks-libev
apt-get -y install build-essential autoconf libtool libssl-dev gawk debhelper
dpkg-buildpackage
cd ..
dpkg -i shadowsocks*.deb
cd ../.. && rm -rf shadowsocks

sed -i 's/"server":"\<.*\>"/"server":"0.0.0.0"/g' /etc/shadowsocks/config.json
var1=\"server_port\":\\\<.*\\\>
var2=\"server_port\":$ssport
sed -i "s/$var1/$var2/g" /etc/shadowsocks/config.json
var1=\"password\":\"\\\<.*\\\>\"
var2=\"password\":\"$sspasswd\"
sed -i "s/$var1/$var2/g" /etc/shadowsocks/config.json
var1=\"method\":\"\\\<.*\\\>\"
var2=\"method\":\"$ssmethod\"
sed -i "s/$var1/$var2/g" /etc/shadowsocks/config.json

service shadowsocks restart &&

echo "==========================================================="
echo "="
echo "=   Your shadowsocks server install complete! "
echo "=   Congfig file: /etc/shadowsocks/config.json"
echo "=   Control: service shadowsocks {start|stop|restart}"
echo "="
echo "==========================================================="

通过以下红色部分的栏目id来控制显示哪些栏目,id根据实际情况后台查询,subcat函数看最后附件解释,以下修改代码:

V9显示哪些栏目的方法

{loop subcat(6,0,0,$siteid) $r}
  {if $r['catid']==1||$r['catid']==2 } //显示哪些栏目        {php $num++}
        <div class="box cat-area" {if $num%2!=0}style=" margin-right:10px"{/if}>
          <h5 class="title-1">{$r}<a href="{$r}" class="more">更多>></a></h5>
             <div class="content">
             {pc:content  action="lists" catid="$r" order="updatetime DESC" thumb="1" num="1" return="info"}
             {loop $info $v}
              <p>
               <img src="{thumb($v,90,0)}" width="90" height="60"/>
                    <strong><a   target="_blank" title="{$v['title']}"{title_style($v)}>{str_cut($v['title'],28)}</a></strong><br />{str_cut($v['description'],100)}
                </p>
              {/loop}
              {/pc}               
                <div class="bk15 hr"></div>
                {pc:content action="lists" catid="$r" num="5" order="id DESC" return="info"}
                <ul class="list lh24 f14">
                {loop $info $v}
                 <li>·<a href="{$v['url']}" target="_blank" title="{$v['title']}"{title_style($v)}>{str_cut($v['title'],40)}</a></li>
                {/loop}
                </ul>
                {/pc}
            </div>
        </div>
        {if $num%2==0}<div class="bk10"></div>{/if}
  {/if}  {/loop}

phpcms V9排除某个栏目的方法

{loop subcat(6,0,0,$siteid) $r}
          {if $r['catid']==3 }<?php continue; ?>{/if} //排除某个栏目          {php $num++}
        <div class="box cat-area" {if $num%2!=0}style=" margin-right:10px"{/if}>
          <h5 class="title-1">{$r}<a href="{$r}" class="more">更多>></a></h5>
             <div class="content">
             {pc:content  action="lists" catid="$r" order="updatetime DESC" thumb="1" num="1" return="info"}
             {loop $info $v}
              <p>
               <img src="{thumb($v,90,0)}" width="90" height="60"/>
                    <strong><a   target="_blank" title="{$v['title']}"{title_style($v)}>{str_cut($v['title'],28)}</a></strong><br />{str_cut($v['description'],100)}
                </p>
              {/loop}
              {/pc}               
                <div class="bk15 hr"></div>
                {pc:content action="lists" catid="$r" num="5" order="id DESC" return="info"}
                <ul class="list lh24 f14">
                {loop $info $v}
                 <li>·<a href="{$v['url']}" target="_blank" title="{$v['title']}"{title_style($v)}>{str_cut($v['title'],40)}</a></li>
                {/loop}
                </ul>
                {/pc}
            </div>
        </div>
        {if $num%2==0}<div class="bk10"></div>{/if}
  {/loop}

{loop subcat(0,0,0,$siteid) $r}{/loop}函数解释:

{loop subcat(0,0,0,$siteid) $r}{/loop}
/**
* 获取子栏目 
* @param $parentid 父级id  
* @param $type 栏目类型 1为单网页类型,0为栏目类型;(查看phpcms的mysql数据库可以看到)
* @param $self 是否包含本身 0为不包含 
* @param $siteid 站点id 
*/ 
function subcat($parentid = NULL, $type = NULL,$self = '0', $siteid = '') { 
        if (empty($siteid)) $siteid = get_siteid(); 
        $category = getcache('category_content_'.$siteid,'commons'); 
        foreach($category as $id=>$cat) { 
                if($cat['siteid'] == $siteid && ($parentid === NULL || $cat['parentid'] == $parentid) && ($type === NULL || $cat['type'] == $type)) $subcat[$id] = $cat; 
                if($self == 1 && $cat['catid'] == $parentid && !$cat['child'])  $subcat[$id] = $cat; 
        } 
        return $subcat; 
}

表示在分类ID=50以内的栏目终止循环

{loop subcat(0,0,0,$siteid) $r}
{php $num++}
{php if($r['catid']==50)break;}
...
{/loop}

表示遇到栏目分类ID9、10、11、12、13、14时,跳出循环,也就是隐藏指定分类ID

{loop subcat(0,0,0,$siteid) $r}
{php $num++}
{php if($r['catid']==9 || $r['catid']==10 || $r['catid']==11 || $r['catid']==12 || $r['catid']==13 || $r['catid']==14)continue;}
...
{/loop}

修改实现方法:PHPCMS V9 自定义栏目伪静态实现方法

栏目页伪静态(不生成HTML)时,URL规则中{$categorydir}{$catdir}仍显示为{$categorydir}{$catdir}解决方法。

第一步:打开phpcms\modules\content\classes\url.class.php;

第二步:将122行

$url = str_replace(array('{$catid}', '{$page}'), array($catid, $page), $urlrule);

替换为

$category_dir = $this->get_categorydir($catid);
$url = str_replace(array('{$catid}', '{$page}','{$catdir}','{$categorydir}'), array($catid, $page,$category['catdir'],$category_dir), $urlrule);

第三步:保存
使用须知:
1.更改前请先备份原文件;官方升级如果升级此文件,需要再次修改;
2.{$categorydir}后默认有'/',{$catdir}后默认无 '/'

3.案例:

URL示例:guolei/index.html|guolei/list-2.html
URL规则:{$catdir}/index.html|{$catdir}/list-{$page}.html

伪静态规则:

RewriteRule ^guonei(/|/index.html)$ index.php?m=content&c=index&a=lists&catid=6
RewriteRule ^guonei/list-([0-9]+).html$ index.php?m=content&c=index&a=lists&catid=6&page=$1

4.如有不足之处,请在下方回复说明。

phpcmsV9栏目伪静态的修改方法(支持自定义目录名),官方程序默认伪静态是不支持自定义栏目名的,所以今天就做了以下修改,让其支持!

首先看urlrewrite的规则,这个是Apache下的,其它环境下的规则自己转换下

RewriteRule ^(.*)(.*)/$ /index.php?m=content&c=index&a=lists&catdir=$1
RewriteRule ^(.*)(.*)/index([0-9]+).html$ /index.php?m=content&c=index&a=lists&categorydir=$1&catdir=$2&page=$3

1、打开phpcms\modules\content目录下的index.php找到 public function lists() {,将$catid = intval($_GET['catid']);替换成:

if(isset ($_GET['catid'])){   
                    $catid = intval($_GET['catid']);   
                }else{   
                    $catdir=$_GET['catdir'];   
                    if($catdir==""){   
                        $catdir=$_GET['categorydir'];   
                    }   
                    $s=$this->_getCategoryId($catdir);   
                    $catid=$s[0][catid];                      
                }

并且在最后的 }?> 添加:

/**           *根据栏目名获得ID           
* @param <type> $catdir           */  
        function _getCategoryId($catdir){   
            $this->category_db = pc_base::load_model('category_model');   
            $result = $this->category_db->select(array('catdir'=>$catdir));   
           // print_r($result);   
            return $result;   
         }

2、打开phpcms\modules\content\classes目录中的url.class.php,找到

if (!$setting['ishtml']) { //如果不生成静态

将下面的:

$url = str_replace(array('{$catid}', '{$page}'), array($catid, $page), $urlrule);   
            if (strpos($urls, '\\')!==false) {  
                    $url = APP_PATH.str_replace('\\', '/', $urls);   
            }

替换成:

$domain_dir = '';   
            if (strpos($category['url'], '://')!==false && strpos($category['url'], '?')===false) {   
                if (preg_match('/^((http|https):\/\/)?([^\/]+)/i', $category['url'], $matches)) {   
                    $match_url = $matches[0];   
                    $url = $match_url.'/';   
                }   
                $db = pc_base::load_model('category_model');   
                $r = $db->get_one(array('url'=>$url), '`catid`');   
  
                if($r) $domain_dir = $this->get_categorydir($r['catid']).$this->categorys[$r['catid']]['catdir'].'/';   
            }   
            $categorydir = $this->get_categorydir($catid);   
            $catdir = $category['catdir'];   
            $year = date('Y',$time);   
            $month = date('m',$time);   
            $day = date('d',$time);   
            //echo $catdir;   
            $urls = str_replace(array('{$categorydir}','{$catdir}','{$year}','{$month}','{$day}','{$catid}','{$id}','{$prefix}','{$page}'),array($categorydir,$catdir,$year,$month,$day,$catid,$id,$prefix,$page),$urlrule);   
                       // echo $urls."<br>";   
                        if (strpos($urls, '\\')!==false) {  
                    $urls = APP_PATH.str_replace('\\', '/', $urls);   
            }   
                        $url = $domain_dir.$urls;

3、后台URL规则中添加:

url示例:1/
url规则:/{$categorydir}/{$catdir}/|/{$categorydir}/{$catdir}/index{$page}.html

更新栏目缓存就OK了。

首页index.php代码:

<?php ob_start();?>
<?php
if(file_exists("index.html")){ // 看静态index.htm文件是否存在
$time1 = time();
$time2 = filemtime("index.html");
//echo($time1-$time2);
// 文件修改时间和现在时间相差?的话,直接导向html文件,否则重新生成html
if(($time1 - $time2) < 600)
header("Location:index.html");
}
?>

代码二:

<html>
<body>

<h1>It works!</h1>

</body>
</html>

代码三:

<?php
//首页内容,就是你的动态部分了
//在结尾加入ob_end_clean(),并把本页输出到一个变量中
$temp=ob_get_contents();
ob_end_clean();
//写入文件
$fp=fopen("index.html",'w');
fwrite($fp,$temp) or die('写文件错误');
//初始显示
echo($temp);
?>