分类归档:Web相关

thinkphp 之windows->Linux apache->nginx

服务器迁移

windows->Linux

apache->nginx

 

配置如下:

thinkphp->’URL_MODEL’ => 3

#所有找不到的请求转到index处理

location / {
index index.html index.htm index.php;
if (!-e $request_filename){
rewrite ^(.*)$ /index.php/$1 last;
break;
}
}

#其他处理
location ~ .*\.(php|php5)?$
{
#fastcgi_pass  unix:/tmp/php-cgi.sock;
fastcgi_pass  127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf;
}

#index的处理

location ~ index\.php($|/) {
set $script     $uri;
set $path_info  “/”;
if ($uri ~ “^(.+\.php)(/.+)”) {
set $script     $1;
set $path_info  $2;
}

fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php?IF_REWRITE=1;
include fastcgi_params;
fastcgi_param PATH_INFO $path_info;
fastcgi_param  SCRIPT_FILENAME  /url/index.php;
fastcgi_param SCRIPT_NAME “”;
}

PHP读取Excel数字问题

1.查看PHP配置文件precision默认12位

2.  格式化可能造成科学计数的数据

     

 if (strpos($d, '+') !== false){
          $d['express_no']=sprintf("%.2f", $d);
  }

 

 

 

php-fcgi进程数超过预设值问题的解决

昨日,有朋友问我,他将Web服务器换成Nginx 0.6.31 + PHP 4.4.7(FastCGI)后,有时候访问会出现“502 Bad Gateway”错误,如何解决。

我让按照以下两个步骤去解决,最后在第2步中将FastCGI的timeout时间增加为300,问题解决:

PS:比较羡慕迅雷的Web服务器,16G内存。

1、查看当前的PHP FastCGI进程数是否够用:
netstat -anpo | grep “php-cgi” | wc -l

如果实际使用的“FastCGI进程数”接近预设的“FastCGI进程数”,那么,说明“FastCGI进程数”不够用,需要增大。

2、部分PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间,例如:
……
http
{
……
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
……
}

 

==================================================

php-fpm 修改php-cgi进程数

vi /usr/local/php/etc/php-fpm.conf

修改这个里面的值
5

然后
/usr/local/php/sbin/php-fpm restart

==================================================
现象:
某日和开发的同事调试服务器php状态时候发现下面这种情况:
ps aux |grep php-fcgi |wc -l
602
表面上看是没什么问题,可是我明明记得 php-fcgi我只开了300个啊!难道有人改过了?
立 刻查看php-fpm.conf找到这一项
<value name=”max_children”>300</value>
确实是300个啊~~,怎么会有600个?
ps aux |grep php-fcgi |more
www      11707  0.0  0.7 250192  3888 ?        S    17:07
www      11708  0.0  0.7 250192  3888 ?        S    17:07
www      11709  0.0  0.7 250192  3888 ?        S    17:07
www      11710  0.0  0.7 250192  3888 ?        S    17:07
www      11711  0.0  0.7 250192  3888 ?        S    17:07
状态都正常啊,奇怪了。尝试把 php-fcgi重启一下
/usr/local/php-fcgi/sbin/php-fpm restart
Shutting down php_fpm . done
Starting php_fpm  done

再次查看
ps aux |grep php-fcgi |wc -l
602

还 是多了300个…..奇怪了,这三百个是怎么来的呢?
因为我们的php和nginx是 一起的,所以我又想到了nginx。
在访问量不高的时候偷偷重启了一下nginx
/etc/init.d/nginx restart
停止 nginx:                                               [确定]
Shutting down php_fpm  done
启动 nginx:                                               [确定]
Starting php_fpm  done

再次查看,我倒…..真服了。我和开发的同事都一头雾水
ps aux |grep php-fcgi |wc -l
602
这回不能简单的考虑重启服务了,需要想想到底是哪里 出的问题,而且这是生产服务器不能随便弄。
因为现在线上的服务都还算正常,这个问题我们就先放下了。
第二天,那个同事跟我说。那个问题他知道怎么解决了,而 且也知道是什么原因造成的。我赶紧问清楚:
原来是这样,最近因为测试比较频繁,对nginx服务重启次数较多。不知道哪次重启时候失败导致nginx进程虽然停止了,
但是一起的300个php-fcgi却没有重启,导致这些进程还留在内存里不能被释放。需要强制手动杀掉所有的php- fcgi进程后再重启php-fpm就可以了。
听到这里我恍然大悟。马上去服务器上操作,果然问题解决了,具体步骤如下
pkill php-cgi
再次查看
ps aux |grep php-fcgi |wc -l
1
好了没有了,赶紧重启,因为现在访问网页已经是 502了。
/usr/local/php-fcgi/sbin/php-fpm restart
Shutting down php_fpm warning, no pid file found – php-fpm is not running ?
Starting php_fpm  done
再次查看进 程数
ps aux |grep php-cgi |wc -l
302
好了,正常 了,呵呵
后来我在试验机上面又测试了一下,果然重现了那个问题

[root@ime /]# /etc/init.d/nginx restart
停止 nginx:                                               [确定]
Shutting down php_fpm  done
启动 nginx:                                               [确定]
Starting php_fpm  done
[root@ime /]# ps aux |grep php-cgi|wc -l
302
这时进程数是正常的,下面杀掉nginx 进程
[root@ime /]# pkill nginx
[root@ime /]# lsof -i:80
[root@ime /]# ps aux |grep php-cgi|wc -l
302
这300个进程就傻乎乎的留在这里了,再 次启动nginx
[root@ime /]# /etc/init.d/nginx start
启动 nginx:                                               [确定]
Starting php_fpm  done
[root@ime /]# lsof -i:80
COMMAND   PID USER   FD   TYPE DEVICE SIZE NODE NAME
nginx   14072 root    8u  IPv4  64090       TCP *:http (LISTEN)
nginx   14073  www    8u  IPv4  64090       TCP *:http (LISTEN)

[root@ime /]# ps aux |grep php-cgi|wc -l
603
php-fcgi没有去理会在内存中存在的进程,继续开启了300个…
我如果再重复这个过程呢?
[root@ime /]# pkill nginx
[root@ime /]# lsof -i:80
[root@ime /]# /etc/init.d/nginx start
启动 nginx:                                               [确定]
Starting php_fpm  done
[root@ime /]# pkill nginx
[root@ime /]# lsof -i:80
[root@ime /]# ps aux |grep php-cgi|wc -l
904
900个… 继续重复
[root@ime /]# /etc/init.d/nginx start
启动 nginx:                                               [确定]
Starting php_fpm  done
[root@ime /]# ps aux |grep php-cgi|wc -l
954
[root@ime /]# ps aux |grep php-cgi|wc -l
1205
机 器开始变慢了,估计再重复几次机器就会挂掉了…
[root@ime /]# pkill php-cgi
[root@ime /]# ps aux |grep php-cgi|wc -l
5
[root@ime /]# ps aux |grep php-cgi|wc -l
5
[root@ime /]# ps aux |grep php-cgi|wc -l
1
[root@ime /]# /etc/init.d/nginx restart
停止 nginx:                                               [确定]
Shutting down php_fpm warning, no pid file found – php-fpm is not running ?
启动 nginx:                                               [确定]
Starting php_fpm  done
[root@ime /]# ps aux |grep php-cgi|wc -l
302
好了,恢复正常….
看来需要修改一下 php-fpm的启动脚本了

=====================================================================

1、查看当前的PHP FastCGI进程数是否够用:
netstat -anpo | grep “php-cgi” | wc -l

如果实际使用的 “FastCGI进程数”接近预设的“FastCGI进程数”,那么,说明“FastCGI进程数”不够用,需要增大。
2、部分PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间,例如:
……
http
{
……
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
……
}
……

将原始文件重命名后下载,有助于处理路径的安全非暴露问题

/**
 * 文件下载
 * @param $filepath 文件路径 为绝对或者相对的物理地址(一定是物理地址);
 * @param $filename 文件名称 将下载的文件重新命名
 */
function file_down($filepath, $filename = '') {
    if(!$filename) $filename = basename($filepath);
    if(is_ie()) $filename = rawurlencode($filename);
    $filetype = fileext($filename);
    $filesize = sprintf("%u", filesize($filepath));
    if(ob_get_length() !== false) @ob_end_clean();
    header('Pragma: public');
    header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
    header('Cache-Control: no-store, no-cache, must-revalidate');
    header('Cache-Control: pre-check=0, post-check=0, max-age=0');
    header('Content-Transfer-Encoding: binary');
    header('Content-Encoding: none');
    header('Content-type: '.$filetype);
    header('Content-Disposition: attachment; filename="'.$filename.'"');
    header('Content-length: '.$filesize);
    readfile($filepath);
    exit;
}

/**
 * 取得文件扩展
 * @param $filename 文件名
 * @return 扩展名
 */
function fileext($filename) {
    return strtolower(trim(substr(strrchr($filename, '.'), 1, 10)));
}

/**
 * IE浏览器判断
 */

function is_ie() {
    $useragent = strtolower($_SERVER['HTTP_USER_AGENT']);
    if((strpos($useragent, 'opera') !== false) || (strpos($useragent, 'konqueror') !== false)) return false;
    if(strpos($useragent, 'msie ') !== false) return true;
    return false;
}

/**
* 产生随机字符串
*
* @param    int        $length  输出长度 
* @param    string     $chars   可选的 ,默认为 0123456789
* @return   string     字符串
*/
function random($length, $chars = '0123456789') {
    $hash = '';
    $max = strlen($chars) - 1;
    for($i = 0; $i < $length; $i++) {
        $hash .= $chars[mt_rand(0, $max)];
    }
    return $hash;
}

 

用法:

//$filename为相对的或者绝对的物理地址,不能是http地址,否则出错          

           $basefilename = basename($filename);
$ext = fileext($basefilename);
$basefilename = date(‘Ymd_his’).random(3).’.’.$ext;
file_down($filename, $basefilename);

PHP读取 excel(.csv, .xls)文件的方法

常用的用PHP读取EXCEL的方法有以下三种,各自有各自的优缺点。个人推荐用第三种方法,因为它可以跨平台使用。

1. 以.csv格式读取

将.xls转换成.csv的文本格式,然后再用PHP分析这个文件,和PHP分析文本没有什么区别。

优点:跨平台,效率比较高、可以读写。

缺点:只能直接使用.csv的文件,如果经常接受.xls二进制文件的话需要手工转换,不能自动化。一个文件只有一个SHEET。

PHP有自带的分析.csv函数:fgetcsv

array fgetcsv ( int $handle [, int $length [, string $delimiter [, string $enclosure]]] )

handle 一个由 fopen()、popen() 或 fsockopen() 产生的有效文件指针。

length (可选)必须大于 CVS 文件内最长的一行。在 PHP 5 中该参数是可选的。如果忽略(在 PHP 5.0.4 以后的版本中设为 0)该参数的话,那么长度就没有限制,不过可能会影响执行效率。

delimiter (可选)设置字段分界符(只允许一个字符),默认值为逗号。

enclosure (可选)设置字段环绕符(只允许一个字符),默认值为双引号。该参数是在 PHP 4.3.0 中添加的。 和 fgets() 类似,只除了 fgetcsv() 解析读入的行并找出 CSV 格式的字段然后返回一个包含这些字段的数组。

fgetcsv() 出错时返回 FALSE,包括碰到文件结束时。

注意: CSV 文件中的空行将被返回为一个包含有单个 null 字段的数组,不会被当成错误。

当然也可以自己手动分析字符串。

<?php$row = 1;$handle = fopen("test.csv","r");while ($data = fgetcsv($handle, 1000, ",")) { $num = count($data); echo " $num fields in line $row:\n"; $row++; for ($c=0; $c < $num; $c++) { echo $data[$c] . "\n"; }}fclose($handle);?>

 

还可以利用fputcsv函数将行格式化为 CSV 并写入文件指针。

2. ODBC链接数据源

优点:支持多种格式,cvs, xls等。支持读写,使用标准SQL语言,和SQLSERVER、MYSQL数据库几乎完全一样。

缺点:值支持windows服务器

3. PHP自定义类

优点:跨平台。某些类支持写操作。支持.xls二进制文件

常用的类有phpExcelReader、PHPExcel。其中后者支持读写,但是需要php5.2以上版本。

phpExcelReader是专门用来读取文件的。返回一个数组,包含表格的所有内容。

该 class 使用的方法可以参考网站下载回来的压缩档中的 example.php。

不过我下载回来的 (版本 2009-03-30),有两点要注意:

reader.php 中的下面这行要修改

将 require_once ‘Spreadsheet/Excel/Reader/OLERead.php’;

改为 require_once ‘oleread.inc’;

example.php 中

修改 $data->setOutputEncoding(’CP1251′);

为 $data->setOutputEncoding(’CP936′);

修改 nl2br(htmlentities($data->sheets[$sheet][‘cells’][$row][$col]));

为 $table_output[$sheet] .= nl2br(htmlspecialchars($data->sheets[$sheet][‘cells’][$row][$col]));

不然中文会有问题。

繁体的话可以修改为CP950、日文是CP932,具体可参考codepage说明。

修改 $data->read(’jxlrwtest.xls’) 为自己的 excel 文件名,zip 档中附的 jxlrwtest.xls 应该是坏了。

这是下载地址:

phpExcelReader:http://sourceforge.net/projects/phpexcelreader/

PHPExcel:http://www.codeplex.com/PHPExcel/Wiki/View.aspx?title=Documents&referringTitle=Home

 

 

有时写程序时后台要求把大量数据导入数据库中,比如计算机考试成绩的查询、电话簿的数据等一般都是存放在excel中的,这时我们可把数据导出成csv文 件,然后通过以下程序即可在后台批量导入数据到数据库中。

  下面只是主要程序部分:

<?php

//定义获取时间函数
function getmicrotime(){
   list($usec, $sec) = explode(" ",microtime());
   return ((float)$usec + (float)$sec);
}
?>

<?php
$time_start = getmicrotime();
include("db.inc.php");//连接数据库
$db=new testcsv;
?>
<?php
$handle = fopen ("test.csv","r");
$sql="insert into scores(idcard,names,num,sex,nation,score) values(";
while ($data = fgetcsv ($handle, 1000, ",")) {
  $num = count ($data);
  for ($c=0; $c < $num; $c++) {
      if($c==$num-1){$sql=$sql.$data[$c].")";break;}
      $sql=$sql.$data[$c].",";
  }
print "<br>";
echo $sql."<br>";
$db->query($sql);
echo "sql语句执行成功!<br>";
$sql="insert into scores(idcard,names,num,sex,nation,score) values(";
}
fclose ($handle);
$time_end = getmicrotime();
$time = $time_end - $time_start;
echo "程序执行时间:".$time."秒";
?>

 

PHP去空格方法大全

去掉字符串中的空格 str_replace(‘ ‘,”,$cat_name)
$str = ” This line contains\tliberal \r\n use of?? whitespace.\n\n”;
$str = trim($str);// 首先去掉头尾空格
$str = preg_replace(’/\s(?=\s)/’, ‘’, $str);// 接着去掉两个空格以上的
$str = preg_replace(’/[\n\r\t]/’, ‘ ‘, $str);// 最后将非空格替换为一个空格
使用上面的例子可以去掉所有多余的空格。
首先使用TRim()去头尾空格,
接着用preg_replace()去掉重复的空格。
当中的(?=)表示只匹配后面的空格跟随前面的空格的空格。

<?php
$str1="?? tt 七夕快乐!nr"; //这里定义一个字符变量,其中包括"空格","t", 水平制表符,"n",换行符
//这里主要调用trim()函数去除空格等,trim()函数用于去除字符中的""空格,"t"水平制表符"n"换行符,"r"回车符
//"\0"字符串结束符,"xOB"垂直制表符。如果想通过此函数过滤掉特殊的字符,可以制定第二个参数。
echo trim($str1)."<br>";
//这里是去除$str1变量中带有tt的字符
echo trim($str1," tt")."<br>";
//定义变量$str2其中包括"."和空格
$str2="... 情人节快乐!...?? 中国...";
//调用trim()函数去除$str2变量中的空格
echo trim($str2)."<br>";
//ltrim()函数用于去除字符串左边的空格或指定字符串,其默认的字符同trim一样。因为这里指定了第二个参数,
//所以只去除$str2变量中左边的"."
echo ltrim($str2,".")."<br>";
//ltrim()函数用于去除字符串(右)边的空格或指定字符串,其默认的字符同trim一样。因为这里指定了第二个参数,
//所以只去除$str2变量中左边的"."
echo rtrim($str2,".")."<br>";
?>
<?php
echo substr("today is father day!",0)."<br>";
echo substr("today is father day!",6,2)."<br>";//这里只截取字符串中第6字符开始截取,并只截取2个字符
echo substr("today is father day!",-5,5)."<br>";//这里从字符串的倒数第5个字符开始截取,截取5个字符
echo substr("today is father day!",0,-5)."<br>";//这里只截取字符串中的首个字符开始截取,截取到字符串的倒数第5个
echo substr("today is father day!",-5,-1)."<br>";//这里从字符串的倒数第5个字符开始截取,截取倒数第一个字符
?>

 

PHP彩蛋入侵

关于“PHP彩蛋”的说法也许很多老PHPer已经都知道或听说了,好像是早在PHP4版本的时候就有彩蛋了,挺好玩儿的,可能近年来逐渐被人们遗忘了,其实彩蛋功能在PHP脚本引擎默认情况下是开启。
下面就用Discuz官方论坛做一下测试:
http://www.discuz.net/?=PHPE9568F34-D428-11d2-A769-00AA001ACF42
http://www.discuz.net/?=PHPE9568F35-D428-11d2-A769-00AA001ACF42
http://www.discuz.net/?=PHPE9568F36-D428-11d2-A769-00AA001ACF42
http://www.discuz.net/?=PHPB8B5F2A0-3C92-11d3-A3A9-4C7B08C10000
如上4个链接加红色的部分是PHP源码/ext/standard/info.h中定义的GUID值,如下图所示
关于PHP彩蛋这个玩法已经被国外的某些Web漏洞扫描器(例如:HP WebInspect)所使用了,用其来探测被扫描的网站使用的是何种Web开发语言。其实在渗透测试过程中经常遇见某些网站难以辨别出使用了何种Web开发语言,因为有些网站采用动态脚本生成纯静态HTML页或者是采用URL重写实现伪静态页面,如果网站使用的是PHP开发的话,可以尝试使用彩蛋的探测法,在很多情况下可以一针见血的鉴定出来,因为默认情况下彩蛋的功能在php.ini中是开启的,当然如果不想让别人通过彩蛋的方式来获取网站的敏感信息的话,那就在php.ini中将expose_php = Off即可!
看完上面这些可能有些人会说既然php.ini中的expose_php = On,那么直接抓包看看http头信息不就OK了,可是某些大站点Web服务器的前面都是有反向代理服务器的,所以还不能完全依赖于捕获http头中的信息。

完美去掉Discuz x1.5中powered by discuz!

标题中的版权

在原来的discuz X1版本中,标题中去掉“Powered by Discuz!”版权标识很容易,只需要修改模板文件的头部公用文件,将[‘bbname’] – <!–{/if}–> Powered by Discuz!</title> 中红色部分去掉即可。
但是discuz X1.5直接把- Powered by Discuz!中的 – 放在了变量里,所以删除后,标题一句话结束后会有一个小 – 尾巴,对搜索引擎很不友好,所以也有一个好的办法完美解决,即:

打开\template\default\common\header_common.htm文件,找到<title><!–{if !empty($navtitle)}–>$navtitle – <!–{/if}–><!–{if empty
($nobbname)}–> $_G[‘setting’][‘bbname’] – <!–{/if}–> Powered by Discuz!</title>

将其中的“Powered By Discuz!”字串改为“{lang secondtitle}”。
再打开source/language/lang_template.php。在变量的最后,也就是整个数组的目录后按以前的格式,加上引号内的内容”  ‘secondtitle’ => ‘网站或论坛名称’,“。
更新缓存即可。
页底导航中的版权
打开\template\default\common\foot.htm文件
找到 <p>Powered by <strong><a href=”http://www.discuz.net” target=”_blank”>Discuz!</a></strong> <em>$_G[‘setting’][‘version’]</em><!–{if !empty($_G[‘setting’][‘boardlicensed’])}–> <a href=”http://license.comsenz.com/?pid=1&host=$_SERVER[HTTP_HOST]” target=”_blank”>Licensed</a><!–{/if}–></p><p>&copy; 2001-2010 <a href=”http://www.comsenz.com” target=”_blank”>Comsenz Inc.</a></p>
全部删除即可。
或者添加自己的代码如:
<p>24小时服务热线:0000-00000000</p>
   <p>Copyright &copy; 2011 ***.com Inc. All Rights Reserved. <a href=”http://www.***.com/” target=”_blank”>**公司</a> 版权所有</p>
  </div>

php采集程序

其实,采集程序最简单的思路就是:获取页面代码——分析代码——获取需要的部分——写入数据库

对于采集程序来说,使用PHP来写的话,其实不算太好的,因为PHP并不支持多线程,对于采集来说,若没有多线程,将会是非常痛苦的一件事

不过可以使用frame等来设置同时几个页面一起采集,这样就能增加速度了,在这里我不讨论怎么多线程,我只说怎么用PHP来进行简单的采集

先确定采集目标:http://cn.jokes.yahoo.com/jok/index.html

这是雅虎的笑话栏目,我就以这个来进行讲解吧

首先分析一下网页,可以知道连接形式为:<img src=”http://cn.yimg.com/i/cn/px_ar.gif” width=5 height=12 border=0 hspace=5><a href=”http://cn.jokes.yahoo.com/07-07-/55/27lot.html” target=_blank><big>头发与智慧</big></a>

使用正则表达式将它表示出来为:/hspace=5><a href=”http://cn.jokes.yahoo.com/(.*).html” target=_blank>/isU

书写PHP代码:

代码
// 采集首页地址
$url = “<a href=\”http://cn.jokes.yahoo.com/jok/index.html\”>http://cn.jokes.yahoo.com/jok/index.html</a>”;
// 获取页面代码
$r = file_get_contents($url);
// 设置匹配正则
$preg = ‘/hspace=5><a href=”http://cn.jokes.yahoo.com/(.*).html” target=_blank>/isU’;
// 进行正则搜索
preg_match_all($preg, $r, $title);

通过上面的代码,$title[1][num]就是连接的地址了,接着分析内容页,得到内容匹配正则为:/<div id=”newscontent”>(.*)</div>/isU

继续写代码:

代码
// 计算标题数量
$count = count($title[1]);
// 通过标题数量进行内容采集
for($i=0;$i<$count;$i++) {
// 设置内容页地址
$jurl = “<a href=\”http://cn.jokes.yahoo.com/\”>http://cn.jokes.yahoo.com/</a>” . $title[1][$i] . “.html”;
// 获取内容页代码
$c = file_get_contents($jurl);
// 设置内容页匹配正则
$p = ‘/<div id=”newscontent”>(.*)</div>/isU’;
// 进行正则匹配搜索
preg_match($p, $c, $content);
// 输出标题
echo $title[1][$i] . ”
“;
// 输出内容
echo $content[$i];
}

这样,一个简单的采集工具就写出来了,其他的功能只需要再进一步的完善就可以了

完整代码:

<?php 
// 采集首页地址 
$url = "<a href=\"http://cn.jokes.yahoo.com/jok/index.html\">http://cn.jokes.yahoo.com/jok/index.html</a>"; 
// 获取页面代码 
$r = file_get_contents($url); 
// 设置匹配正则 
$preg = '/hspace=5><a href="http://cn.jokes.yahoo.com/(.*).html" class=list target=_blank>/isU'; 
// 进行正则搜索 
preg_match_all($preg, $r, $title); 
// 计算标题数量 
$count = count($title[1]); 
// 通过标题数量进行内容采集 
for($i=0;$i<$count;$i++) { 
   // 设置内容页地址 
   $jurl = "<a href=\"http://cn.jokes.yahoo.com/\">http://cn.jokes.yahoo.com/</a>" . $title[1][$i] . ".html"; 
   // 获取内容页代码 
   $c = file_get_contents($jurl); 
   // 设置内容页匹配正则 
   $p = '/<div id="newscontent">(.*)</div>/isU'; 
   // 进行正则匹配搜索 
   preg_match($p, $c, $content); 
   // 输出标题 
   echo $title[1][$i] . "
"; 
   // 输出内容 
   echo $content[$i]; 
} 
?>

 

