PHPCMS 更新后 Illegal mix of collations错误

前几天不是说phpcms有漏洞么,把网站给升级了,发文章时就出现了这个错误,看了下,应该是升级时的sql没有指定编码。

Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COER)

修改一下编码能解决,注意表前缀

ALTER TABLE keyword CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE keyword_data CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE keyword CONVERT TO CHARACTER SET gbk;
ALTER TABLE keyword_data CONVERT TO CHARACTER SET gbk;

PHPCMS v9 安全主机设置方法

PHPCMS又被挂木马了,caches目录下的模板文件被篡改,附件上传目录上传了后门,检查了一下,是因为用的phpcms版本太老,没有进行安全更新。

又检查了一下apache的目录权限,设置的有问题,改了一下,能防住大部份的安全问题。

安全原则:
有写入权限的目录,不能被执行
附件目录,不能的执行文件,如php,asp

修改以后的目录权限如下。phpcms核心框架目录,caches目录肯定是不允许访问的,html生成的目录和附件上传目录,不允许执行php。
至于phpsso_server,这个鸡肋的东西,估计也没有用户使用,直接删除或者禁止访问。

另外呢,svn里也可以很明显的看到文件修改历史,caches目录会不断修改更新,建议写个计划任务,1个小时删除一下所有模板缓存。

NameVirtualHost *:80
<virtualhost *:80>
	DocumentRoot /var/www/www.baidu.com
	ServerName www.baidu.com
	ServerAlias baidu.com
	<directory /var/www/www.baidu.com>
		allow from all
		Options -Indexes
		AllowOverride None
	</directory>

	<directory /var/www/www.baidu.com/phpcms>
		Deny from all
	</directory>

	<directory /var/www/www.baidu.com/caches>
		Deny from all
	</directory>

	<directory /var/www/www.baidu.com/html>
		php_flag engine off
	</directory>

	<directory /var/www/www.baidu.com/phpsso_server>
		php_flag engine off
	</directory>

	<directory /var/www/www.baidu.com/statics>
		php_flag engine off
	</directory>

	<directory /var/www/www.baidu.com/uploadfile>
		php_flag engine off
	</directory>

</virtualhost>

如果中了木马,在Linux下也有快速的清除方法

cd uploadfile
find -name *php -exec rm -rf {} \;
find -name *Php -exec rm -rf {} \;

cd ../caches
ack -i eval

cd ../html
ack -i eval

cd ../
find -name *.php -exec grep eval {} \;

PHPCMS v9栏目添加扩展字段或者(描述改成编辑器)

不得不说 PHPCMS v9是个东西

由于栏目列表展示的地方需要展示一段长文本内容,PCv9的栏目默认是没有文本字段的,加起来超级方便。

1,在数据库中添加一个字段content用来存放栏目详情

ALTER TABLE `category`
ADD COLUMN `content` text NULL;

2,修改栏目新增和修改的模板,添加字段,我一般是放在description下面
/cloud/phpcms/modules/admin/templates/category_add.tpl.php
/cloud/phpcms/modules/admin/templates/category_edit.tpl.php

	<tr>
        <th><?php echo L('页面内容')?>:</th>
        <td>
		<textarea name="info[content]" style="width:300px;height:60px;"><?php echo $content;?></textarea>
		<?php echo form::editor('info[content]','full','','','',1,1)?>
		</td>
	</tr>

完工

PHPCMSV9无法上传附件,提示空信息的超级bug

这个问题折腾之久,浪费的时间、香烟之严重,就不多说了,反正Linux系统重做过两次,Nginx+Apache反复装了N次,都不成功。论坛也有很多解决办法,都治标不治本。

一开始发现系统在其它服务器上运行ok,就新部署的项目始终无法上传文件。所以一直把精力放到服务器的环境配置上了,比如上传大小限制,上传的目录权限,网站文件夹的权限设置,折腾了两个周末外加清明节。

悲催而操蛋的节日。

发现问题是无意中看到php的错误日志,定位到错误发生在移动临时上传文件到保存目录的地方,路径中多了一条下划线。

然后才看到这段离奇的代码

			$temp_filename = $this->getname($fileext);
			$savefile = $this->savepath.$temp_filename;
			$savefile = preg_replace("/(php|phtml|php3|php4|jsp|exe|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl)(\.|$)/i", "_\\1\\2", $savefile);
			$filepath = preg_replace(new_addslashes("|^".$this->upload_root."|"), "", $savefile);
			if(!$this->overwrite && file_exists($savefile)) continue;
			$upload_func = $this->upload_func;
			if(@$upload_func($file['tmp_name'], $savefile)) {
				$this->uploadeds++;
				@chmod($savefile, 0644);
				@unlink($file['tmp_name']);
				$file['name'] = iconv("utf-8",CHARSET,$file['name']);
				$uploadedfile = array('filename'=>$file['name'], 'filepath'=>$filepath, 'filesize'=>$file['size'], 'fileext'=>$fileext, 'fn'=>$file['fn']);
				$thumb_enable = is_array($thumb_setting) && ($thumb_setting[0] > 0 || $thumb_setting[1] > 0 ) ? 1 : 0;	
				$image = new image($thumb_enable,$this->siteid);				
				if($thumb_enable) {
					$image->thumb($savefile,'',$thumb_setting[0],$thumb_setting[1]);
				}
				if($watermark_enable) {
					$image->watermark($savefile, $savefile);
				}
				$aids[] = $this->add($uploadedfile);
			}

我理解这个程序员哥哥的意图是对非法的文件扩展名进行安全过滤,但发生一件很碉堡的事情,就是把整个路径给进行了过滤。

$savefile = preg_replace("/(php|phtml|php3|php4|jsp|exe|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl)(\.|$)/i", "_\\1\\2", $savefile);

$savefile已经是一个完整的路径了,如/wwwroot/cn.php.net/uploadfile/2012/04/balabal.jpg,本身应该是对balabal.jpg进行过滤,现在把cn.php.net也算进去咯。
所以,如果某位朋友的域名中恰好出现了php|phtml|php3|php4|jsp|exe|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl+.,悲惨的生活就开始咯
解决办法很简单。注释掉这行或者改成下面的代码

   $temp_filename = $this->getname($fileext);
   $temp_filename = preg_replace("/(php|phtml|php3|php4|jsp|exe|dll|asp|cer|asa|shtml|shtm|aspx|asax|cgi|fcgi|pl)(\.|$)/i", "_\\1\\2", $temp_filename);
   $savefile = $this->savepath.$temp_filename;

这个bug应该在V9所有版本中均存在,呜呼~~

我把修改之后的代码也发到这里了,献给所有欲哭无泪的战友们~~~

attachment.class

PHPCMS 站群调用指定站点推荐位文章

