LINUX 系统参数探测包括cpu,时间,内存等
function sys_linux()
{
// CPU
if (false === ($str = @file("/proc/cpuinfo"))) return false;
$str = implode("", $str);
@preg_match_all("/models+names{0,}:+s{0,}([ws)(.]+)[ ]+/", $str, $model);
//@preg_match_all("/cpus+MHzs{0,}:+s{0,}([d.]+)[ ]+/", $str, $mhz);
@preg_match_all("/caches+sizes{0,}:+s{0,}([d.]+s{0,}[A-Z]+[ ]+)/", $str, $cache);
if (false !== is_array($model[1]))
{
$res['cpu']['num'] = sizeof($model[1]);
for($i = 0; $i < $res['cpu']['num']; $i++)
{
$res['cpu']['detail'][] = "类型:".$model[1][$i]." 缓存:".$cache[1][$i];
}
if (false !== is_array($res['cpu']['detail'])) $res['cpu']['detail'] = implode("<br />", $res['cpu']['detail']);
}
// UPTIME
if (false === ($str = @file("/proc/uptime"))) return false;
$str = explode(" ", implode("", $str));
$str = trim($str[0]);
$min = $str / 60;
$hours = $min / 60;
$days = floor($hours / 24);
$hours = floor($hours - ($days * 24));
$min = floor($min - ($days * 60 * 24) - ($hours * 60));
if ($days !== 0) $res['uptime'] = $days."天";
if ($hours !== 0) $res['uptime'] .= $hours."小时";
$res['uptime'] .= $min."分钟";
// MEMORY
if (false === ($str = @file("/proc/meminfo"))) return false;
$str = implode("", $str);
preg_match_all("/MemTotals{0,}:+s{0,}([d.]+).+?MemFrees{0,}:+s{0,}([d.]+).+?SwapTotals{0,}:+s{0,}([d.]+).+?SwapFrees{0,}:+s{0,}([d.]+)/s", $str, $buf);
$res['memTotal'] = round($buf[1][0]/1024, 2);
$res['memFree'] = round($buf[2][0]/1024, 2);
$res['memUsed'] = ($res['memTotal']-$res['memFree']);
$res['memPercent'] = (floatval($res['memTotal'])!=0)?round($res['memUsed']/$res['memTotal']*100,2):0;
$res['swapTotal'] = round($buf[3][0]/1024, 2);
$res['swapFree'] = round($buf[4][0]/1024, 2);
$res['swapUsed'] = ($res['swapTotal']-$res['swapFree']);
$res['swapPercent'] = (floatval($res['swapTotal'])!=0)?round($res['swapUsed']/$res['swapTotal']*100,2):0;
// LOAD AVG
if (false === ($str = @file("/proc/loadavg"))) return false;
$str = explode(" ", implode("", $str));
$str = array_chunk($str, 3);
$res['loadAvg'] = implode(" ", $str[0]);
return $res;
}
//调用方法
sys_linux();
代码如下 | 复制代码 |
function do_command($commandName, $args) { $buffer = ""; if (false === ($command = find_command($commandName))) return false; if ($fp = @popen("$command $args", 'r')) { while (!@feof($fp)) { $buffer .= @fgets($fp, 4096); } return trim($buffer); } return false; } |
//确定执行文件位置 FreeBSD
代码如下 | 复制代码 |
function find_command($commandName) { $path = array('/bin', '/sbin', '/usr/bin', '/usr/sbin', '/usr/local/bin', '/usr/local/sbin'); foreach($path as $p) { if (@is_executable("$p/$commandName")) return "$p/$commandName"; } return false; } |
//调用方法
echo do_command('sysctl', "-n hw.model");
?>
//方法一 利用array_filter调用我们自定的函数来过滤空值
代码如下 | 复制代码 |
function clear($a) $array = array("",'','','','',1,1,1,1,1); |
print_r( $stt );
/*
输出结果
Array
(
[5] => 1
[6] => 1
[7] => 1
[8] => 1
[9] => 1
)
空值被过滤
*/
//过滤空数据二,用循环来处理
代码如下 | 复制代码 |
$array = array("",'','2','','',1,1,1,1,1); foreach( $array as $v =>$vc ) print_ |
r( $array);
/*
Array
(
[2] => 2
[5] => 1
[6] => 1
[7] => 1
[8] => 1
[9] => 1
)
*/
//方法实例三,用for来实例
代码如下 | 复制代码 |
$tarray = array('','11','','www.111cn.net','','','cn.net'); $len = count( $tarray ); print_r($tarray); |
/*
过滤空数组后的结果为
Array
(
[1] => 11
[3] => www.111cn.net
[6] => cn.net
)
注明:本站原创教程转注明来源www.111cn.net
*/
<?php
代码如下 | 复制代码 |
if ($_GET['action'] == 'save') { $up = new upload(); $up->set_dir(dirname(__FILE__).'/upload/','{y}/{m}'); $up->set_thumb(100,80); $up->set_watermark(dirname(__FILE__).'/jblog/images/watermark.png',6,90); $fs = $up->execute(); var_dump($fs); } |
?>
代码如下 | 复制代码 |
<html> <head><title>test</title></head> <body style="margin:0;padding:0"> <form name="upload" method="post" action="?action=save" enctype="multipart/form-data" style="margin:0"> <input type="file" name="attach[]" /> <input type="file" name="attach[]" /> <input type="submit" name="submit" value="上 传" /> </form> </body> </html> |
代码如下 | 复制代码 |
class upload { var $dir; //附件存放物理目录 var $time; //自定义文件上传时间 var $allow_types; //允许上传附件类型 var $field; //上传控件名称 var $maxsize; //最大允许文件大小,单位为KB var $thumb_width; //缩略图宽度 var $thumb_height; //缩略图高度 var $watermark_file; //水印图片地址 var $watermark_pos; //水印位置 var $watermark_trans;//水印透明度 //构造函数 //$types : 允许上传的文件类型 , $maxsize : 允许大小 , $field : 上传控件名称 , $time : 自定义上传时间 function upload($types = 'jpg|png', $maxsize = 1024, $field = 'attach', $time = '') { $this->allow_types = explode('|',$types); $this->maxsize = $maxsize * 1024; $this->field = $field; $this->time = $time ? $time : time(); } //设置并创建文件具体存放的目录 //$basedir : 基目录,必须为物理路径 //$filedir : 自定义子目录,可用参数{y}、{m}、{d} function set_dir($basedir,$filedir = '') { $dir = $basedir; !is_dir($dir) && @mkdir($dir,0777); if (!emptyempty($filedir)) { $filedir = str_replace(array('{y}','{m}','{d}'),array(date('Y',$this->time),date('m',$this->time),date('d',$this->time)),strtolower($filedir)); $dirs = explode('/',$filedir); foreach ($dirs as $d) { !emptyempty($d) && $dir .= $d.'/'; !is_dir($dir) && @mkdir($dir,0777); } } $this->dir = $dir; } //图片缩略图设置,如果不生成缩略图则不用设置 //$width : 缩略图宽度 , $height : 缩略图高度 function set_thumb ($width = 0, $height = 0) { $this->thumb_width = $width; $this->thumb_height = $height; } //图片水印设置,如果不生成添加水印则不用设置 //$file : 水印图片 , $pos : 水印位置 , $trans : 水印透明度 function set_watermark ($file, $pos = 6, $trans = 80) { $this->watermark_file = $file; $this->watermark_pos = $pos; $this->watermark_trans = $trans; } /*---------------------------------------------------------------- 执行文件上传,处理完返回一个包含上传成功或失败的文件信息数组, 其中:name 为文件名,上传成功时是上传到服务器上的文件名,上传失败则是本地的文件名 dir 为服务器上存放该附件的物理路径,上传失败不存在该值 size 为附件大小,上传失败不存在该值 flag 为状态标识,1表示成功,-1表示文件类型不允许,-2表示文件大小超出 -----------------------------------------------------------------*/ function execute() { $files = array(); //成功上传的文件信息 $field = $this->field; $keys = array_keys($_FILES[$field]['name']); foreach ($keys as $key) { if (!$_FILES[$field]['name'][$key]) continue; $fileext = $this->fileext($_FILES[$field]['name'][$key]); //获取文件扩展名 $filename = date('Ymdhis',$this->time).mt_rand(10,99).'.'.$fileext; //生成文件名 $filedir = $this->dir; //附件实际存放目录 $filesize = $_FILES[$field]['size'][$key]; //文件大小 //文件类型不允许 if (!in_array($fileext,$this->allow_types)) { $files[$key]['name'] = $_FILES[$field]['name'][$key]; $files[$key]['flag'] = -1; continue; } //文件大小超出 if ($filesize > $this->maxsize) { $files[$key]['name'] = $_FILES[$field]['name'][$key]; $files[$key]['name'] = $filesize; $files[$key]['flag'] = -2; continue; } $files[$key]['name'] = $filename; $files[$key]['dir'] = $filedir; $files[$key]['size'] = $filesize; //保存上传文件并删除临时文件 if (is_uploaded_file($_FILES[$field]['tmp_name'][$key])) { move_uploaded_file($_FILES[$field]['tmp_name'][$key],$filedir.$filename); @unlink($_FILES[$field]['tmp_name'][$key]); $files[$key]['flag'] = 1; //对图片进行加水印和生成缩略图 if (in_array($fileext,array('jpg','png'))) { if ($this->thumb_width) { if ($this->create_thumb($filedir.$filename,$filedir.'thumb_'.$filename)) { $files[$key]['thumb'] = 'thumb_'.$filename; //缩略图文件名 } } $this->create_watermark($filedir.$filename); } } } return $files; } //创建缩略图,以相同的扩展名生成缩略图 //$src_file : 来源图像路径 , $thumb_file : 缩略图路径 function create_thumb ($src_file,$thumb_file) { $t_width = $this->thumb_width; $t_height = $this->thumb_height; if (!file_exists($src_file)) return false; $src_info = getImageSize($src_file); //如果来源图像小于或等于缩略图则拷贝源图像作为缩略图 if ($src_info[0] <= $t_width && $src_info[1] <= $t_height) { if (!copy($src_file,$thumb_file)) { return false; } return true; } //按比例计算缩略图大小 if ($src_info[0] - $t_width > $src_info[1] - $t_height) { $t_height = ($t_width / $src_info[0]) * $src_info[1]; } else { $t_width = ($t_height / $src_info[1]) * $src_info[0]; } //取得文件扩展名 $fileext = $this->fileext($src_file); switch ($fileext) { case 'jpg' : $src_img = ImageCreateFromJPEG($src_file); break; case 'png' : $src_img = ImageCreateFromPNG($src_file); break; case 'gif' : $src_img = ImageCreateFromGIF($src_file); break; } //创建一个真彩色的缩略图像 $thumb_img = @ImageCreateTrueColor($t_width,$t_height); //ImageCopyResampled函数拷贝的图像平滑度较好,优先考虑 if (function_exists('imagecopyresampled')) { @ImageCopyResampled($thumb_img,$src_img,0,0,0,0,$t_width,$t_height,$src_info[0],$src_info[1]); } else { @ImageCopyResized($thumb_img,$src_img,0,0,0,0,$t_width,$t_height,$src_info[0],$src_info[1]); } //生成缩略图 switch ($fileext) { case 'jpg' : ImageJPEG($thumb_img,$thumb_file); break; case 'gif' : ImageGIF($thumb_img,$thumb_file); break; case 'png' : ImagePNG($thumb_img,$thumb_file); break; } //销毁临时图像 @ImageDestroy($src_img); @ImageDestroy($thumb_img); return true; } //为图片添加水印 //$file : 要添加水印的文件 function create_watermark ($file) { //文件不存在则返回 if (!file_exists($this->watermark_file) || !file_exists($file)) return; if (!function_exists('getImageSize')) return; //检查GD支持的文件类型 $gd_allow_types = array(); if (function_exists('ImageCreateFromGIF')) $gd_allow_types['image/gif'] = 'ImageCreateFromGIF'; if (function_exists('ImageCreateFromPNG')) $gd_allow_types['image/png'] = 'ImageCreateFromPNG'; if (function_exists('ImageCreateFromJPEG')) $gd_allow_types['image/jpeg'] = 'ImageCreateFromJPEG'; //获取文件信息 $fileinfo = getImageSize($file); $wminfo = getImageSize($this->watermark_file); if ($fileinfo[0] < $wminfo[0] || $fileinfo[1] < $wminfo[1]) return; if (array_key_exists($fileinfo['mime'],$gd_allow_types)) { if (array_key_exists($wminfo['mime'],$gd_allow_types)) { //从文件创建图像 $temp = $gd_allow_types[$fileinfo['mime']]($file); $temp_wm = $gd_allow_types[$wminfo['mime']]($this->watermark_file); //水印位置 switch ($this->watermark_pos) { case 1 : //顶部居左 $dst_x = 0; $dst_y = 0; break; case 2 : //顶部居中 $dst_x = ($fileinfo[0] - $wminfo[0]) / 2; $dst_y = 0; break; case 3 : //顶部居右 $dst_x = $fileinfo[0]; $dst_y = 0; break; case 4 : //底部居左 $dst_x = 0; $dst_y = $fileinfo[1]; break; case 5 : //底部居中 $dst_x = ($fileinfo[0] - $wminfo[0]) / 2; $dst_y = $fileinfo[1]; break; case 6 : //底部居右 $dst_x = $fileinfo[0]-$wminfo[0]; $dst_y = $fileinfo[1]-$wminfo[1]; break; default : //随机 $dst_x = mt_rand(0,$fileinfo[0]-$wminfo[0]); $dst_y = mt_rand(0,$fileinfo[1]-$wminfo[1]); } if (function_exists('ImageAlphaBlending')) ImageAlphaBlending($temp_wm,True); //设定图像的混色模式 if (function_exists('ImageSaveAlpha')) ImageSaveAlpha($temp_wm,True); //保存完整的 alpha 通道信息 //为图像添加水印 if (function_exists('imageCopyMerge')) { ImageCopyMerge($temp,$temp_wm,$dst_x,$dst_y,0,0,$wminfo[0],$wminfo[1],$this->watermark_trans); } else { ImageCopyMerge($temp,$temp_wm,$dst_x,$dst_y,0,0,$wminfo[0],$wminfo[1]); } //保存图片 switch ($fileinfo['mime']) { case 'image/jpeg' : @imageJPEG($temp,$file); break; case 'image/png' : @imagePNG($temp,$file); break; case 'image/gif' : @imageGIF($temp,$file); break; } //销毁零时图像 @imageDestroy($temp); @imageDestroy($temp_wm); } } } //获取文件扩展名 function fileext($filename) { return strtolower(substr(strrchr($filename,'.'),1,10)); } } |
Memcached的工作方式
以下的部分中,读者最好能准备一份memcached的源代码。
Memcached是传统的网络服务程序,如果启动的时候使用了-d参数,它会以守护进程的方式执行。创建守护进程由daemon.c完成,这个程序只有一个daemon函数,这个函数很简单(如无特殊说明,代码以1.2.1为准):
代码如下 | 复制代码 |
CODE: int switch (fork()) { if (setsid() == -1) if (!nochdir) if (!noclose && (fd = open(”/dev/null”, O_RDWR, 0)) != -1) { |
这个函数 fork 了整个进程之后,父进程就退出,接着重新定位 STDIN 、 STDOUT 、 STDERR 到空设备, daemon 就建立成功了。
代码如下 | 复制代码 |
<?php class Memcached { private $mem; public $pflag=''; // memcached pconnect tag private function memConnect($serkey){ require 'config.php'; $server = $memcached; $this->mem = new Memcache; $link = !$this->pflag ? 'connect' : 'pconnect' ; $this->mem->$link($server[$serkey][0],$server[$serkey][1]) or $this->errordie('memcached connect error'); } public function set($ser_key,$values,$flag='',$expire=''){ $this->memConnect($this->tag($ser_key)); if($this->mem->set($ser_key,$values,$flag,$expire)) return true; else return false; } public function get($ser_key){ $this->memConnect($this->tag($ser_key)); if($var=$this->mem->get($ser_key)) return $var; else return false; } private function tag($ser_key){ $tag=explode('_',$ser_key); return $tag[0]; } private function errordie($errmsg){ die($errmsg); } } ?> |
代码如下 | 复制代码 |
$this->mysqlmaster = new mysqli($msg['master'][0],$msg['master'][1],$msg['master'][2],$msg['master'][3]); //master mysql
require 'init.php'; |
代码如下 | 复制代码 |
<?php $memcached = array( //用memcached 的 多 进程模拟 多台memcached 服务器 cn en 为 内存服务器名 'cn'=>array('192.168.254.144',11211), 'en'=>array('192.168.254.144',11212) ); $mysql = array( // mysql 的主从 我的环境是 : xp 主 linux 从 mysql 5 php5 'master'=>array('192.168.254.213','root','1','mydz'), 'slave_1'=>array('192.168.254.144','root','1','mydz') //可以灵活添加多台从服务器 ); ?> |
Memcached 本身的启动过程,在 memcached.c 的 main 函数中顺序如下:
1 、调用 settings_init() 设定初始化参数
2 、从启动命令中读取参数来设置 setting 值
3 、设定 LIMIT 参数
4 、开始网络 socket 监听(如果非 socketpath 存在)( 1.2 之后支持 UDP 方式)
5 、检查用户身份( Memcached 不允许 root 身份启动)
6 、如果有 socketpath 存在,开启 UNIX 本地连接(Sock 管道)
7 、如果以 -d 方式启动,创建守护进程(如上调用 daemon 函数)
8 、初始化 item 、 event 、状态信息、 hash 、连接、 slab
9 、如设置中 managed 生效,创建 bucket 数组
10 、检查是否需要锁定内存页
11 、初始化信号、连接、删除队列
12 、如果 daemon 方式,处理进程 ID
13 、event 开始,启动过程结束, main 函数进入循环。
在 daemon 方式中,因为 stderr 已经被定向到黑洞,所以不会反馈执行中的可见错误信息。
memcached.c 的主循环函数是 drive_machine ,传入参数是指向当前的连接的结构指针,根据 state 成员的状态来决定动作。
Memcached 使用一套自定义的协议完成数据交换,它的 protocol 文档可以参考: http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt
在API中,换行符号统一为
相关文章
- 这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了教你怎么用Java获取国家法定节假日,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
mysql中获取一天、一周、一月时间数据的各种sql语句写法
创建表:复制代码 代码如下:create table if not exists t( id int, addTime datetime default '0000-00-00 00:00:00′)添加两条初始数据:insert t values(1, '2012-07-12 21:00:00′);insert t values(2, '2012-07...2014-05-31- 这篇文章主要介绍了.NET/C# 使用Stopwatch测量运行时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 这篇文章主要介绍了浅谈redis key值内存消耗以及性能影响,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-07
- 这篇文章主要介绍了详解分析MySQL8.0的内存消耗,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下...2021-03-23
- 想在网页中动态地显示当前系统的时间,找了好多,不过都是一些停在那里不动的。。。不过皇天不负有心人,终于让我找到了...2020-06-25
- 这篇文章主要介绍了JavaScript时间操作之级联日期选择操作,涉及到年、月、日、星期,感兴趣的小伙伴们可以参考一下...2016-01-18
- 实例讲解之前,先来介绍几个核心函数: mktime 函数 mktime() 函数返回一个日期的 Unix 时间戳。 参数总是表示 GMT 日期,因此 is_dst 对结果没有影响。 参数可以从右到左依次空着,空着的参数会被设为相应的当前 GMT 值。...2015-11-08
- 常用的日期时间正则表达式 下面收藏了大量的日期时间正则匹配函数,包括分钟,时间与秒都能达到。 正则表达式 (?n:^(?=d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(...2016-11-25
- 这篇文章主要介绍了postgresql 中的时间处理小技巧(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
- 这篇文章主要介绍了解决使用OpenCV中的imread()内存报错问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
- 我打开android开发手册的时候:http://www.csdn123.com/html/android/reference/packages.html 发现打开速度很慢,我用按了一下F12打开调试面板,切换到网络的选项卡network...2016-05-19
- 这篇文章主要介绍了C# 当前系统时间获取及时间格式详解的相关资料,这里提供代码实例,帮助大家学习参考,需要的朋友可以参考下...2020-06-25
- /*解决代码高亮太长不换行*/ .syntaxhighlighter{word-break:break-all;} uParse('#newstext', {rootPath: '/e/extend/ueditor/'}) 帝国CMS显示指定时间内更新的信息数...2016-11-01
- 这篇文章主要给大家介绍了关于C#使用TimeSpan时间计算的相关资料,以及通过一个实例代码给大家介绍了C#使用timespan和timer完成一个简单的倒计时器的方法,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧...2020-06-25
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
php获取今日开始时间戳和结束时间戳$beginToday=mktime(0,0,0,date('m'),date('d'),date('Y'));$endToday=mktime(0,0,0,date('m'),date('d')+1,date('Y'))-1;//php获取昨日起始时间戳和结束时间...2013-10-04- 这篇文章主要介绍了C#获取文件创建时间的方法,涉及C#文件操作的技巧及CreattionTime属性的使用方法,需要的朋友可以参考下...2020-06-25
PowerShell中使用Get-Date获取日期时间并格式化输出的例子
这篇文章主要介绍了PowerShell中使用Get-Date获取日期时间并格式化输出的例子,本文讲解了直接调用Get-Date、在Write-Host中使用Get-Date、格式化输出的方法,需要的朋友可以参考下...2020-06-30- 这篇文章主要介绍了Vue 中获取当前时间并实时刷新,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-05-13