2019-08-06 17:07:07 raoxiaoya 阅读数 28

php操作系统共享内存

系统环境
Unix / Linux

PHP版本
(PHP 4 >= 4.0.4, PHP 5, PHP 7)

无论是Linux还是Windows,都会提供一定大小的内存给应用程序来使用,共享内存就像一个设置了权限的文件,允许你像操作文件一样操作共享内存。
比如,PHP多进程之间的通讯,你可以使用临时文件,管道,或者共享内存来在进程间交换数据;并且,你也可以通过共享内存来实现不同应用程序间
的通讯。

首先,Linux层面对于共享内存的管理
1、查看已设置的共享内存中的内存段列表
ipcs -m

------------ 共享内存段 --------------
键        shmid      拥有者  权限     字节     nattch     状态 

以上是没有使用过共享内存的情况

------------ 共享内存段 --------------
键key       shmid      拥有者owner  	权限perms   字节bytes    nattch     状态status      
0x00000360 	0          root     	755      	1024    	0 

以上是有可用的片段的情况,是不是可文件的形式很相似。

字段解释:

key 	:共享内存的唯一的key值,共享内存通过该key来判断你读取的是哪一块内存。
shmid	:当使用key来获取内存时,你获得的是这个id的值。它作为你操作内存块的标识,类型为 resource(4) of type (shmop)
owner	:创建该共享内存块的用户
perms	:该共享内存的读写权限,8禁止,可以是777,与文件的读写权限一致。
bytes	:该内存块的大小,字节
nattch	:连接该内存块的进程数
status	:当前状态,如:dest,即将删除等。

key是一个16进制值,我们也可以传10进制值

一般操作:通过key来打开一个内存段,返回shmid,之后通过这个shmid来操作内存段。

查看系统共享内存大小

cd /proc/sys/kernel
cat shmmax

shmop系列函数
PHP通过shmop函数来操作共享内存,非常之方便。

shmop_open()
	它允许您打开一个现有的内存段或创建一个新内存段。此函数非常类似于经典的fopen函数.
	$shmid = shmop_open(864, 'c', 0755, 1024);

	第一个参数就是上面的key,如果不存在就会创建,十进制的 864 就是16进制的 0x00000360,都可以使用。返回值就是shmid,失败返回FALSE
	第二个参数是访问模式
		模式 “a”,它允许您访问只读内存段
		模式 “w”,它允许您访问可读写的内存段
		模式 “c”,它创建一个新内存段,或者如果该内存段已存在,尝试打开它进行读写
		模式 “n”,它创建一个新内存段,如果该内存段已存在,则会失败
	第三个参数为权限
	第四个参数为大小,字节

shmop_write()
	写入数据,失败时会返回 FALSE,在成功时会返回写入的字节数。
	shmop_write($shmid, "Hello World!", 0);
	第三个参数为offset

shmop_read()
	读取共享内存数据
	$str = shmop_read($shmid, 0, 11);// offset, length

shmop_size()
	获取指定片段的内存大小,字节
	$size = shmop_size($shmid);

shmop_delete()
	标记为删除,阻止任何其他进程打开它,并没有实际删除。因为本进程正在打开该片段,需要关闭后才会实际被删除。

shmop_close()
	关闭内存段。

实例:
文件1

$shmid = shmop_open(864, 'c', 0755, 1024);// 0x00000360
shmop_write($shmid, "Hello World PHP!", 0);
shmop_close($shmid);

查看

ipcs -m

文件2

$shmid = shmop_open(864, 'c', 0755, 1024);// 0x00000360
var_dump($shmid);// resource(4) of type (shmop)
$size = shmop_size($shmid);
echo shmop_read($shmid, 0, $size) . PHP_EOL;
shmop_close($shmid);

当然,也可以使用其他程序打开,比如java, c++等

并发的问题
共享内存的操作并不是原子性的,多个进程同时操作就存在并发的问题。

总结
因为共享内存是存储在本机的,所以多台服务器的话就不好用了,实际应用中也使用的很少,比较现在做缓存的程序很多,且都很优秀。

2017-04-22 20:49:48 weixin_37194108 阅读数 454
/**
 * 判断操作系统位数
 */
function is_64bit() {
    $int = "9223372036854775807";
    $int = intval($int);
    if ($int == 9223372036854775807) {
        /* 64bit */
        return true;
    }
    elseif ($int == 2147483647) {
        /* 32bit */
        return false;
    }
    else {
        /* error */
        return "error";
    }
}
2020-01-15 09:35:46 huangkang1995 阅读数 4

PHP获取客户端浏览以及操作系统信息

PHP获取客户端浏览器以及操作系统信息是通过客户端浏览器传递过来的useragent信息进行判定的,因为客户端useragent信息可以伪造,所以通过PHP获取到的浏览器以及操作系统信息只能作为参考,如下代码还有待丰富的地方。

PHP中可以直接通过读取超全局数组$_SERVER[‘HTTP_USER_AGENT’]进行正则匹配即可获取到相应的浏览和操作系统信息。说白了,就是对php的pcre兼容的正则表达式的理解。

一、获取客户端浏览器信息,包括版本号

function get_broswer(){
    	 $sys = $_SERVER['HTTP_USER_AGENT'];  //获取用户代理字符串
         if (stripos($sys, "Firefox/") > 0) {
             preg_match("/Firefox\/([^;)]+)+/i", $sys, $b);
             $exp[0] = "Firefox";
             $exp[1] = $b[1];  //获取火狐浏览器的版本号
         } elseif (stripos($sys, "Maxthon") > 0) {
             preg_match("/Maxthon\/([\d\.]+)/", $sys, $aoyou);
             $exp[0] = "傲游";
             $exp[1] = $aoyou[1];
         } elseif (stripos($sys, "MSIE") > 0) {
             preg_match("/MSIE\s+([^;)]+)+/i", $sys, $ie);
             $exp[0] = "IE";
             $exp[1] = $ie[1];  //获取IE的版本号
         } elseif (stripos($sys, "OPR") > 0) {
    		     preg_match("/OPR\/([\d\.]+)/", $sys, $opera);
             $exp[0] = "Opera";
             $exp[1] = $opera[1];  
         } elseif(stripos($sys, "Edge") > 0) {
             //win10 Edge浏览器 添加了chrome内核标记 在判断Chrome之前匹配
             preg_match("/Edge\/([\d\.]+)/", $sys, $Edge);
             $exp[0] = "Edge";
             $exp[1] = $Edge[1];
         } elseif (stripos($sys, "Chrome") > 0) {
    		     preg_match("/Chrome\/([\d\.]+)/", $sys, $google);
             $exp[0] = "Chrome";
             $exp[1] = $google[1];  //获取google chrome的版本号
         } elseif(stripos($sys,'rv:')>0 && stripos($sys,'Gecko')>0){
             preg_match("/rv:([\d\.]+)/", $sys, $IE);
    		     $exp[0] = "IE";
             $exp[1] = $IE[1];
         }else {
    		$exp[0] = "未知浏览器";
            $exp[1] = ""; 
    	 }
         return $exp[0].'('.$exp[1].')';
    }

二、获取客户端操作系统信息,包括粗略的版本信息

function get_os(){
    $agent = $_SERVER['HTTP_USER_AGENT'];
        $os = false;
     
        if (preg_match('/win/i', $agent) && strpos($agent, '95'))
        {
          $os = 'Windows 95';
        }
        else if (preg_match('/win 9x/i', $agent) && strpos($agent, '4.90'))
        {
          $os = 'Windows ME';
        }
        else if (preg_match('/win/i', $agent) && preg_match('/98/i', $agent))
        {
          $os = 'Windows 98';
        }
        else if (preg_match('/win/i', $agent) && preg_match('/nt 6.0/i', $agent))
        {
          $os = 'Windows Vista';
        }
        else if (preg_match('/win/i', $agent) && preg_match('/nt 6.1/i', $agent))
        {
          $os = 'Windows 7';
        }
    	  else if (preg_match('/win/i', $agent) && preg_match('/nt 6.2/i', $agent))
        {
          $os = 'Windows 8';
        }else if(preg_match('/win/i', $agent) && preg_match('/nt 10.0/i', $agent))
        {
          $os = 'Windows 10';#添加win10判断
        }else if (preg_match('/win/i', $agent) && preg_match('/nt 5.1/i', $agent))
        {
          $os = 'Windows XP';
        }
        else if (preg_match('/win/i', $agent) && preg_match('/nt 5/i', $agent))
        {
          $os = 'Windows 2000';
        }
        else if (preg_match('/win/i', $agent) && preg_match('/nt/i', $agent))
        {
          $os = 'Windows NT';
        }
        else if (preg_match('/win/i', $agent) && preg_match('/32/i', $agent))
        {
          $os = 'Windows 32';
        }
        else if (preg_match('/linux/i', $agent))
        {
          $os = 'Linux';
        }
        else if (preg_match('/unix/i', $agent))
        {
          $os = 'Unix';
        }
        else if (preg_match('/sun/i', $agent) && preg_match('/os/i', $agent))
        {
          $os = 'SunOS';
        }
        else if (preg_match('/ibm/i', $agent) && preg_match('/os/i', $agent))
        {
          $os = 'IBM OS/2';
        }
        else if (preg_match('/Mac/i', $agent) && preg_match('/PC/i', $agent))
        {
          $os = 'Macintosh';
        }
        else if (preg_match('/PowerPC/i', $agent))
        {
          $os = 'PowerPC';
        }
        else if (preg_match('/AIX/i', $agent))
        {
          $os = 'AIX';
        }
        else if (preg_match('/HPUX/i', $agent))
        {
          $os = 'HPUX';
        }
        else if (preg_match('/NetBSD/i', $agent))
        {
          $os = 'NetBSD';
        }
        else if (preg_match('/BSD/i', $agent))
        {
          $os = 'BSD';
        }
        else if (preg_match('/OSF1/i', $agent))
        {
          $os = 'OSF1';
        }
        else if (preg_match('/IRIX/i', $agent))
        {
          $os = 'IRIX';
        }
        else if (preg_match('/FreeBSD/i', $agent))
        {
          $os = 'FreeBSD';
        }
        else if (preg_match('/teleport/i', $agent))
        {
          $os = 'teleport';
        }
        else if (preg_match('/flashget/i', $agent))
        {
          $os = 'flashget';
        }
        else if (preg_match('/webzip/i', $agent))
        {
          $os = 'webzip';
        }
        else if (preg_match('/offline/i', $agent))
        {
          $os = 'offline';
        }
        else
        {
          $os = '未知操作系统';
        }
        return $os;  
    }

三、获取用户IP

function get_real_ip()
	{
		$ip=FALSE;
		//客户端IP 或 NONE 
		if(!empty($_SERVER["HTTP_CLIENT_IP"])){
			$ip = $_SERVER["HTTP_CLIENT_IP"];
		}
		//多重代理服务器下的客户端真实IP地址(可能伪造),如果没有使用代理,此字段为空
		if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
			$ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
			if ($ip) { array_unshift($ips, $ip); $ip = FALSE; }
			for ($i = 0; $i < count($ips); $i++) {
				if (!eregi ("^(10│172.16│192.168).", $ips[$i])) {
					$ip = $ips[$i];
					break;
				}
			}	
		}
		//客户端IP 或 (最后一个)代理服务器 IP 
		return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);
	}
2018-03-02 10:10:46 qq_35025830 阅读数 919

如何使用php获取当前操作系统类型呢?严格来说这里分两种情况,一种情况是获取服务器端的操作系统类型,一种是获取客户端的操作系统类型。下面作者将对如何使用php获取这两种情况下的操作系统类型和大家做一些分享。
(1)php获取服务器端的操作系统类型
这个时候可以使用php系统自带的常量 PHP_OS 或者系统函数php_uname('s')关于这两者返回的值可能的情况基本有如下几种情况:

  • CYGWIN_NT-5.1
  • Darwin
  • FreeBSD
  • HP-UX
  • IRIX64
  • Linux
  • NetBSD
  • OpenBSD
  • SunOS
  • Unix
  • WIN32
  • WINNT
  • Windows
  • CYGWIN_NT-5.1
  • IRIX64
  • SunOS
  • HP-UX
  • OpenBSD

不过根据具体情况读者还是自行打印出来结果看看最好,也许获得的结果不在上述之列。

(2)php获取客户端的操作系统类型,这里分享一个函数,比网上流传的那些判断更加精准,而且没有bug,函数代码如下:

function getOS(){ 
 $os=''; 
 $Agent=$_SERVER['HTTP_USER_AGENT']; 
 if (eregi('win',$Agent)&&strpos($Agent, '95')){ 
  $os='Windows 95'; 
 }elseif(eregi('win 9x',$Agent)&&strpos($Agent, '4.90')){ 
  $os='Windows ME'; 
 }elseif(eregi('win',$Agent)&&ereg('98',$Agent)){ 
  $os='Windows 98'; 
 }elseif(eregi('win',$Agent)&&eregi('nt 5.0',$Agent)){ 
  $os='Windows 2000'; 
 }elseif(eregi('win',$Agent)&&eregi('nt 6.0',$Agent)){ 
  $os='Windows Vista'; 
 }elseif(eregi('win',$Agent)&&eregi('nt 6.1',$Agent)){ 
  $os='Windows 7'; 
 }elseif(eregi('win',$Agent)&&eregi('nt 5.1',$Agent)){ 
  $os='Windows XP'; 
 }elseif(eregi('win',$Agent)&&eregi('nt',$Agent)){ 
  $os='Windows NT'; 
 }elseif(eregi('win',$Agent)&&ereg('32',$Agent)){ 
  $os='Windows 32'; 
 }elseif(eregi('linux',$Agent)){ 
  $os='Linux'; 
 }elseif(eregi('unix',$Agent)){ 
  $os='Unix'; 
 }else if(eregi('sun',$Agent)&&eregi('os',$Agent)){ 
  $os='SunOS'; 
 }elseif(eregi('ibm',$Agent)&&eregi('os',$Agent)){ 
  $os='IBM OS/2'; 
 }elseif(eregi('Mac',$Agent)&&eregi('PC',$Agent)){ 
  $os='Macintosh'; 
 }elseif(eregi('PowerPC',$Agent)){ 
  $os='PowerPC'; 
 }elseif(eregi('AIX',$Agent)){ 
  $os='AIX'; 
 }elseif(eregi('HPUX',$Agent)){ 
  $os='HPUX'; 
 }elseif(eregi('NetBSD',$Agent)){ 
  $os='NetBSD'; 
 }elseif(eregi('BSD',$Agent)){ 
  $os='BSD'; 
 }elseif(ereg('OSF1',$Agent)){ 
  $os='OSF1'; 
 }elseif(ereg('IRIX',$Agent)){ 
  $os='IRIX'; 
 }elseif(eregi('FreeBSD',$Agent)){ 
  $os='FreeBSD'; 
 }elseif($os==''){ 
  $os='Unknown'; 
 } 
 return $os; 
}

根据服务器端还是客户端来决定采取的办法,希望通过这篇文章大家知道如何使用php获取当前操作系统类型。

2015-06-26 01:09:35 cfs56 阅读数 126
//注:本php文件系统纯属个人编写,官方网站http://haook.cn QQ594923603
//docusystem.php  页面如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
    <style>
        .info{width:900px;height:800px;margin:35px auto;}
        .infoul{list-style-type:none;width:860px;padding:0;margin:0px;text-indent: 10px;}
        .infoul li{border-bottom:1px solid green;line-height:35px;width:900px;overflow: hidden;}
        .infodiv1{float:left;width:500px;height:35px;}
        .infodiv2{float:left;width:150px;}
        .infodiv3{float:left;width:150px;}
        .infodiv4{float:left;width:500px;text-indent: 10px;}
        .infodiv5,.infodiv6{float:left;width:150px;text-indent: 10px;}
        .info2{width:900px;background-color:#ececec;line-height:40px;font-size:18px;border-top:2px solid orange;overflow: hidden;}
        .openfile{position:absolute;left:250px;top:50px;border-radius:6px;padding:8px 12px;background-color:blue;color:white;cursor: pointer;}
        .newfile{position:absolute;left:400px;top:50px;border-radius:5px;padding:8px 12px;background-color:blue;color:white;cursor: pointer;}
        .shang{position:absolute;left:407px;top:112px;border-radius:5px;padding:3px 5px;background-color:#999999;color:white;cursor: pointer;}
        .anone{display:none;}
        .backs{height:70px;background-color:#ececec;}
        .shang:hover{background-color:#9ccccc;}
        a{color:blue;cursor:pointer;}
        a:hover{padding:2px 4px;border:1px dashed red;}  
        .dvsty:hover{background-color:orange;cursor:pointer;}
        .dvsty{text-indent: 20px;background:url(jia.jpg) no-repeat left;}
       
    </style>
    <script src="jquery-1.10.2.min.js"></script>   //引入JQ插件
</head>
<body>
   <?php
   if(isset($_GET['index1'])){
        $ff2=$_GET['index1'].'/';
        $ff=iconv('utf-8','gbk',$ff2);
    }else{
     $ff="test/";$ff2="test/"; //首次加载时,设置的根目录
    }
   ?>
     <button class="shang" onclick="javascript:history.back();">上一级目录</button>
    <div id="infoid" class="info">
    <div class="backs">
    <div class="openfile" id="newfiles" onclick="document.getElementById('aa').click();">添加文件
    <form action="docusystem.php?index1=<?php echo $ff2;?>" method="post" enctype="multipart/form-data">
        <input id="aa" type="file" class="anone" name="uploadFile1"/><input id="dijiao" type="submit" class="anone" />
    </form>
    </div>
    <div class="newfile" id="newjia">新建文件夹</div>
    </div>
    <div class="info2">
    <div class="infodiv4">文件名</div>
    <div class="infodiv5">大小</div>
    <div class="infodiv6">创建日期</div>
    </div>
            
    <?php
     //ini_set('date.timezone','Asia/Shanghai'); //获取时间显示方式
     date_default_timezone_set("PRC");  //东八区
      //header('Content-Type:text/html;charset=utf-8');
    
    //表单文件存放
    if(isset($_FILES["uploadFile1"])){
        if($_FILES["uploadFile1"]["error"]>0){
            echo "信息有误,请检查!---" .$_FILES["uploadFile1"]["error"]."<br />";
        }else{
            $name=iconv("UTF-8","gbk",$_FILES["uploadFile1"]["name"]);
            move_uploaded_file($_FILES["uploadFile1"]["tmp_name"],$ff.$name);
        }
    }
    //读取到数据就显示、加载在页面上
    if(is_dir($ff)){
        $wenjianjia=array();
        $wenjian=array();
        $shu1=scandir($ff);
        foreach($shu1 as $shu2){
            if($shu2!='.' && $shu2!='..'){
                if(is_dir($ff.$shu2)){ //如果为目录
                    $wenjianjia[]= array(
                                    "name"=>iconv('gbk','utf-8',$shu2),
                                    "ss1"=>sprintf('%0.2f',filesize($ff.$shu2)/1024), //文件大小,
                                    "filectime1"=>date("Y-m-d",filectime($ff.$shu2)),
                                    );
                }else{ //为文件
                    $wenjian[]=array(
                                    "name"=>iconv('gbk','utf-8',$shu2),
                                    "ss1"=>sprintf('%0.2f',filesize($ff.$shu2)/1024), //文件大小,
                                    "filectime2"=>date("Y-m-d",filectime($ff.$shu2)),
                                    );
                }
            }
        }
    ?>
        <ul class="infoul">
        <?php
        foreach($wenjianjia as $wenjianjia2){
        ?>    
            <li  name="jianame" class="<?php echo $wenjianjia2["name"];?>" id="jias">  
                <?php
                 echo '<div name="jianamediv" class="infodiv1 dvsty" >'.$wenjianjia2['name'].'</div>'.'<div class="infodiv2">'.$wenjianjia2['ss1'].'Kb'.'</div>'.
                        '<div class="infodiv3">'.$wenjianjia2['filectime1'].'</div>';
                ?>
                <a class="<?php echo $ff2.$wenjianjia2["name"];?>" >删除</a>
            </li>    
        <?php
        }
            foreach($wenjian as $wenjian2){    
        ?>
            <li>
                <?php
                    echo '<div class="infodiv1">'.$wenjian2['name'].'</div>'.'<div class="infodiv2">'.$wenjian2['ss1'].'Kb'.'</div>'.
                    '<div class="infodiv3">'.$wenjian2['filectime2'].'</div>';
                ?>
                <a class="<?php echo $ff2.$wenjian2['name'];?>" >删除</a>
            </li>
            <?php
            }
            ?>
        </ul>
<?php    
    }
?>

</div>
</body>
<script>

        //---删除按钮
        $("ul li a").click(function(){
            var rrr= this.className;
            //$.post("ajax.php",{namet:$("#uname").val()},//获取类名为"name"文本的值,以NAME异步传值
            $.post("ajax.php",{namet:rrr},
             function(data){//data为反回值,function进行反回值处理
              alert(data);
               location.href="docusystem.php?index1=<?php echo $ff2;?>";
              });
             // alert(rrr);
        });    
        
        //添加文件            
        $("input[type='file']").change( function() {    
            document.getElementById('dijiao').click();    
        });
        
        //新建文件夹
         $("#newjia").click(function(){
            function yy(){
                var name = prompt("请输入文件夹名称!","");
                if(name==""){
                    yy();
                }else if(name==null){
                    alert("文件夹名不能为空哟-_-");
                    //yy(); 注释掉,不然就很流氓哦
                }
                else{
                    var jiadery="<?php echo $ff2;?>"+name;  
                    $.post("ajax.php",{newjias:jiadery},
                     function(data){
                        if(data!=""){
                            
                        }else{
                            alert(data);
                        }
                       location.href="docusystem.php?index1=<?php echo $ff2;?>";
                      });
                }
            }yy();            
        });    
        
        //点击文件夹触发
          $(".dvsty").click(function(){
            var jiadery="<?php echo $ff2;?>"+$(this).parent("li").attr("class"); //点击div获取父亲的class名
            location.href="docusystem.php?index1="+jiadery;    
            //alert(jiadery);            
        });    
            
</script>
</html>

//ajax.php  页面如下:
 <?php  
    
    if(isset($_POST['namet'])){
        $name1=$_POST['namet'];
        $dele=iconv('utf-8','gbk',$name1);
        if(is_dir($dele)){ //如果为目录,删除文件夹
        //echo $dele;
            function dirdele($dele){
                $arr=scandir($dele);
                foreach($arr as $filerr){
                    if($filerr != '.' && $filerr != '..'){
                        $hou=$dele.'/'.$filerr;
                        if(!is_dir($hou)){
                            unlink($hou);
                        }else{
                            dirdele($hou);
                        }      
                    }  
                }
                rmdir($dele); //空目录删除
            }
            dirdele($dele);    
            echo '删除成功';    
        }else{ //如果为文件,删除文件
        //echo $dele;    
            if(@unlink($dele)){         
            echo '成功删除文件!>';
            }else{
                echo '文件出错,请检查是否有权限删除!';
            }    
        }
        
    }    
 
    //新建文件夹
    if(isset($_POST['newjias'])){
        $mkjia=$_POST['newjias'];
        $mkjia2=iconv('utf-8','gbk',$mkjia);
        if(mkdir( $mkjia2, 0755)){
            //添加成功不提示
        }else{
            echo '新建文件夹 失败!';
        }
            
    }
?>


//注:本php文件系统纯属个人编写,官方网站http://haook.cn QQ594923603





PHP 获取操作系统

阅读数 640

没有更多推荐了,返回首页