也不知道这算不算BUG,问题是这样的,我在采集小说的时候发现章节保存后的结果有问题,所以就修改了下采集规则,但是采集规则改了后不生效,我就删了TXT的章节缓存,是想让它重新保存章节内容,但是发现前台打开是空白的,问题是只保存一次,所以修改了下,下面的方法是如果开启了保存章节又把章节内容缓存删了的情况下,有一个判断如果缓存不存在,不存在就会再生成。
修改文件:
/application/common/model/Api.php
将319行
$chapter['content']=$this->get_chapter_content($chapter['path']);
替换为:
$path = Env::get('runtime_path').'txt/'.$chapter['path'];
//判断文件是否存在
if(!file_exists($path)){
$getchapter=Gather::get_chapter_content($chapter_data['collect_id'],$chapter['reurl']);
if($getchapter!==false){
$word=mb_strlen($getchapter['chapter_content']);
if($word>500 && Config::get('web.chapter_txt')){
$this->set_chapter_content($chapter['path'],$getchapter['chapter_content']);
$chapter_data['chapter'][$key]['auto']=0;
$chapter_data['chapter'][$key]['word']=$word;
if(!empty($getchapter['chapter_title'])){
$chapter_data['chapter'][$key]['title']=$getchapter['chapter_title'];
}
$chapter_data['chapter']=json_encode($chapter_data['chapter']);
$chapter_data['chapter']=$this->compress_chapter($chapter_data['chapter']);
Db::name('novel_chapter')->update($chapter_data);
$novel_data=['word'=>Db::raw('word+'.($word-$chapter['word']))];
Db::name('novel')->where(['id'=>$chapter['novel_id']])->update($novel_data);
}
$chapter['word']=$word;
$chapter['title']=empty($getchapter['chapter_title'])?'':$getchapter['chapter_title'];
$chapter['content']=empty($getchapter['chapter_content'])?'章节内容转码失败!':$getchapter['chapter_content'];
}else{
$chapter['content']='章节内容转码失败!';
}
}else{
$chapter['content']=$this->get_chapter_content($chapter['path']);
}
不过我这里还有一个问题,采集内容有19万,但是打开很慢,感觉缓存不起效果,不知道大家有没有碰到,如果大家有好的优化方案麻烦分享一下。
jiangxibaiyi
发表于 2019-11-5
其实不要你这么费事,只要在第275行下面加一行,写入如下代码即可:
你试试?
狂雨原来的逻辑是关键点是在这里
章节内容在数据库保存中有一个字段auto, 默认是值是2
在第296行
}elseif($chapter['auto']==2){
..........
这一段,表示如果auto是2,说明是没有采集过具体内容的,便会去采集
然后修改这条记录的auto字段为0,在第303行$chapter_data['chapter'][$key]['auto']=0;
在第二次运行的时候,这个字段如果是0, 标识已经有缓存了,不再采集,直接读取缓存!
但你缓存删了,数据库的这个字段还是0, 还是会认为有缓存而不采集!
那么, 在开始判断之前,加一条我上面的代码,先去判断缓存是否存在,如果不存在,则重新设置auto字段等于2, 那么下面的if判断就自然会进入采集并缓存下来!
所以没必要你这代码这么繁琐和重复!
评论列表
加载数据中...
anquye
发表于 2019-11-5
jiangxibaiyi
2019-11-5
其实不要你这么费事,只要在第275行下面加一行,写入如下代码即可:
你试试?
狂雨原来的逻辑是关键点是在这里
章节内容在数据库保存中有一个字段auto, 默认是值是2
在第296行
}elseif($chapter['auto']==2){
..........
这一段,表示如果auto是2,说明是没有采集过具体内容的,便会去采集
然后修改这条记录的auto字段为0,在第303行$chapter_data['chapter'][$key]['auto']=0;
在第二次运行的时候,这个字段如果是0, 标识已经有缓存了,不再采集,直接读取缓存!
但你缓存删了,数据库的这个字段还是0, 还是会认为有缓存而不采集!
那么, 在开始判断之前,加一条我上面的代码,先去判断缓存是否存在,如果不存在,则重新设置auto字段等于2, 那么下面的if判断就自然会进入采集并缓存下来!
所以没必要你这代码这么繁琐和重复!
评论列表
加载数据中...
asdasdwrewr
发表于 2019-11-7
看了两个大佬的,发现其实并没有判断本地有没有缓存,没有再生成,而是不管你有没有,都重新生产,这样会有一个问题,就是会导致访问章节和缓存没有失效,因为你每次都会去缓存,那结果还是没开缓存,所以楼主才会说缓存没效果
评论列表
加载数据中...
jiangxibaiyi
发表于 2019-11-8
asdasdwrewr
2019-11-7
看了两个大佬的,发现其实并没有判断本地有没有缓存,没有再生成,而是不管你有没有,都重新生产,这样会有一个问题,就是会导致访问章节和缓存没有失效,因为你每次都会去缓存,那结果还是没开缓存,所以楼主才会说缓存没效果
又认真看代码么?
这个函数是干嘛用的?
要不先去看看php手册?
评论列表
加载数据中...
asdasdwrewr
发表于 2020-10-22
jiangxibaiyi
2019-11-8
又认真看代码么?
这个函数是干嘛用的?
要不先去看看php手册?
如果是在阿里云oss,需要怎么改,好像路径不对
评论列表
加载数据中...
haose
发表于 2022-8-14
各位大佬,有这么好的方法,我即然没有找到,搞得我全部删除了又重新采集,还被搞得很多删除页面出来,这可怎么办,狂雨老大,有没有自动补齐被删除的页面啊?@wuqing
评论列表
加载数据中...