찾다
백엔드 개발PHP 튜토리얼php生成静态页面的办法_PHP

首先说原理。某驼查了那么多资料,发现不管用什么方法,原理都是一样的。就是用程序读取相应的数据来替换模版中的变量,然后生成静态页。php中主要用到的就是要用到fread()和fwirte()。而静态页面生成了之后,就会牵扯到修改的问题。这里可以用到正则匹配的方法来替换模版中改变的部位。不过此种方法太麻烦,驼驼推荐的方法是直接把原来生成的模版砍掉,重新生成,呵呵,真正的一了百了。

还需要说明的一点就是,这种生成静态页面的方法一般都用于那些变化不是很频繁的页面,比如信息的最终页面。而针对列表页,如果信息更新不是很频繁的话,也是可取的。现在网上流行好多可以生成静态页面的blog或者论坛程序,都是通过手动点击后台“生成html页”的按钮来“半自动”生成html的。而对一些信息量非常大的门户网站,则行不通。因为静态页之所以叫“静态”,是因为其不可自动改变。如果信息列表每天更新100次,那么静态的列表页就要重新生成100次。如果我有10个这样的栏目,那想想也够吐血的了。

好了,闲话少说,现在来看看实际的程序演示:

first:是一个利用ob函数来做的咚咚,代码比较简单,效率相对也高一些。某驼从某个

高人处得到的源码,做了一些改动

@readfile("http://localhost/?package=pricab&place_port=4");
$text = ob_get_flush();
$myfile = fopen("myfile.html","w");
$text = str_replace ("{counent}",$string,$text);    
fwrite($myfile,$text);    
ob_clean();
?>

因为就算要生成静态页面,动态读取那部分也是要保留的,把数据插入数据库后,把url传递给readfile函数,然后读入缓存,fwrite一下就可以生成静态页面,这个是驼驼最欣赏的一种作法。代码行数最少,效率最高。驼驼这边要求http://localhost/?package=pricab&place_port=4是一个裸页,也就是单纯的内容,没有头,尾,菜单。这样才能比较自由的定制自己的模版myfile.html。如果仅仅是要求生成静态页的话,
ob_start();    
@readfile("http://localhost/?package=pricab&place_port=4");    
$string = ob_get_flush();
$myfile = fopen("myfile.html","w");    
fwrite($myfile,$string);    
ob_clean();

就可以over了

second:普通生成静态html页。

这种作法就是按部就班的来做,fread进来页面,然后str_replace替换

首先是创建最终内容页:

$title = "http://siyizhu.com测试模板";  
$file = "TwoMax Inter test templet,
author:[email=Matrix@Two_Max]Matrix@Two_Max[/email]";
$fp = fopen ("temp.html","r");  
$content = fread ($fp,filesize ("temp.html"));  
$content = str_replace ("{file}",$file,$content);  
$content = str_replace ("{title}",$title,$content);  
$filename = "test/test.html";  
$handle = fopen ($filename,"w"); //打开文件指针,创建文件   /*  检查文件是否被创建且可写   */   if (!is_writable ($filename))
{     die ("文件:".$filename."不可写,请检查其属性后重试!");   }  
if (!fwrite ($handle,$content)){ //将信息写入文件     die ("生成文件".$filename."失败!");   }    
fclose ($handle); //关闭指针    die ("创建文件".$filename."成功!");

这一步比较简单。只是单纯的变量替换即可。如果要生成静态的列表页面的话,原理也是一样,用程序来生成文章列表,把它当成一个大的变量,替换模版中的变量,列表的翻页页是如此。当然,如果有信息更新的话,列表翻页也是要重新生成的。

$title = "http://";    
$file = "TwoMax Inter test templet,
author:[email=Matrix@Two_Max]Matrix@Two_Max[/email]";    
$fp = fopen ("temp.html","r");    
$content = fread ($fp,filesize ("temp.html"));    
$content = str_replace ("{file}",$file,$content);    
$content = str_replace ("{title}",$title,$content);    
// 生成列表开始    
$list = '';    
$sql = "select id,title,filename from article";    
$query = mysql_query ($sql);    
while ($result = mysql_fetch_array ($query)){    
$list .= ''.$result['title'].'
';    }    
$content .= str_replace ("{articletable}",$list,$content);     //生成列表结束  
// echo $content;    
$filename = "test/test.html";    
$handle = fopen ($filename,"w"); //打开文件指针,创建文件  
/*  检查文件是否被创建且可写    */    if (!is_writable ($filename)){     die ("文件:".$filename."不可写,请检查其属性后重试!");    }    if (!fwrite ($handle,$content)){ //将信息写入文件     die ("生成文件".$filename."失败!");    }     fclose ($handle); //关闭指针     die ("创建文件".$filename."成功!"); ?>

关于翻页:
 
如我们指定分页时,每页20篇。某子频道列表内文章经数据库查询为45条,则,首先我们通过查询得到如下参数:1,总页数;2,每页篇数。第二步,for ($i = 0; $i

$content = fread ($fp,filesize ("temp.html"));
$onepage = '20';
$sql = "select id from article where channel='$channelid'";
$query = mysql_query ($sql);
$num = mysql_num_rows ($query);
$allpages = ceil ($num / $onepage);
for ($i = 0;$i{ if ($i == 0){ $indexpath = "index.html"; }
else { $indexpath = "index_".$i."html"; }
$start = $i * $onepage; $list = '';
$sql_for_page = "select name,filename,title from article where channel='$channelid' limit $start,$onepage";
$query_for_page = mysql_query ($sql_for_page);
while ($result = $query_for_page){ $list .= ''.$title.'
'; }
$content = str_replace ("{articletable}",$list,$content);
if (is_file ($indexpath)){ @unlink ($indexpath); //若文件已存在,则删除 } $handle = fopen ($indexpath,"w"); //打开文件指针,创建文件 /*  检查文件是否被创建且可写 */ if (!is_writable ($indexpath)){ echo "文件:".$indexpath."不可写,请检查其属性后重试!"; //修改为echo } if (!fwrite ($handle,$content)){ //将信息写入文件 echo "生成文件".$indexpath."失败!"; //修改为echo } fclose ($handle); //关闭指针 }
fclose ($fp); die ("生成分页文件完成,如生成不完全,请检查文件权限系统后重新生成!");?>
third:smarty模版生成静态页面
驼驼是用smarty模版的,smarty自己有一个fetch函数,其功用有点类似于fread()可以用来生成静态的页面.
这个例子大家想必看起来眼熟,对,smarty手册中关于fetch函数的例子,hoho 某驼借用一下,比竟官方的例子总是很经典的嘛!
$smarty = new Smarty;
$smarty->caching = true;
// only do db calls if cache doesn't exist if(!$smarty->is_cached("index.tpl")) {  
// dummy up some data   $address = "245 N 50th";  
$db_data = array(                
"City" => "Lincoln",                
"State" => "Nebraska",                
"Zip" => "68502"              
);  
$smarty->assign("Name","Fred");  
$smarty->assign("Address",$address);  
$smarty->assign($db_data); }
// capture the output $output = $smarty->fetch("index.tpl");
//这个地方算是关键// do something with $output here echo $output; //hoho
看到output的结果了吧
然后呢?fwrite一下,我们就得到我们所要的结果了。
$fp = fopen("archives/2005/05/19/0001.html", "w");
fwrite($fp, $content);fclose($fp);
?>
$content = ob_get_contents();//取得php页面输出的全部内容
$fp = fopen("archives/2005/05/19/0001.html", "w");
fwrite($fp, $content);
fclose($fp);
?>
PHP生成静态页面类
/*********************/
/*                   */
/* Version : 5.2.5 */
/* Author : liqiangwork#sohu.com */
/* QQ : 570937581   */
/*                   */
/*********************/
//-----------------------------生成静态的类-------------------------------
class Makehtml{
   public $MbUrl,$OutUrl,$AllHtml,$SouChar,$ObjChar; //变量
   public $row; //游标
   public $Shuzusou,$Shuzuobj; //替换的字符串数组
   //-----------------------初始化-------------------------
    function __construct(){ //初始化
     $this->MbUrl="";
     $this->OutUrl="";
     $this->AllHtml="";
     $this->Sql="";
     $this->SouChar="";
     $this->ObjChar="";
    }
  
  
   //-----------------------------自动按字段替换---------------------------
    function AutoReplace(){
      //------------------自动获取要替换的字符串-------------------
      $tlen=count($row);
      $shuzu1=array();
      $shuzu2=array();
      if($row){
      $i=0;
      foreach($row as $key => $value){      
     $shuzu2="";
     $shuzu1=$value;
     $i++;
      }
      $this->Replacehtml(shuzu2,shuzu1);
      }
      //------------------自动获取要替换的字符串-------------------
    }
   //-----------------------------自动按字段替换完成------------------------
  
  
   //-----------------------------批量替换数组--------------------------
   function Replacehtml($Shuzusou,$Shuzuobj){ //批量替换数组
    if(count($Shuzusou)!=count($Shuzuobj)){
      exit("替换数组不匹配");
    }
    if($this->AllHtml==""){
      exit("没有要替换的内容");    
    }
    for($i=0;$i     $this->AllHtml=str_replace($Shuzusou[$i],$Shuzuobj[$i],$this->AllHtml);
     //print("
".$Shuzusou(i)."=".$Shuzuobj(i)."
")
   }
   }
   //-----------------------------批量替换数组完成--------------------------
  
   //-----------------------------读取文件---------------------------------
    function Readfile(){
     $file=fopen($this->MbUrl,"r");
     $fsize=filesize($this->MbUrl);
     $this->AllHtml=fread($file,$fsize);
     fclose($file);
       }  
   //-----------------------------读取文件完成------------------------------
   //-----------------------------保存文件---------------------------------
   function SaveFile(){
    $file=fopen($this->OutUrl,"w");
    fwrite($file,$this->AllHtml);
    fclose($file);
   }
   //-----------------------------保存文件完成------------------------------
}
//------------------------------生成静态的类完成-------------------------------

以下为引用的内容:
//------------------静态生成----
     $MyMake=new Makehtml;
     $MyMake->MbUrl="News_Show.shtml";
     $MyMake->Readfile();
     $THTml=$MyMake->AllHtml;
     $shuzu1=array();
     $shuzu2=array();
     $shuzu1[0]="";
     $shuzu1[1]="";
     $shuzu1[2]="";
     $shuzu1[3]="";
     $shuzu1[4]="";
     $shuzu1[5]="";
     $shuzu1[6]="";
     $shuzu1[7]="";
     $shuzu1[8]="";
     $shuzu1[9]="";
     $shuzu1[10]="";
     $shuzu1[11]="";
     $shuzu1[12]="width=\"100%\"";
     $MyMake->OutUrl="News_show_1.shtml";
     $shuzu2[0]="数组0";
     $shuzu2[1]="数组1";
     $shuzu2[2]="数组2";
     $shuzu2[3]="数组3";
     $shuzu2[4]="数组4";        
     $shuzu2[5]="数组5";
     $shuzu2[6]="数组6";
     $shuzu2[7]="数组7";
     $shuzu2[8]="数组8";
     $shuzu2[9]="数组9";
     $shuzu2[10]="数组10";
     $shuzu2[11]="数组11";
     $shuzu2[12]="width=\"95%\"";
     $MyMake->Replacehtml($shuzu1,$shuzu2);
     $MyMake->SaveFile();
    //------------------静态生成完成-----------

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
과대 광고 : 오늘 PHP의 역할을 평가합니다과대 광고 : 오늘 PHP의 역할을 평가합니다Apr 12, 2025 am 12:17 AM

PHP는 현대적인 프로그래밍, 특히 웹 개발 분야에서 강력하고 널리 사용되는 도구로 남아 있습니다. 1) PHP는 사용하기 쉽고 데이터베이스와 완벽하게 통합되며 많은 개발자에게 가장 먼저 선택됩니다. 2) 동적 컨텐츠 생성 및 객체 지향 프로그래밍을 지원하여 웹 사이트를 신속하게 작성하고 유지 관리하는 데 적합합니다. 3) 데이터베이스 쿼리를 캐싱하고 최적화함으로써 PHP의 성능을 향상시킬 수 있으며, 광범위한 커뮤니티와 풍부한 생태계는 오늘날의 기술 스택에 여전히 중요합니다.

PHP의 약한 참고 자료는 무엇이며 언제 유용합니까?PHP의 약한 참고 자료는 무엇이며 언제 유용합니까?Apr 12, 2025 am 12:13 AM

PHP에서는 약한 참조가 약한 회의 클래스를 통해 구현되며 쓰레기 수집가가 물체를 되 찾는 것을 방해하지 않습니다. 약한 참조는 캐싱 시스템 및 이벤트 리스너와 같은 시나리오에 적합합니다. 물체의 생존을 보장 할 수 없으며 쓰레기 수집이 지연 될 수 있음에 주목해야합니다.

PHP의 __invoke 마법 방법을 설명하십시오.PHP의 __invoke 마법 방법을 설명하십시오.Apr 12, 2025 am 12:07 AM

\ _ \ _ 호출 메소드를 사용하면 객체를 함수처럼 호출 할 수 있습니다. 1. 객체를 호출 할 수 있도록 메소드를 호출하는 \ _ \ _ 정의하십시오. 2. $ obj (...) 구문을 사용할 때 PHP는 \ _ \ _ invoke 메소드를 실행합니다. 3. 로깅 및 계산기, 코드 유연성 및 가독성 향상과 같은 시나리오에 적합합니다.

동시성에 대해 PHP 8.1의 섬유를 설명하십시오.동시성에 대해 PHP 8.1의 섬유를 설명하십시오.Apr 12, 2025 am 12:05 AM

섬유는 PHP8.1에 도입되어 동시 처리 기능을 향상시켰다. 1) 섬유는 코 루틴과 유사한 가벼운 동시성 모델입니다. 2) 개발자는 작업의 실행 흐름을 수동으로 제어 할 수 있으며 I/O 집약적 작업을 처리하는 데 적합합니다. 3) 섬유를 사용하면보다 효율적이고 반응이 좋은 코드를 작성할 수 있습니다.

PHP 커뮤니티 : 자원, 지원 및 개발PHP 커뮤니티 : 자원, 지원 및 개발Apr 12, 2025 am 12:04 AM

PHP 커뮤니티는 개발자 성장을 돕기 위해 풍부한 자원과 지원을 제공합니다. 1) 자료에는 공식 문서, 튜토리얼, 블로그 및 Laravel 및 Symfony와 같은 오픈 소스 프로젝트가 포함됩니다. 2) 지원은 StackoverFlow, Reddit 및 Slack 채널을 통해 얻을 수 있습니다. 3) RFC에 따라 개발 동향을 배울 수 있습니다. 4) 적극적인 참여, 코드에 대한 기여 및 학습 공유를 통해 커뮤니티에 통합 될 수 있습니다.

PHP vs. Python : 차이점 이해PHP vs. Python : 차이점 이해Apr 11, 2025 am 12:15 AM

PHP와 Python은 각각 고유 한 장점이 있으며 선택은 프로젝트 요구 사항을 기반으로해야합니다. 1.PHP는 간단한 구문과 높은 실행 효율로 웹 개발에 적합합니다. 2. Python은 간결한 구문 및 풍부한 라이브러리를 갖춘 데이터 과학 및 기계 학습에 적합합니다.

PHP : 죽어 가거나 단순히 적응하고 있습니까?PHP : 죽어 가거나 단순히 적응하고 있습니까?Apr 11, 2025 am 12:13 AM

PHP는 죽지 않고 끊임없이 적응하고 진화합니다. 1) PHP는 1994 년부터 새로운 기술 트렌드에 적응하기 위해 여러 버전 반복을 겪었습니다. 2) 현재 전자 상거래, 컨텐츠 관리 시스템 및 기타 분야에서 널리 사용됩니다. 3) PHP8은 성능과 현대화를 개선하기 위해 JIT 컴파일러 및 기타 기능을 소개합니다. 4) Opcache를 사용하고 PSR-12 표준을 따라 성능 및 코드 품질을 최적화하십시오.

PHP의 미래 : 적응 및 혁신PHP의 미래 : 적응 및 혁신Apr 11, 2025 am 12:01 AM

PHP의 미래는 새로운 기술 트렌드에 적응하고 혁신적인 기능을 도입함으로써 달성 될 것입니다. 1) 클라우드 컴퓨팅, 컨테이너화 및 마이크로 서비스 아키텍처에 적응, Docker 및 Kubernetes 지원; 2) 성능 및 데이터 처리 효율을 향상시키기 위해 JIT 컴파일러 및 열거 유형을 도입합니다. 3) 지속적으로 성능을 최적화하고 모범 사례를 홍보합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경