ucenter创始人密码忘了解决方法

打开uc下面/data/config.inc.php文件

里面有

define(‘UC_FOUNDERPW’, ‘924a2bd32289075d8055e7e30261dfb1’);

define(‘UC_FOUNDERSALT’, ‘116414’);

记下116414这个值,然后

用php输出下面的一个代码

$ucfounderpw= md5(md5($ucfounderpw).$ucsalt);

其中$ucsalt就是116414(这个根据您的需要而定)

$ucfounderpw是您要设置的密码。

得到的$ucfounderpw替换

define(‘UC_FOUNDERPW’, ‘924a2bd32289075d8055e7e30261dfb1’);

这个里面的924a2bd32289075d8055e7e30261dfb1就可以了。

还有另外一种方法,将以下代码保存为PHP,传至UC根目录,运行即可

<?php

define(ROOT_DIR,dirname(__FILE__)."/");

if(!file_exists('./data/config.inc.php') || !is_writeable('./data')){

   $isucdir= 0;

   echo 'UCenter创始人密码重置工具必须放在UCenter根目录下才能正常使用.';

   exit;

}else{

   $isucdir = 1;

}

$info="";

setucadministrator();

function setucadministrator(){

global $isucdir;

global $info;

if($_POST['setucsubmit']){

   if($isucdir){

    $configfile = ROOT_DIR."./data/config.inc.php";

    $uc_password = $_POST["uc_password"];

    $salt = substr(uniqid(rand()), 0, 6);

    if(!$uc_password){

     $info = "密码不能为空";

    }else{

     $md5_uc_password = md5(md5($uc_password).$salt);

     $config = file_get_contents($configfile);

     $config = preg_replace("/define\('UC_FOUNDERSALT',\s*'.*?'\);/i", "define('UC_FOUNDERSALT', '$salt');", $config);

     $config = preg_replace("/define\('UC_FOUNDERPW',\s*'.*?'\);/i", "define('UC_FOUNDERPW', '$md5_uc_password');", $config);

     $fp = @fopen($configfile, 'w');

     @fwrite($fp, $config);

     @fclose($fp);

     $info = "UCenter创始人密码更改成功为:$uc_password";

    }

   }else{

    $info = "本程序文件放置在UCenter跟目录,才能通过程序修改UCenter创始人管理员的密码<br />";

   }

}

templates("setucadministrator");

}

function errorpage($message,$title = '',$isheader = 1,$isfooter = 1){

   $message = "<h4>$title</h4><br><br><table><tr><th>提示信息</th></tr><tr><td>$message</td></tr></table>";

   echo $message;

   exit;

}

function templates($tpl){

switch ($tpl){

   case "header":

    echo '<html>

    <head>

    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">

    <title>UCenter 创始人密码更改工具</title>

    <style type="text/css">

    <!--

    body {font-family: Arial, Helvetica, sans-serif, "宋体";font-size: 12px;color:#000;line-height: 120%;padding:0;margin:0;background:#DDE0FF;overflow-x:hidden;word-break:break-all;white-space:normal;scrollbar-3d-light-color:#606BFF;scrollbar-highlight-color:#E3 EFF9;scrollbar-face-color:#CEE3F4;scrollbar-arrow-color:#509AD8;scrollbar-shadow-color:#F0F1FF;scrollbar-base-color:#CEE3F4;}

    a:hover {color:#60F;}

    ul {padding:2px 0 10px 0;margin:0;}

    textarea,table,td,th,select{border:1px solid #868CFF;border-collapse:collapse;}

    input{margin:10px 0 0px 30px;border-width:1px;border-style:solid;border-color:#FFF #64A7DD #64A7DD #FFF;padding:2px 8px;background:#E3EFF9;}

     input.radio,input.checkbox,input.textinput,input.specialsubmit {margin:0;padding:0;border:0;padding:0;background:none;}

    input.textinput,input.specialsubmit {border:1px solid #AFD2ED;background:#FFF;height:24px;}

    input.textinput {padding:4px 0;}     input.specialsubmit {border-color:#FFF #64A7DD #64A7DD #FFF;background:#E3EFF9;padding:0 5px;}

    option {background:#FFF;}

    select {background:#F0F1FF;}

    #header {height:60px;width:100%;padding:0;margin:0;}

      h2 {font-size:24px;font-weight:bold;position:absolute;top:24px;left:20px;padding:10px;margin:0;}

      h3 {font-size:14px;position:absolute;top:28px;right:20px;padding:10px;margin:0;}

    #content {height:510px;background:#F0F1FF;overflow-x:hidden;z-index:1000;}

      #nav {top:60px;left:0;height:510px;width:180px;border-right:1px solid #DDE0FF;position:absolute;z-index:2000;}

          #nav ul {padding:0 10px;padding-top:30px;}

          #nav li {list-style:none;}

          #nav li a {font-size:14px;line-height:180%;font-weight:400;color:#000;}

          #nav li a:hover {color:#60F;}

      #textcontent {padding-left:200px;height:510px;width:100%;line-height:160%;overflow-y:auto;overflow-x:hidden;}

       h4,h5,h6 {padding:4px;font-size:16px;font-weight:bold;margin-top:20px;margin-bottom:5px;color:#006;}

     h5,h6 {font-size:14px;color:#000;}

     h6 {color:#F00;padding-top:5px;margin-top:0;}

     .specialdiv {width:70%;border:1px dashed #C8CCFF;padding:0 5px;margin-top:20px;background:#F9F9FF;}

     #textcontent ul {margin-left:30px;}

     textarea {width:78%;height:320px;text-align:left;border-color:#AFD2ED;}

     select {border-color:#AFD2ED;}

     table {width:74%;font-size:12px;margin-left:18px;margin-top:10px;}

        table.specialtable,table.specialtable td {border:0;}

      td,th {padding:5px;text-align:left;}

        caption {font-weight:bold;padding:8px 0;color:#3544FF;text-align:left;}

        th {background:#D9DCFF;font-weight:600;}

      td.specialtd {text-align:left;}

     .specialtext {background:#FCFBFF;margin-top:20px;padding:5px 40px;width:64.5%;margin-bottom:10px;color:#006;}

    #footer p {padding:0 5px;text-align:center;}

    -->

    </style>

    </head>

    <body>

    <div id="content">

    <div id="textcontent">';

    break;

   case "footer":

    echo '

      </div></div>

      <div id="footer"><p>UCenter 创始人密码更改工具 &nbsp;

      版权所有 &copy;2001-2007 <a href="http://www.comsenz.com" style="color: #888888; text-decoration: none">

      康盛创想(北京)科技有限公司 Comsenz Inc.</a></font></td></tr><tr style="font-size: 0px; line-height: 0px; spacing: 0px; padding: 0px; background-color: #698CC3">

      </p></div>

      </body>

      </html>';

    exit;

    break;

   case "setucadministrator":

    templates("header");

    if(!empty($_POST['setucsubmit'])){

     echo "<h5>UCenter 创始人密码更改工具</h5><h5> <font color=red>使用完毕后请及时删除本文件,以免给您造成不必要的损失</font></h5>";

     echo '<form action="?action=setadmin" method="post"><input type="hidden" name="action" value="login" />';

     global $info;

     errorpage($info,'',0,0);

     echo '</form>';

    }else{

     echo '<form action="?action=setucadministrator" method="post">

     <h5>UCenter 创始人密码更改工具</h5>

     <h5> <font color=red>使用完毕后请及时删除本文件,以免给您造成不必要的损失</font></h5>

     <table>

     <tr><th width="30%">用户名</th><td width="70%"><input class="textinput" readonly="readonly" disabled type="text" name="username" size="25" maxlength="40" value="UCenter Administrator"></td></tr>

     <tr><th width="30%">请输入密码</th><td width="70%"><input class="textinput" type="text" name="uc_password" size="25"></td></tr>

     </table>

     <input type="submit" name="setucsubmit" value="提 &nbsp; 交">

     </form>';

    }

    templates("footer");

    break;

}

}

?>