磊's profileMrgaolei的BlogPhotosBlogLists Tools Help

Mrgaolei的Blog

我是Gomogo猫谷枪手 HoHo
February 11

nginx for windows 的目录表示方法真令人捉摸不透

为了配置主目录,我尝尽了无数方法

C:\web\
c:/web/

等等

最后google了好几页,才发先是特殊的表示方法:

/cygdriver/C/web

其中cygdriver代表windows目录结构,第二个C代表c盘。后面跟的就是路径了。

January 16

PHP 计算权重算法

假设有一堆服务器,我根据他们的配置给他们打分,想通过一个函数,随机的到一个服务器实例,当然不是百分百随机,而是配置越高的服务器得到几率越高,这就是权重。写了半天写出来了个算法,不过目前还有有一点Bug,就是权重值不能有重复的,否则重复的永远不会得到。

<?php
/**

* 权重DEMO
*/

$data = array(
    array('server1', 5),
    array('server2', 10),
    array('server3', 5),
    array('server4', 7),
    array('server5', 3),
    array('server6', 31)
);
var_dump(checkWeight($data));

function checkWeight($data) {

    # 权重和
    $sum = 0;
    # 权重值不能有负数
    foreach ($data as $val) {
        if ($val[1] < 0) return false;
        $sum += $val[1];
    }

    # 根据权重数排序
    $sorted = true;
    while ($sorted) {
        $sorted = false;
        for ($i = 0; $i < count($data) - 1; $i ++) {
            if ($data[$i][1] < $data[$i + 1][1]) {
                swapvar(&$data[$i], &$data[$i + 1]);
                $sorted = true;
            }
        }
    }

    # 产生随机数,最小1,最大权重和
    $randnum = rand(1, $sum);
    echo $randnum;
    # 如果随机数大于等于最大值,返回最大
    if ($randnum >= $data[0][1]) return $data[0][0];
    # 如果随机数小于最小值,返回最小
    if ($randnum < $data[count($data) - 1][1]) return $data[count($data) - 1][0];
    for ($i = 0; $i < count($data) - 1; $i ++) {
        if ($randnum < $data[$i][1]) $current = $data[$i+1][0];
    }
    return $current;
}

function swapvar(&$var1, &$var2) {
    $tmpvar = $var1;
    $var1 = $var2;
    $var2 = $tmpvar;
}

January 14

PHP 5.2.1 参数类型不能定义成基础类型的问题

在PHP 5.2.5中,可以按照如下方法声明函数

function getProductById(int $id);

而在PHP 5.2.1中,调用时则会报错,具体原因未知。

December 17

PHP 中保存一个远程图片/文件到本地的更有效方法

网上搜索了很多方法,大多数是:

ob_start();       # 开启缓冲
readfile($url);    # 输出远程文件的二进制到缓存中
$img = ob_get_contents();    # 把这些二进制存入变量
ob_end_clean(); # 清空缓存
$fp = fopen(“c:/123”, "w”);
fwrite($fp, $img);                 # 保存到硬盘
fclose($fp);

这个方法不好,首先用ob_start()局限性大,况且必须写在第一行,否则高版本PHP无效,会将二进制输出到浏览器,也就是没有开启缓冲区,导致浏览器僵死。

其实最简单最安全的方法是:

copy($url, “c:/123”);

从PHP 4.3.0开始,copy函数支持从网络上copy,所以用这个方法代替上述方法。前提是PHP配置文件需要打开fopen。

PHP 正则表达式学习小结(1)

一、模式修正符号

preg_match(“/^a/i”, $subject, &$matches);

这条正则表达式中红色的i便是模式修正符号,i是不区分大小写,经常用。今天用到了一个s,含义是让任意匹配符.支持换行。例如要匹配一段html,中间包含若干空格回车,直接(.*)是得不到的,默认.不匹配空格回车,加上模式修正符号s就可以实现,例如:

preg_match(“/<html>(.*?)<body>/s”, $subject, &$matches);

该正则表达式得到<html>和<body>之间的内容。

二、任意空白符号\s

匹配的内容前后后很多换行空格?用\s吧,将匹配所有空格换行。例如:

preg_match(“/<html>\s+(.*?)</body>/i”, $subject, &$matches);

该正则将不要<html>后面的所有空格换行。

 
Photo 1 of 2