自己的小结
Aug 31
#### 一.服务器端支持 ####

1. openoffice.org3.0 + jodconverter + swftools



原理:开启openoffice监听,利用jodconverter调用oo3的转换脚本将 office文件转换成pdf文件。

          再通过swftools将pdf文件转换为swf文件



前提:安装OpenOffice,安装OpenOffice SDK3.3,jodconverter及swftools,并开启openoffice监听

环境变量:

export PATH=$PATH:/usr/local/swftools/bin/




shell下命令:



第一步:开启openoffice监听 8100端口

export DISPLAY=localhost:2.0

Xvfb :2 -screen 0 800x600x24 2> /dev/null &

/usr/lib/libreoffice/program/soffice --accept="socket,host=localhost,port=8100;urp;StarOffice.ServiceManager" --nologo --headless --nofirststartwizard --display :2 &



第二步:通过jodcconverter转换文档成pdf

java -jar /opt/jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar /opt/lampp/htdocs/sociax/1.txt /opt/lampp/htdocs/sociax/text.pdf



第三步:将pdf转化为swf、txt文件

//转化为swf -- 展示用
pdf2swf -s languagedir=/usr/local/xpdf-chinese-simplified -T 9 -s poly2bitmap -s zoom=72 -s flashversion=9 "/opt/123.pdf" -o "/opt/test/1.swf"
pdf2swf -s languagedir=/usr/local/xpdf-chinese-simplified -T 9 -s poly2bitmap -s zoom=30 -p 1 -s flashversion=9 "/opt/123.pdf" -o "/opt/test/1.swf"



//转化为txt纯文本 -- sphinx搜索用

pdftotext -q "/opt/lampp/htdocs/sociax/1.pdf" "/opt/lampp/htdocs/sociax/1.txt"







#### 二. java程序 ####



说明:通过计划任务定时执行java程序,通过java程序执行文档转化命令,转化文档。

注:如果能实现java程序内部监听,不需要服务器端计划任务配置,则为更佳的方案。





java程序结构



1. sociax.java

方法:main()

实现://伪代码



     loadConfig ()                    // 载入配置 conf/sociax.xml

     startTransformListener ()   // 调用转化(监听)程序,文件名称 :src/SociaxTransAdmin.java





2. conf/sociax.xml

要求:

能配置sociax数据库信息,包括host,port,database,username,password, prefix (表前缀)

转化信息:limit 单次转化的文件个数上限, filedir:文件路径前缀

能配置转化命令:(由于不同服务器安装的环境可能有区别)

com_file2pdf:java -jar /opt/jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar $fileoffice $filepdf

com_pdf2swf: pdf2swf -s languagedir=/usr/local/xpdf-chinese-simplified -T 9 -s poly2bitmap -s zoom=150 -s flashversion=9 "$filepdf" -o "$fileswf"

com_pdf2txt:pdftotext -q "$filepdf" "$filetxt"





mysql
127.0.0.1
3306
root
123456
sociax
sociax_



20
/usr/data



java -jar /opt/jodconverter-2.2.2/lib/jodconverter-cli-2.2.2.jar $fileoffice $filepdf
pdf2swf -s languagedir=/usr/local/xpdf-chinese-simplified -T 9 -s poly2bitmap -s zoom=150 -s flashversion=9 "$filepdf" -o "$fileswf"
pdftotext -q "$filepdf" "$filetxt"



实现可参考:pdf2swf/conf/sociax.xml



3.sociaxTransAdmin.java

方法:startTransformListener()



参数:无

实现://伪代码



    initData();           //初始化数据将需要转化的内容导入到转换缓冲表

    trans_list =  getData();           //获取需要转化的数据 ,最多limit个,并保存到转换队列 变量 trans_list 中

    doTrans(trans_list);           //执行转化





方法:initData();

参数:无

实现:需要执行下面的sql:注意将里面的sociax_替换为配置的表前缀

String sql = "insert into  `sociax_document_cache` (aid,status,cTime)

select attach_id,0,ctime from sociax_doc where attach_id > ( select IFNULL(max(aid),0) from `sociax_document_cache` ) ";



参考:CrawlingFile.java 里面的 insertNoneTransformDoc函数



方法:getData();

参数: 自己定义

实现:需要执行下面的SQL,并返回结果,其中config.limi为配置的单次最多转化数

String sql="select doc.id,doc.aid,CONCAT(attach.save_path,'',attach.save_name) as outputFile from sociax_document_cache as doc left join sociax_attach as attach on  attach.attach_id = doc.aid where doc.status='0' limit 0,"+config.limit;





方法:  doTrans(trans_list);

参数:无

实现:伪代码

if( empty(trans_list) ){ return false;} //如果转化队列为空,则不执行转化操作

start();                                          //开始转化服务 -- 可能需要开启一些服务之类的,待调试

trans_ids = array();                        //转换的文件的id集合  

//开始对转换队列进行转化操作

for(i=0; i
     transfile(file);                           //单个文件的转化操作          

     ids []

}

updateDataBase(trans_ids);           //通过trans_ids集合将缓存表里面的status更新为1

stop();                                          //停止转化服务 -- 可能需要关闭一些服务之类的,待调试





方法:transfile(file)

参数:file,要转化的源文件

实现:伪代码

filepdf = file+'.pdf'   //新的pdf文件地址



if(file_exsit(filepdf)){ //判断新的pdf文件是否存在,存在则不继续下面操作 -- 不知道java里面怎么实现,交给你研究

     return false;

}



//判断是否为pdf文件,如果不是则执行转化命令,将文件转化成pdf,否则直接复制一份文件到pdf

if( !ispdf(file) ){

     do_commond = com_file2pdf; //转化成pdf的命令处理,注意源文件和目标文件

     xx.runcommend(do_commond);

}else{

     xx.runcommend('cp '+file+' '+filepdf);     //直接拷贝

}



//由于转化pdf需要一定时间,在转化成swf前要判断是否已经转化完了

//判断上一个执行操作是否结束 -- 不知道怎么实现的 看小鹏的ServiceAdmin.java: 里面有个isDone

if(xx.isDone()){

     do_commond =com_pdf2swf

     //将文件转化称swf

      xx.runcommend(do_commond);

     //将文件转化称txt 可以和上个命令一起执行,不需要判断是否已经执行完了

     do_commond =com_pdf2swf

     xx.runcommend(do_commond);

}





方法:updateDataBase(ids);

参数:ids,本次转化的文档id集合

实现:执行下面的sql,后面的in ids 需要java处理好

String sql = " update sociax_document_cache set status = 1 where  id in (''+ids+")";







#### 3.数据库修改 ####

新加一张文档转化cache表

CREATE TABLE IF NOT EXISTS `sociax_document_cache` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `aid` int(11) NOT NULL,

  `status` tinyint(2) NOT NULL,

  `cTime` int(11) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;






#### 4. flexpaper显示swf部分 ####

这部分比较简单,后续补充






Dec 1
1.PHP 读取XML

2.PHP GD库使用

3.PHP 读取大文件
fseek

4.MYSQL INNODB和MyISAM区别

1.INNODB支持事务,MyISAM不支持事务

2.索引上的差别

3....
May 13
9.模型
9.1实例化模型类

  //实例化空类
  $demo=new Model();
  //实例化基础类
  $demo=new Model('Demo');
  $demo=M('Demo');
       //实例化其他类,包括用户自定义类
  $demo=new DemoModel('Demo');
  $demo=D('Demo');
  //实例化项目Admin下的demo类
  $demo=D('Demo','Admin');


9.2模型命名
protected $tableName=""; 不带前后缀的表名
protected $trueTableName=""; 带前后缀的表名
protected $dbName=""; 数据库名

9.3创建数据
//会进行相关验证
$M->create($data);
//纯数据操作 无验证
$M->data($data);
$M->add();//保存数据

//模型测试
  public function dmt(){
    $d=M('Demo');
    //$i=$d->find(1);
    $i=array('title'=>'mytitke'.rand(0,19),'content'=>'mycontent'.rand(20,100));
    //直接保存数据 可连贯操作
    $d->data($i)->add();
    //通过create需要传入验证码  
    $i['__hash__']=$_SESSION['__hash__'];
    $d->Create($i);
    $d->add();
    //删除操作  
    $d->where('id between 10 and 20')->delete();
    //得到结果并输出
    $l=$d->where('id>1')->order('id desc')->limit('2,4')->select();
  }


9.4ActiveRecord模式
TP的AR模式就是 将表映射到model,将记录映射到对象~

//ActiveRecord模式
  public function tar(){
    $ar=D('Demo');
    //根据title 获取数据 保存在当前对象中
    $ar->getByTitle('hello title');
    echo $ar->id;   //7
    //根据content 获取数据 保存在当前对象中(其实是修改了当前对象)
    $ar->getByContent('mycontent93');
    echo $ar->id;   //5
    $ar->delete();   //  删除当前对象 即ID=5的数据
    $ar->delete('6,7'); // 删除ID=6,7的数据
  }


9.5 令牌验证 {__TOKEN__}
9.6 字段类型检查 DB_FIELDTYPE_CHECK
9.7 自动验证 protected $_validate
9.8 自动完成 protected $_auto
9.10
May 13
可能后面的工作要涉及到thinkphp了 那咱就来看看tp吧,下面是我看tp过程记录的点滴。

