存档

2015年8月 的存档

Linux各种信号及其用途

2015年8月31日 评论已被关闭
Signal Description Signal number on Linux x86[1]
SIGABRT Process aborted 6
SIGALRM Signal raised by alarm 14
SIGBUS Bus error: “access to undefined portion of memory object” 7
SIGCHLD Child process terminated, stopped (or continued*) 17
SIGCONT Continue if stopped 18
SIGFPE Floating point exception: “erroneous arithmetic operation” 8
SIGHUP Hangup 1
SIGILL Illegal instruction 4
SIGINT Interrupt 2
SIGKILL Kill (terminate immediately) 9
SIGPIPE Write to pipe with no one reading 13
SIGQUIT Quit and dump core 3
SIGSEGV Segmentation violation 11
SIGSTOP Stop executing temporarily 19
SIGTERM Termination (request to terminate) 15
SIGTSTP Terminal stop signal 20
SIGTTIN Background process attempting to read from tty (“in”) 21
SIGTTOU Background process attempting to write to tty (“out”) 22
SIGUSR1 User-defined 1 10
SIGUSR2 User-defined 2 12
SIGPOLL Pollable event 29
SIGPROF Profiling timer expired 27
SIGSYS Bad syscall 31
SIGTRAP Trace/breakpoint trap 5
SIGURG Urgent data available on socket 23
SIGVTALRM Signal raised by timer counting virtual time: “virtual timer expired” 26
SIGXCPU CPU time limit exceeded 24
SIGXFSZ File size limit exceeded 25
分类: Linux 标签:

php多线程程序

2015年8月25日 评论已被关闭

参考:http://zyan.cc/pthreads/

[pcsh lang=”php” tab_size=”4″ message=”” hl_lines=”” provider=”manual”]

include_once('./XMemcache.php');
class pthreadTest extends Thread {
//循环次数
public $times = 0;

//执行的时间
public $timeCast = 0;

//是否碰撞
public $collision = false;

//第几次循环发生碰撞
public $collisionNo = 0;

//被碰撞的数字
public $beTouchedNum = 0;

//
public $data = array();

public function __construct($times) {
$this->times = $times;
}

public function run() {
$this->data = runTask($this->times);
}
}
function threadGet($pool) {
foreach ($pool as $key => $value) {
$threadArray[$key] = new pthreadTest($value);
$threadArray[$key]->start();
}

foreach ($threadArray as $key => $value) {
while ($threadArray[$key]->isRunning()) {
usleep(100);
}
if ($threadArray[$key]->join()) {
$returnData[$key] = $threadArray[$key]->data;
}
}
return $returnData;
}
function runTask($total=0) {
$total = $total==0 ? rand(100,999) : $total;
$mem = XMemcache::getInstance()->getMem();

$start = getTime();
for($i=0; $i<$total; $i++) {
$k = rand(100000000, 999999999);
if( ! $mem->get($k) ) {
$mem->set($k, $i, 3600);
}else{
echo '检查到碰撞: $i='.$i.',碰撞key='.$mem->get($k)."\n";
break;
}
}
$end = getTime();
return array('total'=>$total, 'timeCast'=>$end-$start);
}
function getTime() {
$t1 = microtime();
$t1 = explode(' ', $t1);
return $t1[1].substr($t1[0],1);
}

//task
$pool[] = 500;
$pool[] = 200;
$pool[] = 700;
$pool[] = 300;
$pool[] = 400;
$t1 = getTime();
$result = threadGet($pool);
$t2 = getTime();
print_r($result);
echo '多线程执行时间:'.($t2-$t1)."\n\n\n";
$t1 = getTime();
$r = array();
foreach ($pool as $key => $value) {
$r[$key] = runTask($value);
}
$t2 = getTime();
print_r($r);
echo '串行执行时间:'.($t2-$t1)."\n\n\n";

[/pcsh]

分类: PHP 标签:

简单nginx配置(1.5.1)

2015年8月22日 评论已被关闭

server

{

listen     80;

server_name  my.domain.com;

index index.php index.html index.htm;

root   /path/to/my/pro;

try_files $uri $uri/ /index.php?$query_string;

#expires

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

{

expires  24h;

}

location ~ .*\.(js|css)?$

{

expires      24h;

}

location ~ .*\.php?$

{

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

fastcgi_param  PHP_VALUE  “open_basedir=$document_root:/tmp/:/proc/”;

include fastcgi_params;

}

}

分类: nginx 标签:

正则表达式中 ?= 和 ?: 的区别

2015年8月20日 评论已被关闭

来源:http://segmentfault.com/q/1010000003112791

例如,我们通过一个函数把一个 number 类型的数字转换成一个字符串,并且每三位给他加上一个 ‘,’;
1999 -> 1,999

先看看 (?=pattern) 的使用,下面这个是正确的:

function groupByCommas(n) {
  return n.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
console.log(groupByCommas(1234567));    //1,234,567

如果我们删掉(\d{3})后面的 ‘+’的话,全局标志依然还在,但是这个时候,就只能匹配字符串中的部分了。

function groupByCommas(n) {
  return n.toString().replace(/\B(?=(\d{3})(?!\d))/g, ",");
}
console.log(groupByCommas(1234567));    //1234,567

我的看法是这样的:
正则表达式等价于

/\B(?=(\d{3}){1}(?!\d))/g

所以当匹配到匹配项的时候,index 的位置已经到了4与5之间,而前面的正则是通过

/\B(?=(\d{3}){1}(?!\d))/g
/\B(?=(\d{3}){2}(?!\d))/g

匹配。

最后如果我们把 ?= 换成 ?: 的话:

function groupByCommas(n) {
  return n.toString().replace(/\B(?:(\d{3})+(?!\d))/g, ",");
}
console.log(groupByCommas(1234567));    //1,

malcolmyu 37 17 小时前 回答

先说结论,区别在于 ?= 是正向肯定**断言**,进行的匹配是不占查询长度的;而 ?: 是非获取**匹配**,进行的匹配是占据查询长度的。

题述的正则查询每一个非单词边界,然后对后面的一个或多个连续三组数字+一组非数字进行匹配。对于 1234567 而言,就会匹配到 1 和 2 中间的这个非单词边界,因为后面的 234567$ 满足正向肯定预查的 (\d{3})+(?!\d) 形式;之后会匹配到 4 和 5 中间的非单词边界,因为后面的 567$ 也满足上一形式。所以是正确的。

而你尝试将 + 去掉,使得断言只能匹配到 567$ 这样的形式——注意到你强调了 g 全局查询参数,但是我们要注意到 (?!\d) 的存在,这是一个正向否定断言,表示连续三个数字之后不能存在数字,所以 234 显然是不满足的,因为其后的 5 正是一个数字。假使你去掉了这个否定断言,那这个正则也不能工作——因为断言是**零宽**的,是不占据匹配长度的,查完 1 之后 234 满足,还会继续查 2,2 之后 345 也是满足的。因此结果就会变成"1,2,3,4,567"

最后你尝试使用了 ?: 这个非获取匹配实际上是占据匹配长度的,当执行了第一次匹配时,实际上就匹配到了行尾,直接将 234567 全替换成了 ,,然后完成了匹配。所以就出现了上面的结果。


			
分类: 正则 标签: