解决删除TXT章节内容缓存后就无法再生成问题。

anquye   ·   发表于 2019-11-5   ·   BUG建议

也不知道这算不算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万,但是打开很慢,感觉缓存不起效果,不知道大家有没有碰到,如果大家有好的优化方案麻烦分享一下。

6 条回复   |  直到 2022-8-14 | 806 次浏览

jiangxibaiyi
发表于 2019-11-5

其实不要你这么费事,只要在第275行下面加一行,写入如下代码即可:

!file_exists(Env::get('runtime_path').'txt/'.$chapter['path']) && $chapter['auto'] = 2;

你试试?

狂雨原来的逻辑是关键点是在这里

章节内容在数据库保存中有一个字段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行下面加一行,写入如下代码即可:

!file_exists(Env::get('runtime_path').'txt/'.$chapter['path']) && $chapter['auto'] = 2;

你试试?

狂雨原来的逻辑是关键点是在这里

章节内容在数据库保存中有一个字段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

看了两个大佬的,发现其实并没有判断本地有没有缓存,没有再生成,而是不管你有没有,都重新生产,这样会有一个问题,就是会导致访问章节和缓存没有失效,因为你每次都会去缓存,那结果还是没开缓存,所以楼主才会说缓存没效果

又认真看代码么?

file_exists

这个函数是干嘛用的?

要不先去看看php手册?

评论列表

  • 加载数据中...

编写评论内容

asdasdwrewr
发表于 2020-10-22

jiangxibaiyi

2019-11-8

又认真看代码么?

file_exists

这个函数是干嘛用的?

要不先去看看php手册?

如果是在阿里云oss,需要怎么改,好像路径不对

评论列表

  • 加载数据中...

编写评论内容

haose
发表于 2022-8-14

各位大佬,有这么好的方法,我即然没有找到,搞得我全部删除了又重新采集,还被搞得很多删除页面出来,这可怎么办,狂雨老大,有没有自动补齐被删除的页面啊?@wuqing

评论列表

  • 加载数据中...

编写评论内容
登录后才可发表内容