rtf是一种富文本格式,根据RFC的规范,可以将其转为各种文件,如doc,wps等,但如果真的要根据RFC规范一点点的写程序,那就真的太累了。所以。。。我用wps转换了。
以前写过wps生成文档的程序,就是这篇闲着无聊,用WPS生成文档,现在,这个RTF转换到HTML也可以用PHP来完成
PHP代码
- <?php
- $wps = new COM('WPS.Application');
- $wps->Visible = false; //不显示wps界面
- $filename = realpath('./RTF_to_HTML_Converter.rtf');
- $stime = microtime(1);
- for ( $ii = 0; $ii < 1000; $ii++ ){
- $savedfile = "c:\\convert\\{$ii}_test.html";
- $doc = $wps->Documents->Open($filename);
- $doc->SaveAs($savedfile, 8);
- $doc->Close();
- }
- $wps->Quit();
- echo( sprintf( "%0.6f" , (microtime(1)-$stime) ) );
- unset( $doc , $wps );
测试了一下,生成1000个文件,花了257秒,4分多种,可以接受这个时间,只是在转换的时候,CPU超过50%,而且是在命令行下的。如果是在网页界面肯定是没有这么快的了。
PS:转换后,中文编码实体化了,看看中文怎么转,变成这样的格式,它是什么内容呢?它们就是:【看看中文怎么转】<-- 可以看一下源码,就知道这7个字是什么样的了
目前的国内的微博客很多,不少微博客都提供Open API,然而,很多 微博提供的API和Twitter的API有一些或多或少的差别,调用格式上并不完全相同。
我建议所有提供API的微博客系统,都将各 自的API统一为Twitter的API调用格式,例如目前较有影响的开源微博系统StatusNet(Laconica)的API格式就完全兼容 Twitter,这种统一API对于开发者和用户都有很大的好处。对于开发者,针对某一个微博的应用可以快速移植到另一个微博,节省开发时间。对于用户, 用户可以自定义客户端应用程序,只要换一下API地址,就能使用同一个应用程序,来访问各个不同的微博。例如目前很多人通过StatusNet的客户端来 访问Twitter一样,使用起来很方便。
Twitter的API具体是什么格式的呢?根据Twitter API文档和新浪微博开放平台的文档,这里提供了一个Twitter API的中文翻译文档,供开发者们参考。
» 阅读全文
hooks这玩意,一向是被认为是可扩展的代名词,当一个系统启动了hooks后,他就变得可扩展了,同样,他的性能也就需要被众人拿出来做比较了。
目前被很多人拿来做比较的是两款程序:drupal和wordpress,是使用量最大的博客程序之一,在很多人眼里,这两个程序已经脱离了博客,而是CMS了。drupal前后台不分是我最不舒服的地方,所以wordpress才是我的首选。或许大家看到我的TAG里面还有ThinkPHP和QeePHP,那是因为这两个框架都在考虑有行为加入,行为嘛,相对于框架,就当于一个hooks,所以我也加上了这两个框架
thinkphp的Add_filter,add_action和wordpress有点相像 ,而qee因为没有仔细看过,所以不太清楚(flea的时候好象没这个功能)
跑题半天了。上文了
Drupal怎么就知道什么时候调用一个模块来处理特定的请求?
这个是通过Drupal的hook机制完成的,下面解释一下hook的工作机制。
当Drupal处理来自用户的一个请求,它通过一系列步骤进行。比如:Drupal核心首先引导这个应用,确定关键变量和经常使用的功能。接下来,它加载 关键库、主题和模块。接下来,它继续处理请求,将请求的URI映射到正确的处理代码,等等。然后它为数据应用一个主题,为输出来格式化信息。最后它返回输 出结果到用户的浏览器。
在循序渐进的预定义时刻,Drupal进行勾取。这意味着什么呢?简短的说,它意味着Drupal测试部分或全部当前启用的模块,寻找遵循特定的预定义模 块的函数。一些已经连接这个进程到“回调”的模式经常被用在事件处理模块中。Drupal和这个是类似的,但是更加充满活力。
比如说,当它正在创建一个页面浏览内容时,Drupal可能再模块中寻找叫做<modulename>_block() 和<modulename>_view()的函数(在这里<modulename>被每个Drupal检测的模块的名称代替)。 寻找模块包含的这些函数被叫做实施hook_block()和hook_view()勾取。
当Drupal找到这些函数,它执行它们,并且利用这些函数返回的数据创建一个响应来发送给用户。然后Drupal继续循序渐进的处理请求,或许在它进行 过程中执行许多其它的钩子。
当所有的步骤完成并且一个响应发送给用户,Drupal自动清除并且推出。
模块可以定义自己的钩子,这些钩子又可以被其他模块使用。这样一来,hook机制可以扩展到提供复杂的定制行为。
当一个模块提供匹配一个钩子的签名的功能,我们就说那个模块执行那个钩子。比如,假设Drupal有一个叫做hook_example()的钩子。如果我 们定义一个叫做 mymodule 并且包含一个叫做 mymodule_example() 函数的模块,我们就会用到 hook_example().
Hook对于面向对象程序员的启示:
那些对面向对象编程熟悉的程序员可能发现在面向对象语言中考虑将钩子作为一个类似于接口方法或者抽象方法的机制是很有用的。钩子是Drupal将寻找的函 数并在某些情况下需要出现在你的模块中。就像接口方式,一个钩子的函数签名必须匹配Drupal的预期签名。而和接口不同的是,模块开发者可以选择(在一 定程度上)哪个钩子去实现、哪个钩子去忽视。Drupal不要求每个定义的钩子都实现。
参考:《Learning Drupal 6 Module Development》
原文来自:http://www.cnblogs.com/stylesheet/archive/2010/04/16/1713512.html,上次我也写过wordpress的hooks,其实原理都差不多。
说实话,通过代理访问之类的以前都曾关注过,但伪造来源IP还真没注意过。以下的文章内容我没有测试过,仅仅了解一个想法,或许真可以,或许早就不行。但既然有第一次以后就会有第二次。了解入侵途径、方法,在遇到问题的时候岂不更好、更容易多一个技能来解决它?
原文来自:简单伪造X-Forwarded-For
关于伪造X-Forwarded-For的目的我就不多说了。在入侵一个PHP站,GPC为ON的时候,
字符型注入全部歇菜,而在PHP5中,GPC默认是打开的。但是GPC对$_SERVER无任何影响,
因此可以通过伪造$_SERVER来达到注入的目的。
IP.php中有如下代码,主要是获取客户端IP:
PHP代码
- <?
- function GetIP() {
- if (getenv("HTTP_CLIENT_IP")){
- echo "getenvHTTP_CLIENT_IP";
- $ip = getenv("HTTP_CLIENT_IP");
- }else if (getenv("HTTP_X_FORWARDED_FOR"))
- {
- $ip = getenv("HTTP_X_FORWARDED_FOR");
- echo "getenvHTTP_X_FORWARDED_FOR";
- echo "<br>you are right";
- }else if (getenv("REMOTE_ADDR")){
- echo "getenvREMOTE_ADDR";
- $ip = getenv("REMOTE_ADDR");
- }else{
- echo "unknow";
- $ip = "Unknown";
- }
- return $ip;
- }
- echo GetIp();
- ?>
1.直接访问IP.PHP时,返回getenv REMOTE_ADDR127.0.0.1
2.用NC提交:
GET /1.php HTTP/1.1
Accept: */*
Referer: http://localhost/
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; MAXTHON 2.0)
Host: localhost
Connection: Keep-Alive
Cache-Control: no-cache
X-Forwarded-For: 127.0.0.2
Cookie: rtime=0; ltime=1269249140109; cnzz_eid=64110124-1269242429-; language=zh-cn; PHPSESSID=ae9b14609808b4ff4c5811ad1943c529
返回getenvHTTP_X_FORWARDED_FOR127.0.0.2。
伪造X-Forwarded-For成功。
要想提高程序的安全性,不是一个GPC可以解决的,必须提高程序的过滤机制,因为任何的参数提交都是
有害的!
--EOF--
如果上述属实,那就太痛苦了,啥也不能信了。这年头,连X萝卜也靠不住了。
这是风雪之隅的文章,主要是我正好也有类似的情况发生,先介绍完他的事件后,我再贴出我问题吧。
原文地址为:ini_set memory_limit在safe_mode下不可用
内容如下:
如果你ini_set(“memory_limit”, *)返回了false,不妨检查下, 是否开启了安全模式(手册中没有述及)..
一句话, 记录下:在安全模式下不能使用ini_set的指令:
XML/HTML代码
- 1. max_execution_time
- 2. memory_limit
- 3. child_terminate
--EOF--
附:上文说的ini_set的问题,可以查看一下手册的Chapter 9. Runtime Configuration之How to change configuration settings。
风雪之隅的这个问题其实很常见,但却不会影响系统运行,无非是设置返回false了而己,但我说的是set_time_limit(),这个函数事实上也不会在safe_mode里运行,而且如果你开启了error_reporting(7)后,系统好象是直接无法访问【单位的网站就因为这个而导致程序出错】,由于我仅仅加了这一行,所以我在这行下面加上exit()后才发现safe_mode下,无法set_time_limit。其实这就是上面所说的ini_set中不能使用的max_execution_time。但问题是set_time_limit会有出错信息,而ini_set仅仅返回false。。这是两个不同的概念。
因此,如果你的服务器开启了safe_mode,你一定要看手册的这一章节:Functions restricted/disabled by safe mode。否则遇到问题,你会很头疼的。有的服务器喜欢在上传后直接把文件改到某个用户组,甚至改UID,如果这样,那move_upload_files就不能使用了。当然这种情况很少见,只是需要注意一下。
还有一些函数,也不再能够被使用。多看看手册,真好。