<?php
/**
* @author:jiangzaixing 20160314
* 获取静态文件方法
*/ class StaticFile
{
const MAP_FILE_NAME = 'map.json';
static public $files = null;
static public $fileMap = null; //静态文件地址对应map //要操作的目录
static public $pathList = array(
'image/',
'css/',
'js/'
);
//需要压缩的文件
static public $extList = array(
'js','css','gif','jpg','png'
); static public $toPath = 'scripts/temp/'; /**
* 获取最新的静态文件
* @param string $fName 文件名称
*/
static public function getFile( $fName ){ $from = dirname(__FILE__).'/../../scripts/' ;
$to = dirname(__FILE__).'/../../scripts/temp/'; if( !self::$fileMap )
self::$fileMap = json_decode( file_get_contents( $to.self::MAP_FILE_NAME ) ,true );
return self::$fileMap[md5($fName)]; } /**
* 批量生成新的静态文件
*/
static public function genFiles(){ $from = dirname(__FILE__).'/../../scripts/' ;
$to = dirname(__FILE__).'/../../scripts/temp/' ; foreach( self::$pathList as $path ){
self::scanfDir( $from.$path );
} foreach ( self::$files as $file ){
self::genFile( $file , $from , $to);
} $sMap = file_put_contents( $to.self::MAP_FILE_NAME, json_encode( self::$fileMap ) ); } static public function scanfDir( $dir , $level = 0 ){
if(( $level == 0 &&!is_dir($dir)) || !is_readable($dir)){
return array( 'isOk'=>false , 'msg'=>"$dir 路径无效" );
}
$handler = opendir($dir);
while( false !== ($file = readdir($handler)) ){
if(in_array($file,array('.','..'))) continue;
if(is_dir( $dir.$file )){
self::scanfDir( $dir.$file."/", $lev = $level+1 );
continue;
}
self::$files[] = $dir.$file;
}
closedir($handler);
} /**
* 创建多级目录
*/
static public function createDir( $path ){
if (file_exists($path))
return true;
self::createDir(dirname($path));
mkdir($path, 0777);
} /**
* 替换css中图片地址 只能写死了。
*/
static public function replaceCssImg( $content , $from , $to ){
$ret = preg_replace_callback('/url\(\/scripts\/([\s\S]*?)\)/',function( $m ){
$_idx = md5( $m[1] );
return '/scripts/temp/'.self::$fileMap[$_idx];
}, $content);
unset( $content );
return $ret;
} /**
* 生成对应文件
*/
static public function genFile( $file, $from ,$to ){
$len = strlen( $from );
//获取文件在目录中的目录结构 创建文件夹
$info = pathinfo($file);
$relUrl = substr( $file, $len );
$_path = dirname( $relUrl );
self::createDir( $to.$_path );
//获取静态文件内容
$_fcontent = file_get_contents($file);
if( $info['extension'] == 'css' )
$_fcontent = self::replaceCssImg( $_fcontent , $from , $to );
if( in_array( $info['extension'] , self::$extList ) ){
//生成静态文件MD5值
$_idx = md5_file( $file );
$newName = sprintf( '%s.%s.%s', $info['filename'], $_idx, $info['extension']);
file_put_contents( $to.$_path.'/'.$newName, $_fcontent);
self::$fileMap[md5($relUrl)] = $_path.'/'.$newName;
}
// 保存文件内容到新文件
$_oname = sprintf( '%s/%s.%s', $to.$_path, $info['filename'], $info['extension'] );
$ret = file_put_contents( $_oname, $_fcontent);
unset( $_fcontent );
return $ret;
}
}

PHP 批量生成静态文件目录代码的更多相关文章

  1. C# 批量生成邮箱地址代码

    如图,是我生成好的5万条邮箱数据, 其实,网上有大量批量生成邮箱的软件,多种多样的生成格式,各种设置,各种组合, 我不需要那么强大,只需要生成不重复的邮箱地址即可,所以,我懒得从网上下载了, 反正就几 ...

  2. velocity生成静态页面代码

    首先需要必备的jar包: web.xml <!-- load velocity property --> <servlet> <servlet-name>veloc ...

  3. 【转】- 使用T4模板批量生成代码

    前言 之前在 “使用T4模板生成代码 - 初探” 文章简单的使用了T4模板的生成功能,但对于一个模板生成多个实例文件,如何实现这个方式呢?无意发现一个解决方案 “MultipleOutputHelpe ...

  4. C# 用模板生成静态页

    最近在研究静态页输出的问题,找了一些资料.做了一个简单的模板模式的静态输出 模板代码: <html xmlns="http://www.w3.org/1999/xhtml"& ...

  5. SpringBoot 利用freemaker生成静态页面

    1. <!-- freemarker模板 --> <dependency> <groupId>org.springframework.boot</groupI ...

  6. php文章内容分页并生成相应的htm静态页面代码

    代码如下: <?php $url='test.php?1=1'; $contents="fjka;fjsa;#page#批量生成分成文件并且加上分页代码"; $ptext = ...

  7. FluentData-新型轻量级ORM 利用T4模板 批量生成多文件 实体和业务逻辑 代码

    FluentData,它是一个轻量级框架,关注性能和易用性. 下载地址:FlunenData.Model 利用T4模板,[MultipleOutputHelper.ttinclude]批量生成多文件 ...

  8. Magicodes.WeiChat——ASP.NET Scaffolding生成增删改查、分页、搜索、删除确认、批量操作、批量删除等业务代码

    关于T4代码生成这块,我之前写过几篇帖子,如:<Magicodes.NET框架之路——让代码再飞一会(ASP.NET Scaffolding)>(http://www.cnblogs.co ...

  9. php 批量生成html,txt文件的方法(实例代码)

    php批量生成html,txt文件的实现代码. 首先,建立一个conn.php 链接数据库. <?php $link = mysql_connect("mysql_host" ...

随机推荐

  1. IOS MBProgressHUD的使用

    一,简介         苹果的应用程序一般都会用一种优雅的,半透明的进度显示效果,不过这个API是不公开的,因此你要是用了,很可能被清除出AppStore.而 MBProgressHUD提供了一个替 ...

  2. Html标签之frameset&图片切换

    今天为大家分享一下刚刚总结好的html经验,以备不时之需. 首先介绍一下frameset标签,此标签用于同一页面内切换网页,在大多数网页中都可以看到,因为项目的需要,故而研究一二. frameset标 ...

  3. Node出错导致运行崩溃的解决方案

    许多人都有这样一种映像,NodeJS比较快: 但是因为其是单线程,所以它不稳定,有点不安全,不适合处理复杂业务: 它比较适合对并发要求比较高,而且简单的业务场景. 在Express的作者的TJ Hol ...

  4. Advice for students of machine learning--转

    原文地址:http://www.mimno.org/articles/ml-learn/ written by david mimno One of my students recently aske ...

  5. LSA,pLSA原理及其代码实现

    一. LSA 1. LSA原理 LSA(latent semantic analysis)潜在语义分析,也被称为 LSI(latent semantic index),是 Scott Deerwest ...

  6. Apache+MySQL+PHP开发环境的搭建(二)

    通过自主选择相应的apache,mysql,php等软件,根据自己的应用开发需求进行安装.此方法搭建的环境自主性较强,搭建过程较为复杂,繁琐. 1.所需软件: Apache: http-2.2.22- ...

  7. PHP学习总结(一)

    对最近学习PHP做个简单的总结吧 书籍:<PHP和MySQL Web开发> 环境/工具:wamp/Editplus&Chrome 时间:8月2日-8月7日 内容: 以前把前3章学了 ...

  8. 【Android】Android ObjectAnimator动画初识、模仿

    ObjectAnimator: ObjectAnimator的概念这里就不解释了,直接从代码中说明,以下是模仿Persicope的加载动画,简单的几行代码即可实现,当然我也是模仿的,更好的实现思路还请 ...

  9. 12种JavaScript MVC框架之比较

    Gordon L. Hempton是西雅图的一位黑客和设计师,他花费了几个月的时间研究和比较了12种流行的JavaScript MVC框架,并在博客中总结了每种框架的优缺点,最终的结果是,Ember. ...

  10. 【转载】谷歌酝酿将苹果Swift作为安卓APP主要开发语言

    TNW中文站 4月8日报道 安卓操作系统的软件开发语言是Java,而在过去几年中,有关Java的版权,谷歌(微博)和甲骨文之间发生了长期的诉讼.最新外媒消息称,谷歌正在考虑将苹果开发的Swift作为未 ...