发布网友 发布时间:2024-09-26 02:00
共1个回答
热心网友 时间:2024-10-04 04:06
php文件处理假设你的数据文件为1,下面的代码测试通过:
?php
??$arr=array();
??foreach?(file('1')?as?$line){
????if?(preg_match('|^M26.*(TS\d+)|',$line,$r))?$arr[$r[1]]++;
??}
??print_r($arr);
?
运行结果为:
Array
(
?[TS716]=1
?[TS722]=2
?[TS717]=1
)
表示M26开头的行中,TS716、TS722、TS717的个数分别是1、2、1
Apache需要将php文件交给PHP解释器处理后再返回给浏览器,那PHP如何运行的呢?1.我们从未手动开启过PHP的相关进程,它是随着Apache的启动而运行的;
2.PHP通过mod_php5.so模块和Apache相连(具体说来是SAPI,即服务器应用程序编程接口);
3.PHP总共有三个模块:内核、Zend引擎、以及扩展层;
4.PHP内核用来处理请求、文件流、错误处理等相关操作;
5.Zend引擎(ZE)用以将源文件转换成机器语言,然后在虚拟机上运行它;
6.扩展层是一组函数、类库和流,PHP使用它们来执行一些特定的操作。比如,我们需要mysql扩展来连接MySQL数据库;
7.当ZE执行程序时可能会需要连接若干扩展,这时ZE将控制权交给扩展,等处理完特定任务后再返还;
8.最后,ZE将程序运行结果返回给PHP内核,它再将结果传送给SAPI层,最终输出到浏览器上。
php处理大文件文件
我前几天有一个面试,面试题就是有这样一道题。先把自己的思路说一下,因为信息量非常的大,所以我采用了分表,分成24张表,每个小时一张,虽然凌晨时刻的表可能很少数据,但这样sum字段的问题就容易解决了,我理解的sum字段是一个小时同一个用户在相同的环境的登陆次数。这样理解不知对否,请网友自行甄辨。然后我通过PHP中的fgets函数一行一行的数据取出,入表。实验了几万条数据是没有问题的,但是上亿条数据可能够呛。这一点也请网友注意,我也是新手。只是看到这里没有答案,给大家一个参考。废话不多,看流程:
日志文件(access.log)格式:
200?/alipeng.gif?zoneid=2bannerid=44clentid=6materialid=64redirect=http%3a%2f%2f;time=1384444800.832ip=127.0.0.1user_agent=Mozilla/5.0?(X11;?Linux?x86_64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/31.0.1650.48?Safari/537.36utrace=a6dbdd2f6a37b946165b7ae98dcd4f79
502?/alipeng.gif?zoneid=2bannerid=44clentid=6materialid=64redirect=http%3a%2f%2f;time=1384444800.904ip=127.0.0.1user_agent=Mozilla/5.0?(X11;?Linux?x86_64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/31.0.1650.48?Safari/537.36utrace=a6dbdd2f6a37b946165b7ae98dcd4f79
配置文件cfg.php:
????define(HOST,'localhost');//主机名
????define(USER,'root');//数据库账号
????define(PASS,'111111');//数据库密码
????define(DBNAME,'test');//所用的数据库
????define(CHARSET,'utf8');//使用的字符集
具体代码test.php:
?php
header("content-type:text/html;charset=utf-8");
require?'./cfg.php';
????$link?=?mysql_connect(HOST,USER,PASS)?or?die('连接数据库失败');
//程序中自动建库和建表,这样一定程度上拖慢了程序的速度
//创建数据库
$crdb="create?database?if?not?exists?".DBNAME;
if(!mysql_query($crdb)){
die('创建数据库失败');
}
//链接数据库
????mysql_select_db(DBNAME)?or?die('选择数据库失败');
????mysql_set_charset(CHARSET);
//因为数据量很大我将数据按小时分表,分成24个表,每小时一个表,这样num字段的值也好做统计
//数据循环建表
for($i=0;$i24;$i++){
if($i10){
$tbhz='0'.$i;//如果前10张表,表后缀应该是00-09
}else{
$tbhz=$i;
}
$ctbsql="create?table?if?not?exists?logininfo_{$tbhz}(
id?int?not?null?auto_increment?primary?key,
zoneid?int?not?null?default?0,
bannerid?int?not?null?default?0,
clentid?int?not?null?default?0,
materialid?int?not?null?default?0,
redirect?char(200)?not?null?default?'',
time?char(16)?not?null?default?'',
user_agent?char(200)?not?null?default?'',
utrace?char(32)?not?null?default?'',
sum?int?not?null?default?0
)TYPE=MyISAM?DEFAULT?CHARACTER?SET?utf8?COLLATE?utf8_general_ci";
mysql_query($ctbsql);
}
//打开文件
$file=fopen("./access.log",'r')?or?die("打开文件失败");
//对文件内容进行循环,直到文件末尾才停止
while?(!feof($file)){
//每次读取一行
$line?=?fgets($file,1024);
//状态是200的进行写入数据库操作
if(preg_match('/^200/',$line)){
$pinfo=parse_url($line);//url信息
$ext=$pinfo['query'];//取得传递的各个参数
$parray=explode('',$ext);//根据分解为数组
//因为分解为数组后并不是要的值,所以要对值进行一次截取,将等号及等号左边的都去掉
foreach($parray?as?$val){
$narray[]=ltrim(strstr($val,'='),'=');
}
$narray[8]=rtrim($narray[8],'_');
//截取时间的秒数
$getmun=substr($parray[5],5,10);
$time=date('Y-m-d?H',$getmun);//将秒数转化为时间类型。
//得到表后缀
$tbhz=date('H',$getmun);
$sql="insert?into?logininfo_{$tbhz}?values(null,'{$narray[0]}','{$narray[1]}','{$narray[2]}','{$narray[3]}','{$narray[4]}','{$time}','{$narray[7]}','{$narray[8]}',0)";
//echo?$sql;
$res=mysql_query($sql);//执行插入
if(!$res?||?!mysql_affected_rows()0){
die('写入数据库失败');
}
unset($narray);//循环一次将narray销毁,为下一次循环做准备
//var_dump(parse_url($line)['query']);
}
}
fclose($file);//关闭
//因为sum字段还是0,下面代码段需要处理sum字段的值
//24张表循环处理
for($i=0;$i24;$i++){
if($i10){
$tbhz='0'.$i;//如果前10张表,表后缀应该是00-09
}else{
$tbhz=$i;
}
//该sql语句是把同一个小时内,并且符合条件相等的登陆的总次数和需要的登陆信息查出,为下面修改sum做准备
$sql="SELECT?COUNT('zoneid')?AS?sum,zoneid,bannerid,clentid,materialid,redirect,user_agent,utrace?FROM?logininfo_{$tbhz}?GROUP?BY?zoneid,bannerid,clentid,materialid,redirect,user_agent,utrace";
//发送查询sql
$res=mysql_query($sql);
if($res??mysql_num_rows($res)0){
while($row=mysql_fetch_assoc($res)){
//修改sum字段,即同一小时内的登陆次数
$upsql="update?logininfo_{$tbhz}?set?sum='{$row['sum']}'?where?zoneid='{$row['zoneid']}'?and?bannerid='{$row['bannerid']}'?and?clentid='{$row['clentid']}'?and?materialid='{$row['materialid']}'?and?redirect='{$row['redirect']}'?and?user_agent='{$row['user_agent']}'?and?utrace='{$row['utrace']}'";
//发送修改sql,执行修改sum
$upres=mysql_query($upsql);
if(!$upres){
die('修改登陆sum失败');
}
}
}
}
echo?'数据成功入表';
使用说明:
将配置文件cfg.php中的连接数据库账号、密码修改为自己本机的(默认新增的库名是test)
直接运行test1.php
PHP关于文件处理的问题我把代码复制下来,新建a.html,复制代码。然后在同一目录下,新建tm.txt,输入:asdsadas保存。然后访问,得出一个表格:
使用readfile()函数读取文件内容:asdsadas
使用file()函数读取文件内容:asdsadas
使用file_get_contents()函数读取文件内容:asdsadas
这代码没问题,你把tm.txt和你的网页放到同一个目录。
关于PHP文件处理的问题?php
/*
?*?文件夹复制
?*?$fromFile??要复制谁
?*?$toFile????复制到那
?*/
copyFile('./',?'../1');
function?copyFile($fromFile,?$toFile){
creatdir($toFile);
$folder1?=?opendir($fromFile);
while($f1?=?readdir($folder1)){
if($f1!="."??$f1!=".."){
$path2?=?"$fromFile/$f1";
if(is_file($path2)){
$file?=?$path2;
$newfile?=?"$toFile/$f1";
if(file_exists($newfile)){
//重命名
$newfile?=?preg_replace('/(\.\w+$)/i',?'_Rename$1',?$newfile);
}
copy($file,?$newfile);
echo?"$file?=?$newfilebr?/\n";
}elseif(is_dir($path2)){
$toFiles?=?"$toFile/$f1";
copyFile($path2,?$toFiles);
}
}
}
}
//递归创建文件夹
function?creatdir($path){
if(!is_dir($path)){
if(creatdir(dirname($path))){
mkdir($path,0777);
return?true;
}
}else{
return?true;
}
}