iteratorphp
⑴ python的用途和优点
用途:
1、主要是开发快,语言简洁,没那么多技巧,所以读起来很清楚容易。
5、像VS那样功能强的IDE,有要钱的PyCharm和不要钱的PyDev,PyDev有Eclipse的插件版本或者是Aptana Studio版本。
拓展资料:
应用:
1、web豆瓣,还有非常多的网页游戏的后端。我知道的都是作为后台服务,无论开发速度还是调试之类的都很好。前端的应用产品虽然python可以实现,但是在GUI方面的开发效率还是没有VS或者XCode快。
2、像VS那样功能强的IDE,有要钱的PyCharm和不要钱的PyDev。PyDev有Eclipse的插件版本或者是Aptana Studio版本
总结:
从个人感觉来说,微软件东西,非常好,省心,一流的技术理念,开发工具是全世界最好的(没有之一)。不过,因为它只限于微软的平台,所以范围上大大打了折扣。 世界上最流行的服务器还是unix和linux。而不是windows。桌面操作系统最流行的是windows。不过在所有的平台上都有C语言,大部分平台,甚至手机平台都有python语言和它的执行环境。这是其它的所有语言,包括java几乎都很难做到的。
⑵ php数组,有什么办法获取下一个元素的键值
方法一:用循环
function getNext(&$array, $curr_key)
{
$next = 0;
reset($array);
do
{
$tmp_key = key($array);
$res = next($array);
} while ( ($tmp_key != $curr_key) && $res );
if( $res )
{
$next = key($array);
}
return $next;
}
function getPrev(&$array, $curr_key)
{
end($array);
$prev = key($array);
do
{
$tmp_key = key($array);
$res = prev($array);
} while ( ($tmp_key != $curr_key) && $res );
if( $res )
{
$prev = key($array);
}
return $prev;
}
方法二:用Iterator,不过要先得到position
// 默认查找键为key元素的后一个元素
function get_element($key, $arr, $who='next')
{
//查找键为$key元素的位置
$offset = array_search($key, array_keys($arr));
if(FALSE == $offset || NULL == $offset) { return ;}
//查找哪个元素,前一个或后一个?
if ('prev' == $who) {
$arr = array_reverse($arr);
} else if ('next' == $who) {
} else {
throw new Exception("错误的参数");
}
对许多方法 都可以在后盾里面找到 而且很详细 很容易理解
⑶ php ob_start提高多少速度
由于PHP是“一边编译一边执行”的脚本语言,某种程度上也提供了一种相当方便的结果集缓存使用方法—通过动态include相应的数据定义代码段的方式使用缓存。
近来做了一阵子程序性能的优化工作,有个比较有意思的想法,想提出来和大家交流一下。
Cache是“以空间换时间”策略的典型应用模式,是提高系统性能的一种重要方法。缓存的使用在大访问量的情况下能够极大的减少对数据库操作的次数,明显降低系统负荷提高系统性能。相比页面的缓存,结果集是一种“原始数据”不包含格式信息,数据量相对较小,而且可以再进行格式化,所以显得相当灵活。由于PHP是“一边编译一边执行”的脚本语言,某种程度上也提供了一种相当方便的结果集缓存使用方法——通过动态include相应的数据定义代码段的方式使用缓存。如果在“RamDisk”上建缓存的话,效率应该还可以得到进一步的提升。以下是一小段示例代码,供参考。
// load data with cache
function
load_data($id,$cache_lifetime) {
// the return data
$data =
array();
// make cache filename
$cache_filename =
‘cache_‘.$id.‘.php‘;
// check cache file‘s last modify time
$cache_filetime = filemtime($cache_filename);
if (time() -
$cache_filetime <= $cache_lifetime) {
//** the cache is not expire
include($cache_filename);
} else {
//** the cache is
expired
// load data from database
// ...
while
($dbo->nextRecord()) {
// $data[] = ...
}
// format
the data as a php file
$data_cache = "
while (list($key, $val) =
each($data)) {
$data_cache .= "\$data[‘$key‘]=array(‘";
$data_cache .= "‘NAME‘=>\"".qoute($val[‘NAME‘])."\","
$data_cache .= "‘VALUE‘=>\"".qoute($val[‘VALUE‘])."\""
$data_cache .= ";);\r\n";
}
$data_cache = "?>\r\n";
// save the data to the cache file
if ($fd =
fopen($cache_filename,‘w+‘)) {
fputs($fd,$data_cache);
fclose($fd);
}
}
return $data;
}
?> 适用情况:
1.数据相对比较稳定,主要是读取操作。
2.文件操作要比数据库操作快。
3.复杂数据访问,大数据量访问,密集数据访问,系统数据库负载极重。
4.Web/DB分离结构或者多Web单DB结构。
未经证实的问题:
1.并发访问时对文件的读写是否会引起锁定问题。
2.涉及到的数据文件太多时,性能如何。
扩展思路:
1.生成JavaScript数据定义代码,在客户端调用。
2.还未想到……
望共同探讨。
缓存
如果你想要让自己庞大的PHP应用有更好的性能表现,采用缓存也是一种很好的方法。现在已经有许多缓存方案可供选择,其中包括:Zend
Cache,APC,和Afterburner Cache。
所有这些产品都属于“缓存模块”。当第一次出现对.php文件的请求时,它们会在Web服务器内存中保存PHP的中间代码,此后就用“经过编译”的版本响应后继的请求。这种方法确实能够改善应用的性能,因为它使得磁盘访问量减低到了最少的程度(代码已经读取和解析),代码直接在内存中运行使得服务器响应请求的速度大大提高。当然,缓存模块还会监视PHP源文件的变化,必要时重新缓存页面,从而防止了用户得到的页面仍旧由过时的PHP代码生成。由于缓存模块能够明显地降低服务器的负载、提高PHP应用的响应效率,因此它们非常适合于负载较大的网站使用。
如何选择这些缓存产品
Zend Cache是Zend Technologies公司的商业软件,而Zend
Technologies就是前面提到的那个为我们提供PHP引擎和免费Zend Optimizer的公司。Zend
Cache确实是名不虚传!对于大型的PHP页面,你可以感觉到第一次运行之后速度就会有所提高,而且服务器也会有更多的可用资源。遗憾的是这个产品并不免费,不过在有些情形下它仍旧是物超所值。
Afterburner Cache是来自Bware Technologies的免费缓存模块,当前这个产品还是Beta版。Afterburner
Cache的做法看起来与Zend Cache差不多,但它对性能的改善程度(还)不能与Zend Cache相比,而且它还不能与Zend
Optimizer一起工作。
APC是Alternative PHP Cache的缩写,它是来自Community
Connect的又一个免费缓存模块。这个产品已经具有足够的稳定性供正式场合使用,而且它看起来也能在很大程度上提高响应请求的速度。
有关压缩
来自Remote
Communications的免费Apache模块mod_gzip就具有为支持这类内容编码的浏览器压缩静态Web内容的能力。对于绝大多数静态Web内容,mod_gzip都非常有效。mod_gzip可以方便地编译到Apache里面,也可以作为DSO使用。据Remote
communications公司说,mod_gzip也能够压缩来自mod_php、mod_perl等的动态内容。我试了一次又一次,但看来还是不行。我看了许多关于mod_gzip的论坛和文章,看来到了mod_gzip的下一个版本(可能是1.3.14.6f)这个问题有望得到解决。在此之前,我们可以在网站的静态部分使用mod_gzip。
然而有时我们确实蹊要压缩动态内容,所以必须找找其他办法。有一种办法是使用class.gzip_encode.php,这是一个可以用来压缩页面内容的PHP类,具体方法是在PHP脚本的开头和末尾调用该类的某些函数。如果要在网站级实现这个方案,可以从php.ini文件的auto_prepend以及auto_append指令调用这些函数。这种方法虽然有效,但它无疑为高负载的网站带来了更多的开销。关于如何使用这个类的详细说明,请参见它的源代码。它的源代码说明相当完善,作者告诉了你所有你必须知道的事情。
PHP
4.0.4有一个新的输出缓存句柄ob_gzhandler,它与前面的类相似,但用法不同。使用ob_gzhandler时要在php.ini中加入的内容如下:
output_handler = ob_gzhandler
;
这行代码使得PHP激活输出缓存,并压缩它发送出去的所有内容。如果由于某种原因你不想在php.ini中加上这行代码,你还可以通过PHP源文件所在目录的.htaccess文件改变默认的服务器行为(不压缩),语法如下:
php_value
output_handler ob_gzhandler
或者是从PHP代码调用,如下所示:
ob_start("ob_gzhandler");
采用输出缓存句柄的方法确实非常有效,而且不会给服务器带来什么特殊的负荷。但必须注意的是,Netscape
Communicator对压缩图形的支持不佳,因此除非你能够保证所有用户都使用IE浏览器,否则你应该禁止压缩JPEG和GIF图形。一般地,对于所有其他文件,这种压缩都有效,但建议你针对各种浏览器都分别进行测试,特别是当你使用了特殊的插件或者数据查看器时这一点尤其重要。
阅读提示:PEAR 的缓冲包提供了缓冲动态内容,数据库查询和 PHP 函数调用的框架。本文介绍如何采用 PEAR 来缓冲 PHP 程序
采用 PEAR 来缓冲 PHP 程序
PHP 世界中缓冲是一个热门的话题,因为 PHP 产生的动态页面,每次用户请求都需要重新计算,不论请求的结果是否一样,同时,PHP
每次都会编译一次脚本。这样的超负荷运转对一个流量很高的网站来说肯定难以忍受。幸运的是, Web 的结果可以缓冲,而不需要重新运行和编译脚本,商品化的产品像
ZendCache 或者开源的 Alternate PHP Cache都提供了把 PHP 脚本编译为字节代码并缓冲的办法。
PEAR
的缓冲包提供了缓冲动态内容,数据库查询和 PHP 函数调用的框架。
就像 Perl 有 CPAN, TeX 有 CTAN,PHP
也有自己的中心资源库,存放类,库和模块。这个库称为 PEAR(PHP Extension and Add-On
Repository)。
本文假设你已经安装了 PEAR 环境,如果没有的话,可以去 PHP 网站下载。PEAR
的缓冲包包含一个总体的缓冲类和几个特别的子类。缓冲类使用容器类来存贮和管理缓冲数据。
下面是 PEAR
缓冲当前所包含的容器,以及各自的参数:
file -- file 容器在文件系统存储了缓冲的数据,是最快的容器。
cache_dir
-- 这是容器存储文件的目录。
filename_prefix -- 缓冲文件的前缀,例如:"cache_"。
shm -- shm
容器把缓冲数据放入共享内存,基准测试显示,目前的实现下,这个容器的速度要比文件容器慢。
shm_key --
共享内存使用的键值。
shm_perm -- 使用共享内存数据段的权限。
shm_size --
分配共享内存的大小。
sem_key -- 信号灯的键值。
sem_perm -- 信号灯的权限。
db --
PEAR 的数据库抽象层。
dsn -- 数据库连接的 DSN 。可以参考 PEAR 的 DB 文档。
cache_table --
表的名字。
phplib -- phplib
容器使用数据库抽象层存储缓冲。
db_class
db_file
db_path
local_file
local_path
ext/dbx
-- PHP
的数据库抽象层扩展,如果像把缓冲存入数据库,可以采用这个容器。
mole
host
db
username
password
cache_table
persistent
使用
PEAR Cache 所得到的性能提升取决于你所选择的缓冲容器,例如,把数据库的结果再次存入数据库缓冲中就显得毫无意义。
PEAR Cache
的函数缓冲模块能把任何函数或者方法的结果缓冲,不论是 PHP
的内置函数还是用户自定义函数,他缺省采用文件容器,把缓冲数据放入到一个叫做function_cache 的目录。
Cache_Function
类的构造器可以有三个可选的参数:
$container :缓冲容器的名字。
$container_options
:缓冲容器的数组参数。
$expires:缓冲对象过期的时间(秒数)。
普通的函数调用采用 Cache_Function 类的
call() 方法时,就能触发缓冲。调用 call()
很容易,的一个参数是函数的名字,然后是函数的参数,第二个参数是要调用函数中的第一个,依此类推,我们来看例子:
例1
缓冲函数和方法的调用
// 调用 PEAR Cache 的函数缓冲。
require_once
'Cache/Function.php';
// 定义一些类和函数。
class foo {
function
bar($test) {
echo
"foo::bar($test)
";
}
}
class bar {
function
foobar($object) {
echo
'$'.$object.'->foobar('.$object.')
';
}
}
$bar =
new bar;
function foobar() {
echo 'foobar()';
}
//
取得 Cache_Function 对象
$cache = new Cache_Function();
// 对 foo
类的静态函数 bar() 作缓冲(foo::bar())。
$cache->call('foo::bar',
'test');
// $bar->foobar()
$cache->call('bar->foobar',
'bar');
$cache->call('foobar');
?>
下面我们采用
Cache_Output 来把输出作缓冲:
例2 缓冲脚本的输出
// 加载 PEAR
Cache 的输出缓冲
require_once 'Cache/Output.php';
$cache = new
Cache_Output('file', array('cache_dir' => '.') );
//
计算要缓冲页面的标记,我们假定页面的缓冲取决于
// URL, HTTP GET 和 POST 变量以及
cookies。
$cache_id = $cache->generateID(
array('url' =>
$REQUEST_URI, '
post' => $HTTP_POST_VARS, 'cookies' =>
$HTTP_COOKIE_VARS) );
// 查询缓冲
if ($content =
$cache->start($cache_id)) {
// 缓冲命中
echo
$content;
die();
}
// 缓冲丢失
// -- 在这里插入内容产生代码
--
// 把页面存入缓冲
echo $cache->end();
?>
利用 Cache_Output 类,很容易把一个动态的数据库驱动的网站应用转化为静态,从而极大的提升站点的性能。越来越多的站点在采用 GZIP 压缩
HTML 内容,这样减少了服务器的带宽消耗,对于使用 Modem 上网的用户来说也能受益不少。
Cache_OutputCompression
扩展了 Cache_Output 类的功能,他把 GZIP 压缩的 HTML 内容进行缓冲,从而节省了 CPU 压缩的时间。
阅读提示:在本篇文章中,我们将对PHP应用程序的分析、如何改变脚本代码以及比较优化前后的各种参数值进行简要的介绍。
PHP应用程序的性能优化
使用PHP编程的最大好处是学习这种编程语言非常容易以及其丰富的库。即使对需要使用的函数不是十分了解,我们也能够猜测出如何完成一个特定的任务。
尽管PHP非常简单易学,但我们仍然需要花费一点时间来学习PHP的一些编程技巧,尤其是与性能和内存占用相关的技巧。在PHP中,有许多小技巧能够使我们减少内存的占用,并提高应用程序的性能。在本篇文章中,我们将对PHP应用程序的分析、如何改变脚本代码以及比较优化前后的各种参数值进行简要的介绍。
通过在程序中设置计时的程序,并反复执行这些代码,我们可以获得有关程序执行速度的一组数据,这些数据可以可以用来发现程序中的瓶颈,以及如何进行优化,提高应用程序的性能。
也许读者曾经听说过PEAR库吧。我们将使用PEAR库创建在分析时需要使用的例子,这也是对现有的代码进行分析的最简单的方法,它使我们无需使用商用产品就能对代码进行分析。
我们要使用的库的名字是PEAR::Benchmark,它对于对代码进行分析和性能测试非常有用。这个库提供一个名字为Benchmark_Timer()的类,能够记录一个函数调用和下一个函数调用之间的时间。在对代码的性能进行测试时,我们可以得到一个详细的脚本执行结果,它非常简单,如下所示:
include_once("Benchmark/Timer.php");
$bench
= new Benchmark_Timer;
$bench-> start();
$bench->
setMarker('Start of the script');
//
现在处于睡眠状态几分钟
sleep(5);
$bench-> stop();
//
从计时器中获得分析信息
print_r($bench->
getProfiling());
?>
上面代码执行后的输出如下所示:
Array
(
[0] => Array
(
[name] =>
Start
[time] => 1013214253.05751200
[diff] =>
-
[total] => 0
)
[1] =>
Array
(
[name] => Start of the script
[time] =>
1013214253.05761100
[diff] => 9.8943710327148E-05
[total]
=> 9.8943710327148E-05
)
[2] =>
Array
(
[name] => Stop
[time] =>
1013214258.04920700
[diff] => 4.9915959835052
[total] =>
4.9916949272156
)
)
上面的数字似乎是一组杂乱无章的数字,但如果程序的规模更大,这些数字就十分地有用了。
也许广大读者也能猜测到,数组的第一个表目是实际调用Benchmark_Timer()类的方法,例如
$bench->
start()、$bench-> setMarker()和$bench->
stop(),与这些表目有关的数字是相当简单的,现在我们来仔细地研究这些数字:
[0] => Array
(
[name] => Start
[time] => 1013214253.05751200
[diff] => -
[total] => 0
)
time表目指的是何时对Benchmark_Timer()的start()方法调用的UNIX的timestamp,diff表目表示这次调用和上次调用之间的时间间隔,由于这里没有上一次,因此显示出了一个破折号,total表目指的是自测试开始到这一特定的调用之前代码运行的总的时间。下面我们来看看下一个数组的输出:
[1]
=> Array
(
[name] => Start of the script
[time] => 1013214253.05761100
[diff] =>
9.8943710327148E-05
[total] => 9.8943710327148E-05
)
从上面的数字我们可以看出,在调用$bench->
start()之后,程序运行了9.8943710327148E-05秒(也就是0.0000989秒)后开始调用$bench->
setMarker(....)。
一次真实的性能测试经历
尽管上面的例子不错,但在对于决定如何优化你的站点代码设计方面,它真的不能算是一个好例子。下面我将用我自己作为网站技术人员的一段亲身经历来说明如何解决性能方面存在的问题。
我并不大理解网站使用的代码,因为它是根据特殊的需求,历经多年开发而成的━━其中的一个模块包括网站转换代码,另一个模块记录网站的使用情况,其他的模块也各有各的作用。我和网站的主要开发者都意识到网站的代码需要优化,但又不清楚问题出在哪儿。
为了尽快地完成任务,我开始研究网站的主要脚本代码,并在全部脚本代码以及其包含文件中添加了一些$bench->
setMarker()命令,然后分析$bench->
getProfiling()的输出,并对得到的结果大吃一惊,原来问题出在一个与获得特定语言名字(例如en代表english)的转换代码的函数调用中,该函数在每个页面上都会被使用数百次。每次调用该函数时,脚本代码都会对一个Mysql数据库进行查询,从一个数据库表中获得真正的语言名字。
于是我们这一类的信息创建了一个缓冲系统。经过短短2天时间的工作,我们使系统的性能得到了很大的提高,第一周内页面的浏览量也因此而增加了40%。当然了,这只是一个有关分析代码能够提高互联网应用或互联网网站性能的例子。
性能测试函数调用
在分析一个脚本或网页(以及其包含文件)时,尽管Benchmark_Timer()特别有用,但它并不科学,因为要获得分析的数据我们必须多次加载脚本,而且它也不是针对某个类或函数调用的。
PEAR::Benchmark库中的另一个被称作Benchmark_Iterator的类能够很好地解决这一个问题,它能够针对特定的函数或类的方法,显示其分析信息。它的用途是能够能够从测试中获得一致的结果,因为我们知道,如果运行一段脚本一次,其运行时间为10秒,并不意味着它每次的运行时间总是10秒。
In
any case, let's see some examples:
//
连接数据库的代码
include_once("DB.php");
$dsn = array(
'phptype'
=> 'mysql',
'hostspec' => 'localhost',
'database'
=> 'database_name',
'username' =>
'user_name',
'password' => 'password'
);
$dbh =
DB::connect($dsn);
function getCreatedDate($id)
{
global
$dbh;
> $stmt = "SELECT created_date FROM users WHERE
id=$id";
// 在这里使用PEAR::DB
$created_date = $dbh->
getOne($stmt);
if ((PEAR::isError($created_date)) ||
(empty($created_date))) {
return false;
} else
{
return $created_date;
}
}
include_once
'Benchmark/Iterate.php';
$bench = new Benchmark_Iterate;
//
运行getDate函数10次
$bench-> run(10, 'getCreatedDate', 1);
//
打印分析信息
print_r($bench-> get());
?> 运行上面的代码能够产生与下面相似的结果:
Array
(
[1] => 0.055413007736206
[2] =>
0.0012860298156738
[3] => 0.0010279417037964
[4] =>
0.00093603134155273
[5] => 0.00094103813171387
[6] =>
0.00092899799346924
[7] => 0.0010659694671631
[8] =>
0.00096404552459717
[9] => 0.0010690689086914
[10] =>
0.00093603134155273
[mean] => 0.0064568161964417
[iterations]
=> 10
)
上面的这些数字很好理解,mean条目表示getCreatedDate()函数10次运行的平均时间。在进行实际测试时,应该至少运行1000次,但这个例子得出的结果已经足够说明问题了。
⑷ PHP的SPL标准库的用法介绍
本文介绍下,php编程中SPL中的用法,SPL,PHP 标准库(Standard PHP Library) ,此从 PHP 5.0 起内置的组件和接口,有需要的朋友参考下。
PHP SPL的用法
SPL,PHP 标准库(Standard PHP Library) ,此从 PHP 5.0 起内置的组件和接口,并且从 PHP5.3 已逐渐的成熟。SPL 其实在所有的 PHP5 开发环境中被内置,同时无需任何设置。
似乎众多的 PHP 开发人员基本没有使用它,甚至闻所未闻。究其原因,可以追述到它那阳春白雪般的说明文档,使你忽略了“它的存在”。SPL 这块宝石犹如铁达尼的“海洋之心”般,被沉入海底。而现在它应该被我们捞起,并将它穿戴在应有的位置 ,而这也是这篇文章所要表述的观点。
SPL 提供了什么?
SPL 对 PHP 引擎进行了扩展,例如 ArrayAccess、Countable 和 SeekableIterator 等接口,它们用于以数组形式操作对象。同时,你还可以使用 RecursiveIterator、ArrayObejcts 等其他迭代器进行数据的迭代操作。
它还内置几个的对象例如 Exceptions、SplObserver、Spltorage 以及 splautoloadregister、splclasses、iteratorapply 等的帮助函数(helper functions),用于重载对应的功能。
这些工具聚合在一起就好比是把多功能的瑞士军刀,善用它们可以从质上提升 PHP 的代码效率。那么,如何发挥它的威力?
重载 autoloader
如果你是位“教科书式的程序员”,那么你保证了解如何使用 __autoload 去代替 includes/requires 操作惰性载入对应的类,对不?
但久之,你会发现你已经陷入了困境,首先是你要保证你的类文件必须在指定的文件路径中,例如在 Zend 框架中你必须使用“_”来分割类、方法名称(你如何解决这一问题?)。
另外的问题:
当项目变得越来越复杂, __autoload 内的逻辑也会变得相应的`复杂。到最后,甚至你会加入异常判断,以及将所有的载入类的逻辑如数写到其中。
大家都知道“鸡蛋不能放到一个篮子中”,利用 SPL 可以分离 __autoload 的载入逻辑。只需要写个你自己的 autoload 函数,然后利用 SPL 提供的函数重载它。
例如,上述 Zend 框架的问题,你可以重载 Zend loader 对应的方法,如果它没有找到对应的类,那么就使用先前定义的函数。
复制代码 代码示例:
<?php
class MyLoader {
public static function doAutoload($class) {
// 本模块对应的 autoload 操作
}
}
spl_autoload_register( array('MyLoader', 'doAutoload') );
?>
spl autoload register 还能以数组的形式加入多个载入逻辑。同时,你还可以利用spl autoload unregister 移除已经不再需要的载入逻辑,这功能总会用到的。
迭代器
迭代是常见设计模式之一,普遍应用于一组数据中的统一的遍历操作。可以毫不夸张的说,SPL 提供了所有你需要的对应数据类型的迭代器。
有个非常好的案例就是遍历目录。常规的做法就是使用 scandir ,然后跳过“.“ 和 “..”,以及其它未满足条件的文件。例如你需要遍历个某个目录抽取其中的图片文件,就需要判断是否是 jpg、gif 结尾。
使用 SPL 的迭代器执行上述递归寻找指定目录中的图片文件的例子:
复制代码 代码示例:
<?php
class RecursiveFileFilterIterator extends FilterIterator {
// 满足条件的扩展名
protected $ext = array('jpg','gif');
/**
* 提供 $path 并生成对应的目录迭代器
*/
public function __construct($path) {
parent::__construct(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)));
}
/**
* 检查文件扩展名是否满足条件
* // www.jbxue.com
*/
public function accept() {
$item = $this->getInnerIterator();
if ($item->isFile() &&
in_array(pathinfo($item->getFilename(), PATHINFO_EXTENSION), $this->ext)) {
return TRUE;
}
}
}
// 实例化
foreach (new RecursiveFileFilterIterator('/path/to/something') as $item) {
echo $item . PHP_EOL;
}
?>
⑸ 如何读取excel文件 php
主要有两个选择,第一个是PHPExcelReader,另外一个是PHPExcel。
PHPExcelReader比较轻量级,仅支持Excel的读取,实际上就是一个Reader。但是可惜的是不能链旦局够支持Excel 2007的格式(.xlsx)。
PHPExcel比较强大,能够将内存中的数据输出成Excel文件,同时还能够对Excel做各种操作,下面主要介绍下如何使用PHPExcel进行Excel 2007格式(.xlsx)文件的读取。
下载PHPExcel后保存到自己的类文件目录中,然后使用以下代码可以打开Excel 2007(xlsx)格式的文件:
require_once'/libs/PHPExcel-1.8.0/Classes/PHPExcel.php';//修改为自己的目录
echo'<p>TESTPHPExcel1.8.0:readxlsxfile</p>';
$objReader=PHPExcel_IOFactory::createReaderForFile($filename);
$objPHPExcel=$objReader->load($filename);
$objPHPExcel->setActiveSheetIndex(1);
$date=$objPHPExcel->getActiveSheet()->getCell('A16')->getValue();
输出$date变量就能够看到文件中的内容了。PHPExcel使用PHPExcel_IOFactory这个类来自动匹配所上传的文件类型,当然我们也可以自己制定要解析的文件类型。之后通过load方法,将PHP文件加载到objPHPExcel对象中。如果Excel文件有多个Sheet,可以通过setActiveSheetIndex来设置当前活动的Sheet。
需要注意的迟虚是,对于Excel中的日期格式,PHPExcel读出来的是不是日期类型,需要我们使用以下方法来进棚让行日期类型转换。
echodate("Y-m-dH:i:s",PHPExcel_Shared_Date::ExcelToPHP($date));
下面的代码显示了如何遍历显示Excel的内容:
<tableid="table_id">
<?php
$objWorksheet=$objPHPExcel->getActiveSheet();
$i=0;
foreach($objWorksheet->getRowIterator()as$row){
?>
<tr>
<?php
$cellIterator=$row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(false);
if($i==0){
echo'<thead>';
}
foreach($cellIteratoras$cell){
echo'<td>'.$cell->getValue().'</td>';
}
if($i==0){
echo'</thead>';
}
$i++;
?>
</tr>
<?php
}
?>
</table>
⑹ PHP列出目录中的目录和文件的几种方法
<?php
/**
*PHP中列出目录中的目录和文件的几种方法
*/
//兼容PHP4和PHP5的写法
functiongetFileList($directory){
$files=array();
if(is_dir($directory)){
if($dh=opendir($directory)){
while(($file=readdir($dh))!==false){
if($file!='.'&&$file!='..'){
$files[]=$file;
}
}
closedir($dh);
}
}
return$files;
}
//PHP5中的简单方法
functiongetFileList2($directory){
$files=array();
if(is_dir($directory)){
if($files=scandir($directory)){
$files=array_slice($files,2);
}
}
return$files;
}
//使用PHP5面向对象的写法
functiongetFileList3($directory){
$files=array();
try{
$dir=newDirectoryIterator($directory);
}catch(Exception$e){
thrownewException($directory.'isnotreadable');
}
foreach($diras$file){
if($file->isDot())continue;
$files[]=$file->getFileName();
}
return$files;
}
//测试代码
$dir=dirname(__FILE__);
var_mp(getFileList($dir));
?>
⑺ 如何遍历一个文件夹下的所有文件,并用md5函数算出所有文件的md5值(用php实现)
function file_read_all ($dir)
{
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
$n=0;
while (($file = readdir($dh)) !== false) {
if ( $file == '.' or $file =='..' or $file=='.svn')
{
continue;
}
echo md5_file($dir.$file);//计算每个文件md5值 echo '<br />';
if (is_dir ($dir.$file))
{
file_read_all ($dir.$file.'/');
}
}
}
closedir($dh);
}
}