星期三, 九月 27, 2006

检测PHP版本 learn wordpress (6)

检测PHP版本
if ( !(phpversion() >= '4.1') )
{
header( 'Content-Type: text/html; charset=utf-8' );
die( '您的服务器正在运行 PHP 版本 ' . phpversion() . ',但是 WordPress 需要最小 4.1 版本。' );
}
-- wp-settings.php
检测当前使用的PHP的版本号,以防止因版本过低而产生的异常

这里可以看到phpversion的参考
[http://cn.php.net/manual/zh/function.version-compare.php]

// prints -1
echo version_compare("4.0.4", "4.0.6");

// these all print 1
echo version_compare("4.0.4", "4.0.6", "<");
echo
version_compare("4.0.6", "4.0.6", "eq");
?>

上面的例子基本上一看就懂了,使用version_compare 可以对 "." 间隔的数据进行比较
使用 phpversion 可以获取当前使用的 php 的版本号
建议在自己写的 php 页上使用 "." 分割的 version 并在被包含时使用 version_compare 进行版本比较,以便可以检测到一些不容易发现的遗留问题

在 修改 时,加上简要的更新内容说明也是一个很明智的方法。
:)

摘录一段 php.net 上的代码 ,绿色的是我加的一点注释,仅供参考 ;)

mina86 at tlen dot pl
01-Jul-2004 10:40
Here's a wrapper which is more tolerant as far as order of arguments is considered:

/**

* php 版本比较
* ver_cmp($version1,$compare,$version2);
* ver_cmp($compare,$version2);
* ver_cmp($version2);
*/
function ver_cmp($arg1, $arg2 = null, $arg3 = null) {
# 用于缓存 如果获取了一次 phpversion 就不必要再一次获取它了
static
$phpversion = null;
if (
$phpversion===null) $phpversion = phpversion(); #记录phpversion

# 根据实际调用的参数个数来判断执行什么操作
switch (
func_num_args()) {

# 比较输入的version2和当前的phpversion
case
1: return version_compare($phpversion, $arg1);

# 根据输入的操作方式对version2和phpversion进行比较
case
2:
# 自动适应操作符位置 操作符 $
compare 和 $version2 可以互换位置
# 如果没有找到操作符 则对 $version1 和 $version2 进行默认比较操作
if (preg_match('/^[lg][te]|[<>]=?|[!=]?=|eq|ne|<>$/i', $arg1))
return
version_compare($phpversion, $arg2, $arg1);
elseif (
preg_match('/^[lg][te]|[<>]=?|[!=]?=|eq|ne|<>$/i', $arg2))
return
version_compare($phpversion, $arg1, $arg2);
return
version_compare($arg1, $arg2);
default:
$ver1 = $arg1;
# 这句貌似没有什么用
# 自动适应操作符位置 允许操作符在第二个或第三个参数
if (
preg_match('/^[lg][te]|[<>]=?|[!=]?=|eq|ne|<>$/i', $arg2))
return
version_compare($arg1, $arg3, $arg2);
return
version_compare($arg1, $arg2, $arg3);
}
}


It also uses phpversion() as a default version if only one string is present. It can make your code look nicer 'cuz you can now write:
if (ver_cmp($version1, '>=', $version2)) something;
and to check a version string against the PHP's version you might use:
if (ver_cmp('>=', $version)) something;
instead of using phpversion().

对外界环境进行兼容设置 learn wordpress (5)

对外界环境进行兼容设置

// Fix for IIS, which doesn't set REQUEST_URI
# 如果没有设定 REQUEST_URI 则根据其他参数进行设定 REQUEST_URI="SCRIPT_NAME?QUERY_STRING";
if ( empty( $_SERVER['REQUEST_URI'] ) ) {
$_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME']; // Does this work under CGI?

// Append the query string if it exists and isn't null
if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])) {
$_SERVER['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
}
}

// Fix for PHP as CGI hosts that set SCRIPT_FILENAME to something ending in php.cgi for all requests
# 如果是通过CGI来处理的则将SCRIPT_FILENAME重定义为最终的处理文件 SCRIPT_FILENAME="PATH_TRANSLATED";

if ( isset($_SERVER['SCRIPT_FILENAME']) && ( strpos($_SERVER['SCRIPT_FILENAME'], 'php.cgi') == strlen($_SERVER['SCRIPT_FILENAME']) - 7 ) )
$_SERVER['SCRIPT_FILENAME'] = $_SERVER['PATH_TRANSLATED'];

// Fix for Dreamhost and other PHP as CGI hosts
if ( strstr( $_SERVER['SCRIPT_NAME'], 'php.cgi' ) )
unset($_SERVER['PATH_INFO']);

// Fix empty PHP_SELF
# 构建PHP_SELF
$PHP_SELF = $_SERVER['PHP_SELF'];
if ( empty($PHP_SELF) )
$_SERVER['PHP_SELF'] = $PHP_SELF = preg_replace("/(\?.*)?$/",'',$_SERVER["REQUEST_URI"]);

-- wp-settings.php
其实所谓兼容就是不同的外部环境给定的变量有些差异。
这些我没有用过姑且留之。

think:如何才能进行分布式计算

遇到些问题需要去解决 ,不了解这方面的情况,谁能告诉我从何下手。
一个web服务,
需要对其进行分布式优化
需求如下:
前端web服务分布进行负载均衡,
中间的数据层分布进行大数据存储和备份,
底层计算分布进行分布式计算。
非即时处理 可以使用异步的方式进行计算


上图是一份数据流的节点图
设想是
1、外部请求通过 Web Main 使用一定的规则进行分流 将请求定位到 web 1 ... web n 上;
2、web 1-n 向 Data Main 索要数据,并最终从 Data 1-n 上获取需要的数据;
3、 Worker Main 为 worker 1-n 分配任务,worker 1-n 自动执行任务,并将数据更新到需要的 data 节点上。

上图:一次处理的数据流
1、处理请求通过 web 1-n 进入系统;
2、web 1-n 将任务提交给 Data Main;
3、worker main 检测到未处理任务,并进行分割提交给 worker 1-n ;
4、worker 1-n 将根据任务进行处理(应该加一个 worker 会将将处理后的结果合并);
5、worker 1-n 通过 Data Main 对数据进行更新;
6、web 1-n 定期通知 web main 检测任务完成状态,直到任务过期或完成。

星期二, 九月 26, 2006

对指定的参数赋与初值 learn wordpress (4)

对指定的参数付与初值
if ( ! isset($blog_id) )
$blog_id = 1;
-- wp-settings.php
处理过程中的常用手段,预留一些设置变量,可以在类似config的文件中进行定义,来改变处理的方式。

留下一些可以定义的值给前边的任务。就像方法的默认值一样,如果你设置了其他的值,我就按照你指定的方式来处理,如果没有设置,我就按预定的默认方式处理。
可以用在include之前对包含进来的内容进行定制。

确保即将使用的变量被重置 learn wordpress (three)

确保即将使用的变量被重置
unset( $wp_filter, $cache_userdata, $cache_lastcommentmodified, $cache_lastpostdate, $cache_settings, $category_cache, $cache_categories );
-- wp-settings.php
# 清除需要用到的变量,确保不会因为环境(上下文)对后面将要执行的代码产生影响.

如果页面可能被重复加载,或者不确定这个页面会在什么时候被加载
那么我们应该尽可能的为下面的工作清出一块干净的空间,否则,谁也不确定你要的变量会在什么时候携带了一个你不想要的值。(当然,出现这个问题的一部分原因是因为我们使用的变量可能会重名,被重复使用)

清除自动创建的变量 learn wordpress (two)

清除自动创建的变量
// Turn register globals off
function unregister_GLOBALS() {
if ( !ini_get('register_globals') ) # 如果定义的全局变量
return;

if ( isset($_REQUEST['GLOBALS']) )
die('GLOBALS overwrite attempt detected');

// Variables that shouldn't be unset
$noUnset = array('GLOBALS', '_GET', '_POST', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES', 'table_prefix');

$input = array_merge($_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_FILES, isset($_SESSION) && is_array($_SESSION) ? $_SESSION : array());
foreach ( $input as $k => $v )
if ( !in_array($k, $noUnset) && isset($GLOBALS[$k]) )
unset($GLOBALS[$k]); # 从GLOBALS中清除Request中设定的变量
}
-- wp-settings.php

# 如果指定了自动注册全局变量(register_globals)则清除所有从请求($input)过来的非保留($noUnset)的全局变量(in $GLOBALS).
Global 变量:$GLOBALS
注: $GLOBALS 在 PHP 3.0.0 及以后版本中适用。
由所有已定义全局变量组成的数组。变量名就是该数组的索引。
这是一个“superglobal”,或者可以描述为自动全局变量。这只不过意味这它在所有的脚本中都有效。在函数或方法中不需要使用 global $GLOBALS; 来访问它。
-- 来自《php手册》 http://cn.php.net/manual/zh/reserved.variables.php

防止重复加载同一部分代码 learn wordpress (one)

将writely上的学习笔记copy到这里
note in writely http://www.writely.com/View.aspx?docid=dg4t629m_37gnpq8t
然后使用这里的tag功能进行索引
ok! 开始我的php代码收集之路。

技巧 一 防止重复加载同一部分代码

if (! isset($wp_did_header)):
...
$wp_did_header = true;
...
endif;
-- wp-blog-header.php
## 类似的
if(defined('CBC.TOP_INC_SIGN')) return 1;
if(!defined('COMMON_INC_SIGN')){
die (__FILE__." LINE ".__LINE__.":require common.inc!\n");
return -1;
}
define("CBC.OPERATOR_INC_SIGN",1);
define("CBC.OPERATOR_VERSION","0.0.1");
-- 我的程序的一段代码

考虑页面可能被多次引用的情况
使用标记来确保唯一引用
判断方式
isset # 判断一个变量是否被定义
defined # 判断一个常量标示符是否被定义
function_exists # 判断一个函数是否被定义
class_exists # 判断一个类是否被定义
menthod_exists # 判读一个对象是否定义了指定的方法
property_ exists # 判断一个对象是否定义了指定的属性

只是不知道这个变量和常量哪个更好些