Don 发布的文章

svn st 出现叹号文件冲突的解决方法

! 状态表示 “该项目已遗失(被非 svn 命令删除)或不完整”。

经常在svn 合并的时候由于某种原因使用ctrl + c命令强制退出后,再执行svn st命令发现某些文件出现了!状态。

这个时候只需要重新执行svn up命令即可。

12月4日更新,今天又出现类似的错误 —— “!M”,如图:

svn冲突

形成原因:
先是svn add QRCode目录,然后我直接rm QRCode -r ,结果svn st就出现上面的问题了。

解决方法:
首先svn revert QRCode下的两个文件:

svn revert app/src/include/LIB/Package/QRCode/Client.php
svn revert app/src/include/LIB/Package/QRCode/QRCode.php

然后创建QRCode目录

mkdir app/src/include/LIB/Package/QRCode

然后还原QRCode目录

svn revert app/src/include/LIB/Package/QRCode

然后删除QRCode目录即可,此时svn st无错误了。

浮点数运算的灵异问题

本来准备看下程序执行的耗时,结果发现一个灵异问题,代码如下:


$x = microtime(true);

/*中间代码省略*/

$y = microtime(true);

echo ($y-$x) . "\n";

结果输出为:

2.8610229492188E-6

应该是会返回秒数的,怎么会变成上面这种呢?
翻了下PHP手册,里面提到这么一句。

如果给出了 get_as_float 参数并且其值等价于 TRUE, microtime 将返回一个浮点数。

百思不得其解,问了下朋友,后来发现是浮点数运算的问题。

再看一个例子,代码如下:

$a = 0.1;
$b = 0.7;
var_dump(($a + $b) == 0.8);

结果输出为:

bool(false)

再来一个例子,代码如下:

$a = 0.1+0.7;
$b = 0.8;
printf("%0.20f", $a);
echo '
'; printf("%0.20f", $b);

结果输出为:

0.79999999999999993339
0.80000000000000004441

显然在这里,实际上作为浮点型数据,其精度已经损失了一部分,达不到完全精确。所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。需要说明的是,这不是PHP的问题,而是计算机内部处理浮点数的问题!在 C、JAVA 等语言中也会遇到同样的问题。

所以要比较两个浮点数,需要将其控制在我们需要的精度范围内再行比较,因此使用 bcadd() 函数来对浮点数想加并进行精度转换(为字符串):

var_dump(bcadd(0.1,0.7,1) == 0.8);

结果输出为:

bool(true)

linux下的cp强制覆盖

Linux下默认cp命令是有别名(alias cp='cp -i')的,无法强制覆盖,即使你用 -f 参数也无法强制覆盖文件.

[caption id="attachment_1035" align="alignnone" width="160"]linux别名 linux别名[/caption]

你可以这样执行cp强制覆盖的命令.

\cp a /test/a

Apache ab并发测试

最近需要测试大并发情况下的性能,向同事请教后,了解到Apache自带一个并发工具ab.

在apache的bin目录下。

格式:

./ab [options] [http://]hostname[:port]/path

参数:

-n requests     Number of requests to perform
//在测试会话中所执行的请求个数。默认时,仅执行一个请求

-c concurrency Number of multiple requests to make
//一次产生的请求个数。默认是一次一个。

-t timelimit    Seconds to max. wait for responses
//测试所进行的最大秒数。其内部隐含值是-n 50000。它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。