1.关于include/require文件内 return值
以前有遇到过,没在意。现在正是写入记忆里。
demo代码:

<?php
#require.php
return array('hello'=>'moto');
?>

#index.php
<?php
$d=require('require.php')
print_r($d)
?>
#打印结果#
Array ( [hello] => moto )


2.利用spl_autoload_register()重置自动加载函数
以前知道spl_autoload_register(func) 可以指定func来优先系统自带的_autoload()来执行类加载
今天看了tp里面的发现 spl_autoload_register()可以指定类的某个函数来进行类加载
真像如下:

#E:\www\thinkphp\ThinkPHP\Lib\Think\Core\App.class.php (61)
// 允许注册AUTOLOAD方法
        if(C('APP_AUTOLOAD_REG') && function_exists('spl_autoload_register'))
            spl_autoload_register(array('Think', 'autoload'));

#E:\www\thinkphp\ThinkPHP\Lib\Think\Core\Think.class.php (70)
  public static function autoload($classname)
    {
        // 检查是否存在别名定义
        if(alias_import($classname)) return ;
        // 自动加载当前项目的Actioon类和Model类
        if(substr($classname,-5)=="Model") {
            require_cache(LIB_PATH.'Model/'.$classname.'.class.php');
        }elseif(substr($classname,-6)=="Action"){
            require_cache(LIB_PATH.'Action/'.$classname.'.class.php');
        }else {
            // 根据自动加载路径设置进行尝试搜索
            if(C('APP_AUTOLOAD_PATH')) {
                $paths  =   explode(',',C('APP_AUTOLOAD_PATH'));
                foreach ($paths as $path){
                    if(import($path.$classname))
                        // 如果加载类成功则返回
                        return ;
                }
            }
        }
        return ;
    }



3.项目编译机制
系统第一次运行时自劢生成核心缓存文件~runtime.php和顷目编译缓存文件~app.php。

可以对项目编译机制进行自定义设置
自定义缓存文件路径:在入口文件里添加常量define('RUNTIME_PATH','./home/temp/');
自定义是否生成核心缓存:define('NO_CACHE_RUNTIME',True);
是否留白和注释:define('STRIP_RUNTIME_SPACE',false);

4.URL访问模式
普通URL格式http://localhost/home/index.php?m=modelN&a=actionN&var=value
PATHINFO格式  http://localhost/home/index.php/modelN/actionN/var/value
REWRITE格式 http://localhost/home/modelN/actionN
默认路径 http://localhost/home/index.php/index/index

5.TP的文件访问模式(默认的各种路由形式)
5.1模块的引入 APP名称/Lib/Action/具体文件
如:IndexAction.class.php Home/Lib/Action/IndexAction.class.php
5.2模板的引入 APP名称/Tpl/default/模块名称/具体动作名文件(.html)
如:IndexAction.class.php 中的help方法的模板路径为  Home/Tpl/default/index/help.html
【注:当IndexAction.class.php不存在help方法而模板却存在时,TP会直接渲染模板文件】
5.3类的导入 import(命名空间.路径.类名)
ThinkPHP约定是Think、ORG、Com包的导入以系统基类库为相对起始目录,否则就认为是项目应用类库为起始目录
如:import("Think.Util.Session") 将引入:ThinkPHP/Lib/Think/Util/Session.class.php文件
import("Home.myclass") 将引入:Home/Lib/myclass.class.php文件
以上也可以用另外一种简化方法:import("@.myclass");
用#代替类名中的. 如Home/Lib/myclass.inc.class.php 的导入方法为 import("Home.myclass#inc");
导入当前目录下的类文件myclass.inc.class.php方法: import("myclass#inc",dirname(__FILE__));
5.4 第三方类库导入 Vendor
第三方类库统一放在thinkPHP/Vendor/下
如要导入thinkPHP/Vendor/Zend/Auth.php方法:Vendor('Zend.Auth');

Apr 29
1.类文件以.class.php结尾 使用首字母大写驼峰写法 如:DbMysq.class.php
2.类名与文件名(不带后缀)一致 如DbMysql类的文件名是DbMysq.class.php
3.函数名,数据表和字段使用小写字母和下划线方式:如get_client_ip,think_user
4.Action控制器以Action为后缀,如UserActioin
5.模型名以Model为后缀,如UserModel
6.属性和方法名使用首字母小写驼峰法,如getUserName,fatherName
7.参数配置,常量,语言变量以大写字母和下划线组成

分页: 1/7 第一页 1 2 3 4 5 6 7 下页 最后页 [ 显示模式: 摘要 | 列表 ]