PHP多多线程pthreads数据共享

<?php
class sharr extends Stackable {
  public function run(){}
}
class shvar extends Stackable  {
  public $num = 1;
}
class my extends Thread {
  public function __construct($sharr, $shvar) {
    $this->sharr = $sharr;
    $this->shvar = $shvar;
  }
  public function run(){
    $i = 0;
    while(++$i < 10) {
      $this->sharr[]=rand(0,1000);
      $this->shvar->num++;
    }
    var_dump($this->sharr);
    var_dump($this->shvar->num);
  }
}
$sharr = new sharr();
$shvar = new shvar();
$my = new my($sharr, $shvar);
$my->start();
$my->join();
var_dump($sharr);
var_dump($shvar->num);
?>

PHP多线程pthreads使用

<?php
declare(ticks = 1);
$running= 1;
/信号处理函数
functionsig_handler($signo)
{
  switch($signo) {
  caseSIGINT:
    finish();
    break;
  default:
    break;
  }
}
pcntl_signal(SIGINT, "sig_handler");
classtest extends\Thread {
  public$url;
  public$result;
  publicfunction__construct($url) {
    $this->url = $url;
  }
  publicfunctionrun() {
    if($this->url) {
      $this->result = model_http_curl_get($this->url);
    }
  }
}
functionmodel_http_curl_get($url) {
  $curl= curl_init(); 
  curl_setopt($curl, CURLOPT_URL, $url); 
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
  curl_setopt($curl, CURLOPT_TIMEOUT, 5); 
  curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)'); 
  $result= curl_exec($curl); 
  curl_close($curl); 
  return$result; 
}
for($i= 0; $i< 500; $i++) {
  $urls[] = '/www.baidu.com/s?wd='. rand(10000, 20000);
}
$pool= array();
for($i=1;$i<=5;$i++) {
  $key= uniqid();
  $url= array_shift($urls);
  $pool[$key] = newtest($url);
  $pool[$key]->start();
  echo"启动线程$key\n";
}
while($urls&& $running) {
  foreach($poolas$key=>$worker) {
    if(! $worker->isRunning()){
      /unset($pool[$key]);
      echo"线程".$key."已结束\n";
      $url= array_shift($urls);
      $pool[$key] = newtest($url);
      $pool[$key]->start();
      echo"启动线程$key\n";
    }
  }
  usleep(1000);
}
functionfinish() {
  global$running;
  global$pool;
  $running= 0;
  echo"接收到信号,等待运行中线程结束\n";
  foreach($poolas$key=>$worker) {
    if($pool[$key]->join()) {
      var_dump($pool[$key]->result);
    }
  }
}

4439337862

远程运行Linux窗口程序使用X Windows太重量级了,可以使用Xvfb新建虚拟X窗口,通过x11vnc启动VNC Server并转发Xvfb启动的虚拟窗口。

1
2
3
4
5
6
7
8
yum install xorg-x11-server-Xvfb
yum install x11vnc
#新建X虚拟窗口
Xvfb :1 -screen 0 1024x768x24 -nolisten tcp &
#设置默认窗口

8008611759

安装制作软件包:

1
yum -y install createrepo

创建仓库目录:

1
mkdir -p /yum/centos/6/{i386,x86_64}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
生成repodata索引
createrepo -d /yum/centos/6/x86_64/
#更新索引
createrepo --update /yum/centos/6/x86_64/
<pre><code>配置Nginx:
</code></pre>
location / {
    root /yum;
    autoindex_exact_size off;
    autoindex_localtime on;
    autoindex  on;
}
<pre><code>配置yum使用源:
</code></pre>
[testrepo]
name=test repo
baseurl=/192.168.1.1/centos/6/$basearch/
gpgcheck=0
enabled=1

常用命令

有些好用的命令不定哪天就忘记了,记录下备忘,常更新。。。
列出所有目录使用量,并按大小排序。

1
2
ls|xargs du -h|sort -rn
#不递归下级目录使用du -sh

查看文件排除以#开关和空白行,适合查看配置文件。

1
2
egrep -v "^#|^$"  filename
sed '/#.*$/d; /^ *$/d'

删除空格和空行。

1
2
3
4
sed '/^$/d' filename #删除空行
sed -i '/^\s*$/d' filename #多个空格组成的空行
sed 's/ /g' filename
sed 's/[[:space:]]/g' filename

linux换行\n转为windows换行\r\n:

1
perl -pi -e 's/\n/\r\n/'  filename

删除#后的注释。

1
sed -i 's/#.*$/g' filename

踢出登录的用户,用who查看终端。

1
pkill -KILL -t pts/0

删除空文件。

1
find / -type f -size 0 -exec rm -rf {} \;

查找进程pid并kill。

1
2
pgrep nginx|xargs kill
pidof nginx|xargs kill

获取当前IP地址,强大的awk,一个命令搞定。

1
ifconfig |awk -F"[ ]+|[:]" 'NR==2 {print $4}'

文本方式查看wtmp日志

1
utmpdump /var/log/wtmp

以内存大小排序列出进程

1
ps aux --sort=rss |sort -k 6 -rn

简单web server列出当前目录文件,端口8000:

1
python -m SimpleHTTPServer

以管道输入方式修改用户密码:

1
echo "password" |passwd –stdin root

生成SSH证书并复制到远端服务器:

1
ssh-keygen -y -f ~/.ssh/id_rsa && cat ~/.ssh/id_rsa.pub | ssh root@host "cat - >> ~/.ssh/authorized_keys"

shell下新建文件夹并进入,以下加入bashrc:

1
2
3
4
mkcd ( ){
mkdir $1
cd $1
}

通过SSH快速备份文件到另一服务器:

1
tar zcvf - back/ | ssh root@www.haiyun.me tar xzf - -C /root/back/

用wget下载整站:

1
2
wget -r -p -np -k /www.haiyun.me
#r递归 p下载所有文件 np不下载上级 k转换相对链接

Kill整个进程树:

1
pstree -ap 10277|grep -oP '[0-9]{4,6}'|xargs kill -9

生成随机字符:

1
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1

使用awk导出最后一列非空的数据:

1
awk -F "|" '{if($NF!="") print $NF}'

查找每行大于几位数的数据:

1
awk -F '' '{if(NF>6) print $0}'

awk计算列之和:

1
awk -F'----' 'BEGIN{total=0}{total+=$2}END{print total}'

获取HTML页面文本内容:

1
2
3
lynx -dump www.haiyun.me #包含页面的URL
w3m -no-cookie -dump www.haiyun.me
links -dump www.haiyun.me #对中文内容支持不好

端口重定向:

1
socat TCP4-LISTEN:1234,reuseaddr,fork, TCP4:www.baidu.com:80

行前或行后插入:

1
2
sed 'p;s/^.*$/--------/' file
awk '{print $0;print "-------"}' file

行首或行尾插入:

1
2
sed 's/^/new/g' file
sed 's/$/new/g' file

逐字换行:

1
awk -F "" '{for(i=1;i<=NF;i++) print $i}'

目录中大量文件删除:

1
ls | xargs rm

文本去重复:

1
2
3
sort -u file.txt
#或使用uniq,只能去除连续重复的行,先用sort排序再用uniq去重
sort file.txt|uniq

在线工具

收集整理一些常用的网站服务器在线测试工具。
站长工具:undergnaw
卡卡测速:(205) 879-3912
Netcraft:misanthropism
Just-Ping:2269468839

一些国内开源镜像站:
网易:(518) 846-5055
搜狐:(402) 827-7246
清大:605-945-5168
科大:(302) 930-8482
阿里:/mirrors.aliyun.com/

编程语言性能PK:(931) 208-4712
WEB框架PK:/www.techempower.com/benchmarks/
编程语言排行榜:434-995-9049
网络安全工具TOP125:/sectools.org/

spindle tuber

收集整理下一些软件或系统的官方手册,以备查阅。
操作系统:
Debian:6393447669
CentOS:/wiki.centos.org/zh/Documentation
FreeBSD:/www.freebsd.org/doc/zh_CN/books/handbook/
数据库:
MySQL:517-774-2982
SQL:/msdn.microsoft.com/zh-cn/library/ms130214(v=SQL.100).aspx
Web服务器:
Apache:/httpd.apache.org/docs/2.2/
Apache中文:/lamp.linux.gov.cn/Apache/ApacheMenu/index.html
Nginx:/nginx.org/cn/docs/
IIS7:3477650932
CU Man:5147556346
网络工具:
Nman:/nmap.org/man/zh/index.html
Nagios:/nagios-cn.sourceforge.net/nagios-cn
在线图书:
鸟哥的Linux私房菜:/linux.vbird.org
柏青哥的 SuSE Linux:787-469-5172
HowTo:2292792007
Stackoverflow::/stackoverflow.com/
Guide to IP Layer Network Administration with Linux:681-381-5291
Linux Advanced Routing & Traffic Control:/lartc.org/howto/index.html
其它:
正则表达式语法:/msdn.microsoft.com/zh-cn/library/ae5bf541(VS.80).aspx
正则表达式30分钟入门:scrounging
Linux手册/开发手册:/linux.51yip.com/

XenServer修改Linux/Windows系统模板内存等资源限制

XenServer虚拟机系统模板对内存等资源有做限制,在新建虚拟机时分配的资源不能小于模板最小限额。
XenServer下查看CentOS6 32位模板内存最小限制:

1
2
xe template-list name-label=CentOS\ 6\ \(32-bit\) params=memory-static-min --minimal
536870912

可见内存最小限制为512M,如果安装Centos6虚拟机内存不能小于512M,修改Centos模板内存最小限制为128M:

1
2
3
4
xe template-list name-label=CentOS\ 6\ \(32-bit\) params=uuid --minimal
#查看Centos模板uuid
xe template-param-set uuid=<uuid> memory-static-min=128MiB
#修改内存最小限制为128M

XenServer通过ionice限制VM虚拟机硬盘IO

之前有文章介绍Xen下通过ionice限制VM虚拟机硬盘IO优先级,XenServer获取虚拟机进程和Xen不同,可通过以下方法查找虚拟机IO进程,并使用ionice限制。
首先获取VM虚拟机的UUID:

1
xe vm-list name-label=<vm-name> --minimal

然后再获取VM的DOM ID:

1
list_domains |awk '/<vm-uuid>/ {print $1}'

通过DOM ID获取VM相对应的进程ID:

1
2
3
ps aux|grep xb.*<dom-id>.xvd
root     10995  0.0  0.0      0     0 ?        S    10:08   0:01 [xb.00003.xvda]
root     10996  0.0  0.0      0     0 ?        S    10:08   0:00 [xb.00003.xvdd]

使用ionice调整相应进程的IO优先级策略即可。