Shell是系统管理的主要语言,但是PHP有时也比较方便,特别是在逻辑很复杂的时候,shell写起来很不方便,但是Shell和PHP之间的效率到底能差多少呢?本人先针对简单的命令做了个实验,实验的目的是创建6万多个ng界面,然后再销毁,分别用php和shell来实现:
1、SHELL
创建代码:
% cat ng.sh
#!/bin/sh
for i in $(seq 0 65535); do
/usr/sbin/ngctl mkpeer iface dummy inet
if [ $? -ne 0 ] ; then
echo "failed $i";
break;
else
echo "success $i";
fi
done
执行结果:
success 65376
success 65377
ngctl: send msg: Cannot allocate memory
failed 65378
26.517u 56.724s 5:28.96 25.3% 40+166k 0+0io 0pf+0w
销毁代码:
% cat clearng.sh
#!/bin/sh
for i in $(seq 65530); do
/usr/sbin/ngctl shutdown ng$i:
if [ $? -ne 0 ] ; then
echo "failed $i";
break;
else
echo "success $i";
fi
done
执行结果:
success 65377
success 65378
ngctl: shutdown: No such file or directory
failed 65379
29.035u 592.914s 11:16.56 91.9% 36+171k 0+0io 0pf+0w
2、PHP
创建代码:
% cat create.php
for ( $i=1; $i<=65530; $i++ ){
$cmd = 'ngctl mkpeer iface dummy inet';
system( $cmd, $r );
if( $r > 0 ){
echo "Fail in " . $i . "\n";
break;
}else{
echo "Success " . $i . "\n";
}
}
?>
结果:
Success 65376
Success 65377
Success 65378
ngctl: send msg: Cannot allocate memory
Fail in 65379
46.924u 103.514s 4:09.67 60.2% 275+178k 0+0io 1pf+0w
销毁代码:
% cat clear.php
for ( $i=0; $i<=65538; $i++ ){
$cmd = 'ngctl shutdown ng' . $i . ":";
system( $cmd, $r );
if( $r > 0 ){
echo "Fail in " . $i . "\n";
break;
}else{
echo "Success " . $i . "\n";
}
}
?>
执行结果:
Success 65374
Success 65375
Success 65376
Success 65377
Success 65378
ngctl: shutdown: No such file or directory
Fail in 65379
49.034u 637.340s 12:07.22 94.3% 99+174k 0+0io 0pf+0w
总结表:
创建
SHELL: 26.517u 56.724s 5:28.96 25.3% 40+166k 0+0io 0pf+0w
PHP: 46.924u 103.514s 4:09.67 60.2% 275+178k 0+0io 1pf+0w
销毁
SHELL: 29.035u 592.914s 11:16.56 91.9% 36+171k 0+0io 0pf+0w
PHP: 49.034u 637.340s 12:07.22 94.3% 99+174k 0+0io 0pf+0w
1、创建的时候,用户态时间和系统时间,以及CPU占用,PHP多出来接近一倍
2、销毁的用户态时间和系统时间,以及CPU占用,PHP多出来不到10%
3、PHP的内存占用要多的多,这也跟需要解释器有关系
结论:
对于简单的命令,尽量还是用SHELL吧,不需要在系统和语言中切换,会节省很多时间。PHP在使用system和exec时,会先调用shell,再由shell运行真正的命令,然后再返回到PHP中,这无疑是个很大的开销。但是如果PHP能直接调用C的库文件,可能性能会有极大的提高——这不就是PHP模块了吗?
至于复杂的命令,一时间还没想好,下次再做吧,争取能稍微对PHP有利一点。