V9的推荐位函数存在一个BUG,没有加入siteid条件。

	/**
	 * 推荐位
	 * @param $data
	 */
	public function position($data) {
		$sql = '';
		$array = array();
		$posid = intval($data['posid']);
		$order = $data['order'];
		$thumb = (empty($data['thumb']) || intval($data['thumb']) == 0) ? 0 : 1;
		$siteid = $GLOBALS['siteid'] ? $GLOBALS['siteid'] : 1;
		
		//当模板中指定了站点的时候,以指定站点为准,Add By shuhai
		$siteid = intval($data['siteid']) ? intval($data['siteid']) : $siteid;

PHPCMS V9使用 syntax-highlighter 进行代码高亮

新增一个函数库文件,放到phpcms自动加载目录下

phpcms\libs\functions\autoload\highlighter.func.php


<?php
/**
*  代码高亮函数库
*
* @copyright            (C) 2005-2011 4wei
* @license                http://www.4wei.cn/
* @lastmodify            2012-2-3
*/

function highlighter($content, $lang="java")
{
preg_match_all("@(\[($lang)\][\s\S]+\[/$lang\])@is", $content, $codes);

$codes = $codes[1];

if(empty($codes)) return $content;

foreach ($codes as $code)
{
$content = str_replace($code, highlighter_format($code, $lang), $content);
}

return $content;
}

function highlighter_format($code, $lang)
{
$code = strip_tags(preg_replace('/<br\\s*?\/??>/i', '', $code));

$code = str_replace("[$lang]", "<pre class=\"brush: {$lang}; auto-links: false; \">", $code);
$code = str_replace("[/$lang]", "</pre>", $code);
$code = str_replace(array("“", "”"), '"', $code);

return $code;
}

?>

模板中调用需要格式化的数据:


<script type="text/javascript" src="{JS_PATH}syntax-highlighter/scripts/brush.js"></script>
<link type="text/css" rel="stylesheet" href="{JS_PATH}syntax-highlighter/styles/shCore.css"/>
<link type="text/css" rel="stylesheet" href="{JS_PATH}syntax-highlighter/styles/shThemeDefault.css"/>
<script type='text/javascript'>
<!--
$(document).ready(function(){
SyntaxHighlighter.config.clipboardSwf = '{JS_PATH}syntax-highlighter/scripts/clipboard.swf';
SyntaxHighlighter.all();
});
//-->
</script>

{highlighter($content, "php")}

并将相关js文件上传到phpcms的 static目录下

statics

phpcms v9 会员投稿功能,编辑文章以后,siteid字段丢失

现象:
会员投稿的内容,进行二次编辑以后,从已投稿列表里消失,后来发现是siteid参数丢失

bug定位
member/content.php 211行

$this->content_db->edit_content($_POST['info'],$id);

content_model.class.php

		//更新审核列表
		$this->content_check_db = pc_base::load_model('content_check_model');
		$check_data = array(
			'catid'=>$systeminfo['catid'],
			'siteid'=>$this->siteid,
			'title'=>$systeminfo['title'],
			'status'=>$systeminfo['status'],
			);

再看

$this->siteid = get_siteid();
/**
 * 获取当前的站点ID
 */
function get_siteid() {
	static $siteid;
	if (!empty($siteid)) return $siteid;
	if (defined('IN_ADMIN')) {
		if ($d = param::get_cookie('siteid')) {
			$siteid = $d;
		} else {
			return '';
		}
	} else {
		$data = getcache('sitelist', 'commons');
		if(!is_array($data)) return '1';
		$site_url = SITE_PROTOCOL.SITE_URL;
		foreach ($data as $v) {
			if ($v['url'] == $site_url.'/') $siteid = $v['siteid'];
		}
	}
	if (empty($siteid)) $siteid = 1;
	return $siteid;
}

可以看出,siteid在模块间传递时出现了丢失。

解决办法是在编辑文章之间对siteid进行更新

				/*
				 * fix by vus520会员编辑文章以后,消失的bug
				 * www.4wei.cn
				 * */
				$this->content_db->siteid = $siteid;
				$this->content_db->edit_content($_POST['info'],$id);

PHPCMS V9 全站Sitemap生成[服务器端版]

需求:
通过服务器的定时任务自动更新网站全站的所有文章,并生成sitemap

以下代码为sitemap crontab for phpcms v9,以下代码保存到phpcms 根目录下,配置cronTab定时生成即可

<?php
/**
 *  sitemap.php PHPCMS V9 sitemap入口
 *
 * @copyright			(C) 2005-2011 www.4wei.cn
 * @license				http://www.4wei.cn
 * @lastmodify			2011-12-06
 */
if(PHP_SAPI != 'cli')
{
	header('location: sitemap.xml');
	exit;
}
define('SITEMAP_SIZE', 10000);	//sitemap中最大输出数量
define('MODEL_SIZE', 3000);		//每个模型中最大输出数量
$model_arr = array(12=>'资讯', 13=>'评测', 14=>'教程'); //定义需要生成sitemap的模型

define('PHPCMS_PATH', dirname(__FILE__).DIRECTORY_SEPARATOR);
include PHPCMS_PATH.'/phpcms/base.php';

$param = pc_base::load_sys_class('param');

$model_arr = empty($model_arr) ? getcache('model','commons') : $model_arr;

$map = array();
foreach ($model_arr as $modelid => $model)
{
	$tablename = $model['tablename'];
	
	$db = pc_base::load_model('content_model');
	$db->set_model($modelid);
	
	if($db->count() && count($map) < SITEMAP_SIZE)
	{
		$order = 'id desc';
		$arc = $db->select(array('status'=>99), 'url,updatetime', MODEL_SIZE, $order);
		$map = array_merge($map, $arc);
	}
}

/* 遍历生成 */
$html = '<?xml version="1.0" encoding="utf-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';

foreach ($map as $row)
{
	if(empty($row) || empty($row['url'])) continue;
	
	$date = date("Y-m-d", $row['updatetime']);
	$url = str_replace(array('&', '\'', '"', '>', '<'), array('&amp;', '&apos;', '&quot;', '&gt;', '&lt;'), $row['url']);
	$html .= "
<url>
        <loc>{$url}</loc>
        <lastmod>{$date}</lastmod>
        <changefreq>daily</changefreq>
        <priority>0.8</priority>
</url>";
}

$html .= '</urlset>';
file_put_contents('./sitemap.xml', $html);
?>

PHPCMS V9 全站推荐位文章链接为空

错误定位:
go函数存在bug

错误代码:

/**
 * 获取内容地址
 * @param $catid   栏目ID
 * @param $id      文章ID
 * @param $allurl  是否以绝对路径返回
 */
function go($catid,$id, $allurl = 0) {
	static $category;
	if(empty($category)) {
		$siteids = getcache('category_content','commons');
		$siteid = $siteids[$catid];
		$category = getcache('category_content_'.$siteid,'commons');
	}
	$id = intval($id);
	if(!$id || !isset($category[$catid])) return '';
	$modelid = $category[$catid]['modelid'];
	if(!$modelid) return '';
	$db = pc_base::load_model('content_model');
	$db->set_model($modelid);
	$r = $db->get_one(array('id'=>$id), '`url`');
	if (!empty($allurl)) {
		if (strpos($r['url'], '://')===false) {
			if (strpos($category[$catid]['url'], '://') === FALSE) {
				$site = siteinfo($category[$catid]['siteid']);
				$r['url'] = substr($site['domain'], 0, -1).$r['url'];
			} else {
				$r['url'] = $category[$catid]['url'].$r['url'];
			}
		}
	}
	
	return $r['url'];
}

修正方法:
//static $category;
注释掉$category变量以后,问题解决。

/**
 * 获取内容地址
 * @param $catid   栏目ID
 * @param $id      文章ID
 * @param $allurl  是否以绝对路径返回
 */
function go($catid,$id, $allurl = 0) {
	//static $category;
	if(empty($category)) {
		$siteids = getcache('category_content','commons');
		$siteid = $siteids[$catid];
		$category = getcache('category_content_'.$siteid,'commons');
	}
	$id = intval($id);
	if(!$id || !isset($category[$catid])) return '';
	$modelid = $category[$catid]['modelid'];
	if(!$modelid) return '';
	$db = pc_base::load_model('content_model');
	$db->set_model($modelid);
	$r = $db->get_one(array('id'=>$id), '`url`');
	if (!empty($allurl)) {
		if (strpos($r['url'], '://')===false) {
			if (strpos($category[$catid]['url'], '://') === FALSE) {
				$site = siteinfo($category[$catid]['siteid']);
				$r['url'] = substr($site['domain'], 0, -1).$r['url'];
			} else {
				$r['url'] = $category[$catid]['url'].$r['url'];
			}
		}
	}
	
	return $r['url'];
}

phpcms v9中使用memcache

phpcms v9强大倒是一说,一些内置的缓存配置方法却没有明确的教程,比如memcache类。
phpcms已经内置了这个缓存,但一直不知道如何启用。

折腾了一晚,想把phpcms的setcache和getcache方法,配置成可以动态切换缓存类型,类型于ThinkPHP的机制。

最后无奈发现phpcms默认开发好像全是使用文件进行存储。
于是,只能在自己需要的地方加上memcache或者redis了,内核要改的话,也忒麻烦了。

配置文件:
cache/configs/cache.php

<?php

return array (
	'file1' => array (
		'type' => 'file',
		'debug' => true,
		'pconnect' => 0,
		'autoconnect' => 0
		),
	'memcache' => array (
		'hostname' => '192.168.0.106',
		'port' => 11211,
		'timeout' => 3600,
		'type' => 'memcache',
		'debug' => true,
		'pconnect' => 0,
		'autoconnect' => 0
	),
	'redis' => array (
		'hostname' => '192.168.0.106',
		'port' => 6379,
		'timeout' => 0,
		'type' => 'redis',
		'debug' => true,
		'pconnect' => 0,
		'autoconnect' => 0
	)
);

?>

文件配置文件的格式上看,和TP机乎一样,但不支持动态切换。

在需要的地方这样写,这里封装了一个获取记录的方法:

/**
 * 调用一个应用详情
 */
function appdetail($appid, $ttl=0)
{
	if(FALSE == is_int($appid)) return FALSE;
		
	$cache_type = 'memcache';
	$cache_name = sprintf(&quot;app_detail_id_%d&quot;, $appid);

	$cache_config = pc_base::load_config('cache');
	
	/* 系统是否支持 */
	$cache_support = !empty($cache_config[$cache_type]) &amp;&amp; class_exists($cache_type);

	if($cache_support)
	{
		$memcache = cache_factory::get_instance($cache_config)->get_cache('memcache');
		$app = $memcache->get($cache_name);
		$app = unserialize($app);
	}else{
		$app = getcache($cache_name);
	}
	
	if($app === false)
	{
		$db = pc_base::load_model('apps_model');
		$app = $db->get_one(array(&quot;id&quot;=>$appid), &quot;id,name&quot;);

		if($cache_support)
		{
			$memcache = cache_factory::get_instance($cache_config)->get_cache('memcache');
			$memcache->set($cache_name, serialize($app), $ttl);
		}else{
			setcache($cache_name, $app, '', $ttl);
		}
	}

	return $app;
}

大约的功能是检测系统是否支持memcache类,支持的话就直接使用memcache,如果不支持,就使用PHPCMS自带的缓存方法。

继续深入折腾setcache,看看是不是我的理解有误

周末在家折腾了一天,慢慢把PHPCMS的MVC和模板标签pc_tag给做熟了,可以肯定的下结论就是:
PHPCMS会把所有进入模板层的数据,进行数据缓存,比如content_tag.class.php中所有的方法,产生的数据还是会被再一次缓存到文件中。

我使用A机产生memcache的数据memcache_A1,使用PHPCMS调用A1以后,会在PHPCMS硬盘上产生PHPCMS_A1,当我的memcache_A1发生改变时,PHPCMS_A1读取的还是PHPCMS_A1这个缓存。
解决方是在pc_tag中,将缓存设置为0,则可以在后端使用其它缓存工具!

PHPCMSV9上一篇下篇没有内容则返回栏目页

一点小小细节的优化,弹出对话框实再让人受不了。


{if $previous_page[title]!='第一页'}<a href="{$previous_page[url]}" title="{$previous_page[title]}" id="previous_page">上一组图</a>{else}<a href="<?php echo $this->category[url]; ?>" title="<?php echo $this->category[catname]; ?>" id="previous_page">返回栏目</a>{/if}
{if $next_page[title]!='最后一页'}<a href="{$next_page[url]}" title="{$next_page[title]}" id="next_page">下一组图</a>{else}<a href="<?php echo $this->category[url]; ?>" title="<?php echo $this->category[catname]; ?>" id="next_page">返回栏目</a>{/if}

PHPCMSV9相关文章自动调用的实现方法:模板标签实现,无需修改代码

PHPCMSV9的相关文章默认需要在后台设置,前台才能正常调用,如果我们没有统一设置相关文章,那怎么来实现相关文章的调用呢。

阅读本文的同时,我假设你的文档均未设置相关文章,调用方法如下:

实现效果如下:

代码于此:

<div class="numlist wid300">
<div class="h4"> &laquo; 相同类型手机图片推荐</div>
    <ul class="text" id="Larclist">
    	<!--组合模糊搜索SQL字串-->
    	{php $where = '(title like "%'.join('%"  OR title like "%', explode(",", $rs[keywords])).'")';}
        {pc:get sql="SELECT * FROM `www.4wei.cn` where catid ='$catid' and  $where order by id desc" cache="100" num="5" page=""}
        {loop $data $r}
        {php $index++}
        <li>
            {if $index < 4}<span class='num active'>{$index}</span>{else}<span class='num'>{$index}</span>{/if}
            <span class='tit'><a href="{$r['url']}">我是真正的相关文章</A></span>
        </li>
        {/loop}
        {/pc}

        <!--如果相关文章不够,则从相同栏目获取几条数据,开始-->
        {if $index < 5}
        {pc:get sql="SELECT * FROM `www.4wei.cn` where catid ='$catid' order by id desc" cache="100" num="5" page=""}
        {loop $data $r}
        {php $index++}
        <li>
            {if $index < 4}<span class='num active'>{$index}</span>{else}<span class='num'>{$index}</span>{/if}
            <span class='tit'><a href="{$r['url']}">我是相同栏目下的候补文章</A></span>
        </li>
        {/loop}
        {/pc}
        {/if}
        <!--如果相关文章不够,则从相同栏目获取几条数据,结束-->
        <!--
        www.4wei.cn版权所有,盗版没法究
        -->
        {php unset($index);}
    </ul>
</div>
<div class="numlist wid300">
<div class="h4"> &laquo; 其它类型手机图片推荐</div>
    <ul class="text" id="Larclist">
    	{php $where = '(title like "%'.join('%"  OR title like "%', explode(",", $rs[keywords])).'")';}
        {pc:get sql="SELECT * FROM `www.4wei.cn` where catid <>'$catid' and  $where order by id desc" cache="100" num="10" page=""}
        {loop $data $r}
        {$index++}
        <li>
            {if $index < 4}<span class='num active'>{$index}</span>{else}<span class='num'>{$index}</span>{/if}
            <span class='tit'><a href="{$r['url']}">我是其它栏目下的相关文章</A></span>
        </li>
        {/loop}
        {/pc}
    </ul>
</div>

详解于此:

  1. 根据文章的关键字组合模糊搜索SQL
  2. 使用PC的Get标签获取数条相关结果
  3. 假如相关文章数量不足,再从相同栏目获取数条结果充数
  4. 如果你的文章有在后台添加相关文章,如果数量不够,也可以使用这个方法进行补充调用

感谢V9强大的模板标签功能,相信PC会越来越好。

PHPCMS V9 正式版初使用心得

两个月没有登陆DEDE网站,这两天上去发现plus目录下又多了N个木马程序,一阵纠结之后,果段的转移到PC V9上。

PCV9带了DEDE5.6的转换程序,本人使用了转换程序以后,虽然能将DEDE的模型和内容转换到PC,但不能将原栏目的ID,原文章的ID和会员转换到PC中。后经过本人的DIY,暂时实现了原栏目和文章ID的转换,可以方便的实现整站数据的迁移。

继续阅读PHPCMS V9 正式版初使用心得

PHPCMS问吧采集程序

尘缘于3年前开发了DEDE的问答程序发布接口,受到不少用户好评。

因为此接口是尘缘早期的接口,技术与代码规范尚不成熟,加上DEDE的模型设计并不十分优秀,所以,一直想用PHPCMS来创建一个负载量好的问答自动采集程序。

这段时间受用户委托,开发了这样一个程序,现将一些思路和功能展示于后。

  1. 要实现无人值守,无须开机,自动采集更新问题,添加问题回复,添加问题最佳答案;
  2. 同步实现问答栏目自动创建,用户自动创建;
  3. 实现采集过程缓存化,以实现快速除重并更新已有问题
  4. 智能判断问题状态,如果问题已经存在、回答已经存在、问题过期或者已经解决的分析

经过一定时间的研究,已经将上述功能一一实现,以下列出一定的技术思路

  1. 使PHP能在用户关闭浏览器的状态下继续执行程序,不限制超时,这样可以让PHP程序在服务器上不间断执行采集过程;
  2. 添加事件触发功能,当PHP后台程序检测到停止运行的命令时,停止后台运行,并释放资源;
  3. 添加问题时,将问题编号和回复编号做为缓存条件,最佳答案以发布时间为判断条件实现数据自动更新

以上核心功能实现以后,就是按部就班的开发其它小功能了,如添加栏目,添加问题,添加用户,添加回答等。

火车群里有部分同志给我建议加上一个多语言翻译和生成静态的功能,那稍后也会考虑慢慢加上这个功能。

经过数天的开发,我发现PHPCMS真的模型设计比较合理,相当DEDE来说,确实在不同的层次,二次开发非常容易,我接触到的几个功能,基本上无需拿PHPCMS核心代码开刀。PHPCMS的模块开发非常容易,开发过程真的很简单,很惬意。

这么几年一直没用PHPCMS,这里表示下对自己的遗憾。

以下是采集程序的安装方法:

安装方法:
1,登陆PHPCMS后台,安装问答模块,设置Ucenter通行证
2,将c.sql中的SQL在Mysql中执行一下,注意表前缀请根据实际情况修改,默认为phpcms_
3,将压缩包中所有文件上传到phpcms/Ask目录下
4,使用浏览器访问phpcms/ask/control.php或者在模板中使用Js调用phpcms/ask/control.php

使用说明:
1,本程序理论上可以365天无人值守运行,但遇到采集出错、数据为空、服务器当机等情况,需要人工重新启动采集进程,可以使用浏览器访问phpcms/ask/control.php
2,如果在模板中使用Js调用则可以避免上述问题,调用方法为
3,程序自动根据问题所属分类,自动创建多级分类,请定期登陆后台手工更新问吧栏目缓存

注意事项:
1,当百度知道的采集规则发生变化时,请不要继续采集操作,以免采集到错误的数据
2,有问题请联系尘缘,QQ:130775

程序开发半个月完成,部署到客户服务器上以后,出现了线程问题、内存占用等问题,经过一个月的跟踪修复,目前这套程序运行正常。然后尘缘才敢拿出来叫卖。

目前程序只能采集百度知道,详细功能如下:

  1. 全自动采集入库功能:实时循环采集问题,问题回复,可以准确采集用户信息和时间;
  2. 全自动跟踪更新功能:可以跟踪问题解决状态,添加最佳答案,解决问题;
  3. 个性化需求采集功能:可以自定义采集分类、问题类型,采集线程和间隔时间;
  4. 全程无人值守采集,无需人工干预,需要了解购买程序的同学请加QQ:130775。

程序效果预览: