当前位置:  c/c++开源软件 iis7站长之家
本页文章导读:
    ▪php根据分类合并数组的方法      本节内容: php数组合并 php根据数组ID重新合并数组,根据分类来操作。   1,最简单的数组合并,只要使用array_merge即可。 array_merge()将两个或多个数组的单元合并起来,一个数组中的值附.........
    ▪php文件浏览器的实例代码      本节内容: php文件浏览器 代码功能: 模仿windows系统的那种文件浏览器。 原理: 使用php的glob函数,或opendir、readdir、scandir函数,也是可行的。 例子:   代码示例: <?php /** * php文件浏.........
    ▪php多用户读写文件冲突问题的解决办法      在php编程中,多用户同时读写一个文件时,会遇到flock的问题。   一般会这样解决:   代码示例: <?php $fp = fopen("/tmp/lock.txt", "w+"); if (flock($fp, LOCK_EX)) {     fwrite($fp, "Write something heren");.........

[1]php根据分类合并数组的方法
    来源: 互联网  发布时间: 2013-12-24

本节内容:
php数组合并

php根据数组ID重新合并数组,根据分类来操作。
 
1,最简单的数组合并,只要使用array_merge即可。
array_merge()将两个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。
数组键名为数字键名时,要合并的两个数组中有同名数字KEY的时候,使用array_merge()不会覆盖掉原来的值,而使用“+”合并数组则会把最先出现的值作为最终结果返回,而把后面的数组拥有相同键名的那些值“抛弃”掉(注意:不是覆盖而是保留最先出现的那个值)。

例子:
 

代码示例:
<?php
  $array1 = array(1=>'0');
  $array2 = array(1=> "data");
     $result1 = $array2 + $array1;/*结果为$array2的值*/
    print_r($result);
    $result = $array1 + $array2 ;/*结果为$array1的值*/
    print_r($result);
    $result3 = array_merge($array2,$array1);/*结果为$array2和$array1的值,键名被重新分配*/
    print_r($result3);
    $result4 = array_merge($array1,$array2);/*结果为$array1和$array2的值,键名被重新分配*/
    print_r($result4);

输出结果:
 

Array ( [1] => data )
Array ( [1] => 0 )
Array (
[0] => data
[1] => 0
)
Array
(
[0] => 0
[1] => data
)

2,当相同数组键名为字符时,“+”运算符与键名为数字时一样,但array_merge()此时会覆盖掉前面相同键名的值。
例子:
 

代码示例:
<?php
 $array1 = array('asd'=>'0');
  $array2 = array('asd' => "data");
  $result1 = $array2 + $array1;/*结果为$array2的值*/
  print_r($result);
    $result = $array1 + $array2 ;/*结果为$array1的值*/
    print_r($result);
    $result3 = array_merge($array2,$array1);/*结果为$array1*/
    print_r($result3);
    $result4 = array_merge($array1,$array2);/*结果为$array2*/
    print_r($result4);

输出结果:
 

Array ( [asd] => data )
Array ( [asd] => 0 )
Array ( [asd] => 0 )
Array ( [asd] => data )

下面进入本节的重点:根据分类字段进行数组重组。
例子:
 

代码示例:

<?php
//需要重组的数组
$arrar=array();
$array[]=array('ItemID' => 110126866896,'CategoryID'=>111);
$array[]=array('ItemID' => 120126866896,'CategoryID'=>112);
$array[]=array('ItemID' => 130126866896,'CategoryID'=>113);
$array[]=array('ItemID' => 140126866896,'CategoryID'=>114);
$array[]=array('ItemID' => 150126866896,'CategoryID'=>115);
$array[]=array('ItemID' => 160126866896,'CategoryID'=>116);
$array[]=array('ItemID' => 170126866896,'CategoryID'=>117);
$array[]=array('ItemID' => 118126866896,'CategoryID'=>111);
$array[]=array('ItemID' => 121126866896,'CategoryID'=>112);
$array[]=array('ItemID' => 132126866896,'CategoryID'=>113);
$array[]=array('ItemID' => 143126866896,'CategoryID'=>114);
$array[]=array('ItemID' => 154126866896,'CategoryID'=>115);
$array[]=array('ItemID' => 165126866896,'CategoryID'=>116);
$array[]=array('ItemID' => 176126866896,'CategoryID'=>117);
//数组根据分类进行重组
$newArray=array();
foreach($array as $val){
    $newArray[$val['CategoryID']][]=$val;
}

//删除原始数组释放空间
$array=null;
unset($array);

print_r($newArray);
?>


    
[2]php文件浏览器的实例代码
    来源: 互联网  发布时间: 2013-12-24

本节内容:
php文件浏览器

代码功能:
模仿windows系统的那种文件浏览器。

原理:
使用php的glob函数,或opendir、readdir、scandir函数,也是可行的。

例子:
 

代码示例:
<?php
/**
* php文件浏览器
* edit:www.
*/
session_start();
include "config.php";
include WWW_URL."/lib/Smarty/plugins/modifier.truncate.php";
$login=$_SESSION['login'];
if($login=="")
{
 header("location:index.php");
}
else
{
 $path=$_GET['path'].'/';
 $dir=WWW_URL.'/';
 switch($_GET['action'])
 {
  case 'list':
   if($path)
   {
    $dir.=$path;
   }
   chdir($dir);
   $type=1;
  break;
 
  case 'scan':
   $filename=$_GET['filename'];
   $file_arr=explode()('.',$filename);
   if($file_arr[1]!='jpg'&&$file_arr[1]!='jpeg'&&$file_arr[1]!='png')
   {
    $file_type='txt';
    $doc=file_get_contents($dir.$path.$filename);
   }
   else
   {
    $file_type='pic';
    $doc=BASE_URL.'admin/upload/'.$filename;
   }
   $type=2;
  break;
 }
 $file=folder_sort(glob('*'));
 $path_arr=explode('/',$path);
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" href="/blog_article/templates/template/css.css" type="text/css" />
<title>文件浏览器 - www.</title>
</head>
<body>
<?php if($type==1):?>
<div >
  <div ><img src="/blog_article/templates/template/images/ico_clew_yes.gif" border="0"/>&nbsp;<a>文件浏览器</a></div>
  <table cellpadding="0" cellspacing="0"><tr><td>
  <a href="/blog_article/file_scan/action/list.html" title="网站根目录">网站根目录</a>
  <?php if($path_arr):?>
    <?php foreach($path_arr as $pp):?>
  <? if($pp):?> >> <a href="/blog_article/file_scan/action/list/amp;path/lt;/cut($path,$pp)/gt;.html" title="<?=$pp?>"><?=$pp?></a><? endif?>
    <?php endforeach;endif?>
  <br/><br/>
  <ul >
  <?php if($file):?>
  <?php foreach($file as $f): ?>
  <a href="file_scan.php?action=<?php if(substr($f,strlen($f)-1)==1):?>list&path=<?=$path.substr($f,0,-1)?><?php elseif(substr($f,strlen($f)-1)==2):?>scan&path=<?=substr($path,0,-1)?>&filename=<?=substr($f,0,-1)?><?php endif?>" title="<?=substr($f,0,-1)?>">
  <li>
  <? $ty=explode('.',$f);?>
  <? if(!$ty[1]):?><img src="/blog_article/<_=BASE_URL_>admin/templates/template/images/folder.png" width="64" height="64"/>
  <? elseif($ty[1]=='php2'):?><img src="/blog_article/<_=BASE_URL_>admin/templates/template/images/php.png" width="64" height="64"/>
  <? elseif($ty[1]=='jpeg2'||$ty[1]=='jpg2'||$ty[1]=='png2'||$ty[1]=='ico2'||$ty[1]=='gif2'):?><img src="/blog_article/<_=BASE_URL_>admin/templates/template/images/pic.png" width="64" height="64"/>
  <? elseif($ty[1]=='css2'):?><img src="/blog_article/<_=BASE_URL_>admin/templates/template/images/css.png" width="64" height="64"/>
  <? elseif($ty[1]=='js2'):?><img src="/blog_article/<_=BASE_URL_>admin/templates/template/images/js.png" width="64" height="64"/>
  <? elseif($ty[1]=='html2'||$ty[1]=='shtml2'||$ty[1]=='htm2'):?><img src="/blog_article/<_=BASE_URL_>admin/templates/template/images/html.png" width="64" height="64"/>
  <? elseif($ty[1]=='swf2'):?><img src="/blog_article/<_=BASE_URL_>admin/templates/template/images/swf.png" width="64" height="64"/>
  <? elseif($ty[1]=='txt2'):?><img src="/blog_article/<_=BASE_URL_>admin/templates/template/images/txt.gif" width="64" height="64"/>
  <? elseif($ty[1]=='xml2'):?><img src="/blog_article/<_=BASE_URL_>admin/templates/template/images/xml.png" width="64" height="64"/>
  <? endif?>
  <br/><?=smarty_modifier_truncate(substr($f,0,-1),15)?>
  </li></a>
  <?php endforeach;endif?>
  </ul></td></tr></table>
</div>
<?php elseif($type==2):?>
<div >
  <div ><img src="/blog_article/templates/template/images/ico_clew_yes.gif" border="0"/>&nbsp;<a>查看文件内容</a></div>
  <table cellspacing="0">
    <tr id="msg"><td>
    <a href="/blog_article/file_scan/action/list.html" title="网站根目录">网站根目录</a>
    <?php if($path_arr):?>
    <?php foreach($path_arr as $pp):?>
  <? if($pp):?> >> <a href="/blog_article/file_scan/action/list/amp;path/lt;/cut($path,$pp)/gt;.html" title="<?=$pp?>"><?=$pp?></a><? endif?>
    <?php endforeach;endif?>
  <br/><br/>
    <? if($file_type=='txt'):?>
    <textarea ><?=$doc?></textarea>
    <?php elseif($file_type=='pic'):?>
    <img src="/blog_article/</$doc/gt;.html"/>
 <?php endif?>
    </td></tr>
  </table>
</div>
<?php endif?>
</body>
</html>
<style>
.file_scan{ background-color:#FFFFFF; padding:0; margin:0}
.file_scan li{ list-style:none; width:100px; height:100px;float:left; margin:0 0 3px 3px; text-align:center}
.file_scan a{ text-decoration:none; color:#000}
table tr td a {color:#09F;text-decoration:underline;line-height:20px}
table tr td a:hover {color:#
imF00;font-weight:bold;text-decoration:none}
</style>

如下图:


    
[3]php多用户读写文件冲突问题的解决办法
    来源: 互联网  发布时间: 2013-12-24

在php编程中,多用户同时读写一个文件时,会遇到flock的问题。
 
一般会这样解决:
 

代码示例:
<?php
$fp = fopen("/tmp/lock.txt", "w+");
if (flock($fp, LOCK_EX)) {
    fwrite($fp, "Write something heren");
    flock($fp, LOCK_UN);
} else {
    echo "Couldn't lock the file !";
}
fclose($fp);

但在PHP中,flock似乎工作的不是那么好!在多并发情况下,似乎是经常独占资源,不即时释放,或根本不释放,造成死锁,从而使服务器的cpu占用很高,甚至会让服务器彻底死掉。

在很多linux系统或unix系统中,都会有这样的情况发生。
所以使用flock之前,一定要慎重考虑。
如果flock()使用得当,完全可能解决死锁的问题。

当然,如果不考虑使用flock()函数,也可以参考其它的方法。

本文分享几个解决方案,供大家学习参考。

方案一:对文件进行加锁时,设置一个超时时间.
 

代码示例:
<?php
if($fp = fopen($fileName, 'a')) {
 $startTime = microtime();
 do {
         $canWrite = flock($fp, LOCK_EX);
  if(!$canWrite) usleep(round(rand(0, 100)*1000));
 } while ((!$canWrite)&& ((microtime()-$startTime) < 1000));
 if ($canWrite) {
   fwrite($fp, $dataToSave);
 }
 fclose($fp);
}
 

超时设置为1ms,如果这里时间内没有获得锁,就反复获得,直接获得到对文件操作权为止。
如果超时限制已到,就必需马上退出,让出锁让其它进程来进行操作。

方案二:不使用flock函数,借用临时文件来解决读写冲突的问题。
大致原理如下:
1,将需要更新的文件考虑一份到我们的临时文件目录,将文件最后修改时间保存到一个变量,并为这个临时文件取一个随机的,不容易重复的文件名。
2,当对这个临时文件进行更新后,再检测原文件的最后更新时间和先前所保存的时间是否一致。
3,如果最后一次修改时间一致,就将所修改的临时文件重命名到原文件,为了确保文件状态同步更新,所以需要清除一下文件状态。
4,但是,如果最后一次修改时间和先前所保存的一致,这说明在这期间,原文件已经被修改过,这时,需要把临时文件删除,然后返回false,说明文件这时有其它进程在进行操作。

例子:
 

代码示例:

<?php
$dir_fileopen = "tmp";

function randomid() {
    return time().substr(md5(microtime()), 0, rand(5, 12));
}
function cfopen($filename, $mode) {
    global $dir_fileopen;
    clearstatcache();
    do {
        $id = md5(randomid(rand(), TRUE));
        $tempfilename = $dir_fileopen."/".$id.md5($filename);
    } while(file_exists($tempfilename));
    if (file_exists($filename)) {
        $newfile = false;
        copy($filename, $tempfilename);
    }else{
        $newfile = true;
    }
    $fp = fopen($tempfilename, $mode);
    return $fp ? array($fp, $filename, $id, @filemtime($filename)) : false;
}
function cfwrite($fp,$string) { return fwrite($fp[0], $string); }
function cfclose($fp, $debug = "off") {
    global $dir_fileopen;
    $success = fclose($fp[0]);
    clearstatcache();
    $tempfilename = $dir_fileopen."/".$fp[2].md5($fp[1]);
    if ((@filemtime($fp[1]) == $fp[3]) || ($fp[4]==true && !file_exists($fp[1])) || $fp[5]==true) {
        rename($tempfilename, $fp[1]);
    }else{
        unlink($tempfilename);
  //说明有其它进程 在操作目标文件,当前进程被拒绝
        $success = false;
    }
    return $success;
}
$fp = cfopen('lock.txt','a+');
cfwrite($fp,"welcome to beijing.n");
fclose($fp,'on');
 

说明:
1,rename();重命名一个文件或一个目录,该函数其实更像linux里的mv。更新文件或者目录的路径或名字很方便。
但当我在window测试上面代码时,如果新文件名已经存在,会给出一个notice,说当前文件已经存在。但在linux下工作的很好。

2,clearstatcache();清除文件的状态.php将缓存所有文件属性信息,以提供更高的性能,但有时,多进程在对文件进行删除或者更新操作时,php没来得及更新缓存里的文件属性,容易导致访问到最后更新时间不是真实的数据。所以这里需要使用该函数对已保存的缓存进行清除。

方案三:对操作的文件进行随机读写,以降低并发的可能性。
在对用户访问日志进行记录时,这种方案似乎被采用的比较多。

需要定义一个随机空间,空间越大,并发的的可能性就越小,假设随机读写空间为[1-500],日志文件的分布就为log1~到log500不等。
每一次用户访问,都将数据随机写到log1~log500之间的任一文件。
在同一时刻,有2个进程进行记录日志,A进程可能是更新的log32文件,而B进程呢?则此时更新的可能就为log399.要知道,如果要让B进程也操作log32,概率基本上为1/500,差不多约等于零。

在需要对访问日志进行分析时,这里我们只需要先将这些日志合并,再进行分析即可。
使用这种方案来记录日志的一个好处时,进程操作排队的可能性比较小,可以使进程很迅速的完成每一次操作。

方案四:将所有要操作的进程放入一个队列中。然后专门放一个服务完成文件操作。
队列中的每一个排除的进程相当于第一个具体的操作,所以第一次我们的服务只需要从队列中取得相当于具体操作事项就可以了,如果这里还有大量的文件操作进程,没关系,排到我们的队列后面即可,只要愿意排,队列的多长都没关系。

针对以上四种方案的总结,如下:
1、需要排队(影响慢)比如方案一、二、四
2、不需要排队。(影响快)方案三
在设计缓存系统时,一般不会采用方案三。
因为方案三的分析程序和写入程序是不同步的,在写的时间,完全不考虑到时候分析的难度,只管写的行了。

如果在更新一个缓存时,如果也采用随机文件读写法,那么在读缓存时似乎会增加很多流程。

但采取方案一、二就完全不一样,虽然写的时间需要等待(当获取锁不成功时,会反复获取),但读文件是很方便的。
添加缓存的目的就是要减少数据读取瓶颈,从而提高系统性能。

大家在php中读写文件发生冲突时,适当的采取下变通方法,希望以上的文章对大家有所帮助。


    
最新技术文章:
▪PHP函数microtime()时间戳的定义与用法
▪PHP单一入口之apache配置内容
▪PHP数组排序方法总结(收藏)
▪php数组排序方法大全(脚本学堂整理奉献)
▪php数组排序的几个函数(附实例)
▪php二维数组排序(实例)
▪php根据键值对二维数组排序的小例子
▪php验证码(附截图)
▪php数组长度的获取方法(三个实例)
▪php获取数组长度的方法举例
▪判断php数组维度(php数组长度)的方法
▪php获取图片的exif信息的示例代码
▪PHP 数组key长度对性能的影响实例分析
▪php函数指定默认值的方法示例
▪php提交表单到当前页面、提交表单后页面重定...
▪php四舍五入的三种实现方法
▪php获得数组长度(元素个数)的方法
▪php日期函数的简单示例代码
▪php数学函数的简单示例代码
▪php字符串函数的简单示例代码
▪php文件下载代码(多浏览器兼容、支持中文文...
▪php实现文件下载、支持中文文件名的示例代码...
▪php文件下载(防止中文文件名乱码)的示例代码
▪解决PHP文件下载时中文文件名乱码的问题
▪php数组去重(一维、二维数组去重)的简单示例
▪php小数点后取两位的三种实现方法
▪php Redis 队列服务的简单示例
▪PHP导出excel时数字变为科学计数的解决方法
▪PHP数组根据值获取Key的简单示例
▪php数组去重的函数代码示例
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3