Discuz pre_forum_threadmod action字段

pre_forum_threadmod action字段定义了主题帖相关的操作,可以在这个文件中找到中文描述,source/language/forum/lang_modaction.php。

这里直接贴出来,方便直接查看

$lang = array
(

	'EDT' => '编辑',

	'DEL' => '删除',
	'DLP' => '删除回复',
	'DCM' => '删除点评',
	'PRN' => '批量删帖',
	'UDL' => '反删除',

	'DIG' => '加入精华',
	'UDG' => '解除精华',
	'EDI' => '限时精华',
	'UED' => '解除限时精华',

	'CLS' => '关闭',
	'OPN' => '打开',
	'ECL' => '限时关闭',
	'UEC' => '解除限时关闭',
	'EOP' => '限时打开',
	'UEO' => '解除限时打开',

	'STK' => '置顶',
	'UST' => '解除置顶',
	'EST' => '限时置顶',
	'UES' => '解除限时置顶',

	'SPL' => '分割',
	'MRG' => '合并',

	'HLT' => '设置高亮',
	'UHL' => '解除高亮',
	'EHL' => '限时高亮',
	'UEH' => '解除限时高亮',

	'BMP' => '提升',
	'DWN' => '下沉',

	'MOV' => '移动',
	'CPY' => '复制',
	'TYP' => '分类',

	'RFD' => '强制退款',

	'MOD' => '审核通过',

	'ABL' => '加入文集',
	'RBL' => '移除文集',

	'PTS' => '推送主题',
	'RFS' => '解除推送',
	'RMR' => '取消悬赏',
	'BNP' => '屏蔽帖子',
	'UBN' => '解除屏蔽',

	'REC' => '推荐',
	'URE' => '解除推荐',

	'WRN' => '警告',
	'UWN' => '解除警告',

	'SPA' => '添加图章',
	'SPD' => '撤销图章',

	'SLA' => '添加图标',
	'SLD' => '撤销图标',

	'REG' => '群组推荐',

	'PTA' => '生成文章',

	'MAG' => '道具',

	'REB' => '推送',

	'LIV' => '直播',
	'LIC' => '取消直播',

);


3
Feb 2017
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

深入剖析PHP输入流 php://input

记得当初在刚刚参加工作时,看到其中一个项目中在接受客户端(iphone app)数据时使用到 php://input ,觉得很好奇为什么要这么做?问了相关同事说是只有这样才能获取到客户端提交过来的数据,于是我信了,没有继续深究下去。

但是在最近我又想到这个 php://input ,打开官方手册这里写的比较准确,如下:

php://input is a read-only stream that allows you to read raw data from the request body. In the case of POST requests, it is preferable to use php://input instead of $HTTP_RAW_POST_DATA as it does not depend on special php.ini directives. Moreover, for those cases where $HTTP_RAW_POST_DATA is not populated by default, it is a potentially less memory intensive alternative to activating always_populate_raw_post_data. php://input is not available with enctype="multipart/form-data".

php://input 是个可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 php://input 来代替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。 而且,这样的情况下 $HTTP_RAW_POST_DATA 默认没有填充, 比激活 always_populate_raw_post_data 潜在需要更少的内存。 enctype="multipart/form-data" 的时候 php://input 是无效的。

阅读剩余部分...

29
May 2016
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

Flock,你知多少?

PHP 中的 flock 函数可以让你的站点挂了,你信吗?不可能,不就是一个锁文件嘛。

我们所使用的是 Discuz! X3.2 版本,其中这个helper_log::writelog 函数中使用了 @flock($fp, 2); 此时如果你的日志目录(data/log/)使用了NFS(网络文件系统),这将在某些情况下是有问题的。

阅读剩余部分...

2
Feb 2015
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

urlencode与rawurlencode

urlencode 除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,但是空格则编码为加号(+)。
rawurlencode  除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。

在使用中还有些细微的区别,下面看一段代码:

<?php
$query1 = 'foo=bar&php=hypertext+processor';
$query2 = 'foo=bar&php=hypertext processor';

echo 'query1 : '.$query1, '<br>';
echo 'query2 : '.$query2, '<br><br>';

echo 'urlencode : '.urlencode($query1), '<br>';
echo 'urlencode : '.urlencode($query2), '<br><br>';

echo 'rawurlencode : '.rawurlencode($query1), '<br>';
echo 'rawurlencode : '.rawurlencode($query2), '<br><br>';

上面的代码将会输出如下的内容:

query1 : foo=bar&php=hypertext+processor
query2 : foo=bar&php=hypertext processor

urlencode : foo%3Dbar%26php%3Dhypertext%2Bprocessor
urlencode : foo%3Dbar%26php%3Dhypertext+processor

rawurlencode : foo%3Dbar%26php%3Dhypertext%2Bprocessor
rawurlencode : foo%3Dbar%26php%3Dhypertext%20processor

可见,urlencode 把空格转为了 + ,rawurlencode 却是把空格转为了 %20 , 这里看出 urlencode 把空格做了特殊处理

再进行一个测试,把如下参数加在 url 后面 a=foo%3Dbar%26php%3Dhypertext%2Bprocessor  ,这个字符串就是上面的query1 经过 urlencode 之后的结果,接着加入如下测试代码,看看情况:

<?php
echo '$_GET[a] : '.$_GET['a'], '<br>';
echo 'urldecode : '.urldecode($_GET['a']), '<br>';
echo 'rawurldecode : '.rawurldecode($_GET['a']), '<br>';
?>

上面的代码将会输出如下的内容:

$_GET[a] : foo=bar&php=hypertext+processor
urldecode : foo=bar&php=hypertext processor
rawurldecode : foo=bar&php=hypertext+processor

可见,浏览器自动直接对参数进行了 decode 操作。如果我们按照常理在刚开始进行了 encode 编码,后面肯定是需要 decode 解码,但是如果在这时候解码,你会发现使用 urldecode 与 rawurldecode 的结果是不同的。

接着把 query2 经过urlencode 的结果放到 url 的参数中测试,a=foo%3Dbar%26php%3Dhypertext+processor ,结果如下:

$_GET[a] : foo=bar&php=hypertext processor
urldecode : foo=bar&php=hypertext processor
rawurldecode : foo=bar&php=hypertext processor

可见,浏览器自动进行了 decode 解码操作,并且是 urldecode ,而不是 rawurldecode 。为什么呢?因为 rawurldecode 是不会把 + 转换为空格的。

然后分别把query1 query2  经过rawurlencode 的结果放到url 参数中测试,发现结果都是在我们的预料之中。

总结,(1)如果要把一些特殊字符放到浏览器的 url 参数中,需要使用 encode 方式来编码,否则取到的值有可能不是你所想要的,到底用哪一个,这个看情况而定吧,一般建议使用 rawurlencode ;通过浏览器访问这些经过编码处理的 url 地址时,在接受这些参数值的时候是不需要 decode 操作的。(2)如果情况出现在与浏览器无关的场合,则需要把encode /decode 成对使用。切记,encode 的时候不要对整个参数列表做 encode,而是只对参数值进行 encode 即可。

7
Mar 2013
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

PHP include require 深入浅出

include() 语句包括并运行指定文件。以下文档也适用于 require()。 

以下内容引用自官方文档 

1> 这两种结构除了在如何处理失败之外完全一样。include() 产生一个警告而 require() 则导致一个致命错误。换句话说,如果你想在遇到丢失文件时停止处理页面就用 require()。include() 就不是这样,脚本会继续运行。同时也要确认设置了合适的 include_path。注意在 PHP 4.3.5 之前,包含文件中的语法错误不会导致程序停止,但从此版本之后会。 

2> 寻找包含文件的顺序先是在当前工作目录的相对的 include_path 下寻找,然后是当前运行脚本所在目录相对的 include_path 下寻找。例如 include_path 是 .,当前工作目录是 /www/,脚本中要 include 一个 include/a.php 并且在该文件中有一句 include "b.php",则寻找 b.php 的顺序先是 /www/,然后是 /www/include/。如果文件名以 ./ 或者是 ../ 开始,则只在当前工作目录相对的 include_path 下寻找。 

注释:如果 访问地址是 http://localhost/test/a.php 那么当前工作目录是test/ ,一般程序中建议使用./ 包含文件,这样程序执行起来比较快捷 

3> 当一个文件被包括时,其中所包含的代码继承了 include 所在行的变量范围。从该处开始,调用文件在该行处可用的任何变量在被调用的文件中也都可用。不过所有在包含文件中定义的函数和类都具有全局作用域。 

如果 include 出现于调用文件中的一个函数里,则被调用的文件中所包含的所有代码将表现得如同它们是在该函数内部定义的一样。所以它将遵循该函数的变量范围。 

当一个文件被包括时,语法解析器在目标文件的开头脱离 PHP 模式并进入 HTML 模式,到文件结尾处恢复。由于此原因,目标文件中应被当作 PHP 代码执行的任何代码都必须被包括在有效的 PHP 起始和结束标记之中. 

4> 因为 include() 是一个特殊的语言结构,其参数不需要括号。在比较其返回值时要注意。

<?php
// won't work, evaluated as include(('vars.php') == 'OK'), i.e. include('')
if (include('vars.php') == 'OK') {
    echo 'OK';
}

// works
if ((include 'vars.php') == 'OK') {
    echo 'OK';
}
?> 

个人理解: 1> 在不使用 ./ ../ 时会寻找程序设置的include_path, 如果使用了 ./ ../ 则程序中的include_path将失效。 

2> 在包含文件是,如果想要“找不到包含文件时给出合理的提示信息”,就建议使用 include. 如下代码:

if(!@include_once('./config/config_global.php')) {
	exit('config_global.php is missing');
}
如果文件 config_global.php,找不到则会给出提示:config_global.php is missing .  如果上面使用 require_once,则在找不到文件时直接会有一个致命的错误,将不会继续执行下面的代码,友好提示也就没有了。
2
Mar 2012
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments