使用fopen与SplFileObjectPHP 相反的优缺点是什么?
从我看到的,SplFileObject在适用的情况下抛出异常,这使得在使用try...catch错误处理时更方便.除此之外,还有其他理由推荐一个吗?
(额外奖励:它为什么被称为SplFileObject?代表什么Spl?为什么不简单FileObject?)
更新:它的一个限制SplFileObject是它(还)没有close成员函数.在某些情况下,这可能是一个问题(例如:Unlink和SplFileObject).
我想知道是否有人知道如何在PHP中完成这项工作.我正在运行一个脚本,涉及打开一个文件,占用前1000行,用这些行做一些东西,然后php文件打开另一个自己的实例来接下一千行,依此类推,直到它到达文件的末尾.我正在使用splfileobject,以便我可以寻找某条线,这使我可以很好地将其分解为1000行块.我遇到的最大问题是性能问题.我正在处理拥有超过10,000,000行的文件,虽然它在前10,000行左右的速度非常快,但在此之后有一个巨大的指数减速,我认为只需要寻求这一点.
我想要做的是读取前几千行,然后从文件中删除它们,以便我的脚本始终读取前几千行.有没有办法在不将文件的其余部分读入内存的情况下执行此操作.我见过的其他解决方案涉及将每一行读入一个数组,然后摆脱前X个条目,但有一千万行会耗费太多的内存和时间.
如果有人有解决方案或其他建议可以加快性能,那将非常感激.
是否可以从SplFileObject取消链接文件?
我没有看到关闭底层资源的方法,并且文件句柄是私有的,因此无法在考虑该目标的情况下扩展SplFileObject.
有没有解决方法?
我正在调用一个期望文件的流资源的方法,如下所示:
$obj->method(fopen($splFileInfo, 'r+'));
Run Code Online (Sandbox Code Playgroud)
该$splFileInfo对象是一个实例SplFileInfo.
有没有办法获取$splFileInfo对象的流资源而无需调用fopen?
在提出这个问题之前,我已经阅读了文档并广泛搜索了这个网站.
$file = new SplFileObject("/var/www/qacentre/compliance/compliance.csv");
$file->setFlags(SplFileObject::READ_CSV);
foreach ($file as $row) {
}
Run Code Online (Sandbox Code Playgroud)
示例CSV行;
"ABEL, TAMMY 454454","End of: ABEL, TAMMY 454454",QP544454,28/10/2012 11:41,"0811 unlawfully use, possess","STEPHENS, JEREMY 54544454",LINK OPERATIONS,Located details incorrect,Entity: FORD FALCON Reg #: Colour: White
我已经回显了输出,看起来它没有识别机箱字符(").我试图使用SetCSVControl虽然我使用的是默认机箱.我也试过逃避机箱字符SetCSVControl(因为我无法控制CSV文件我正在导出).
例如,当我打印第一列的结果时,我应该收到(ABEL,TAMMY 454454)("ABEL").
我读过这可能是我的语言环境设置的问题(en-GB,en-US; q = 0.8,en; q = 0.6)?
任何帮助都会很棒.
当读取 csv 文件中的特定行时,我尝试使用SplFileObject::fseekwith fgetcsv。
要读取第 2 行(例如),我执行 afseek(1)并使用 读取fgetcsv,这给出了第 2 行。
当我执行 afseek(0)并使用 读取时fgetcsv,我得到了第 0 行。
所以以这种方式读取第 1 行存在一个问题。(我知道我可以连续阅读两行,但我认为这不太好)。
我发现这个问题在 2008 年 PHP 版本 5.2.6 中报告:SplFileObject: fgetcsv aftereek returns error line。
我使用的是 PHP 版本 5.4.19。
有人有这方面的信息吗?这是故意的吗?
我使用laravel 4(最新更新),我创建了一个可以上传图像(徽标/头像)的表单。我在MAC OS上,我使用sublime Text 3,laravel和MAMP Applications。我所有的配置都正确,没有运行问题。
我的问题是,当我从表单提交到达字段时遇到此错误:RuntimeException SplFileInfo :: getSize():/ Applications / MAMP / tmp / php / phpRUJfMX的统计信息失败
这是我的表单nameOfTheForm.blade.php中的代码:
@extends('layout.default')
@section('title')
Name Of My Project - EditProfile
@stop
@section('content')
{{Form::open(array('url'=>'uploadAvatar','files' => true))}}
<p>
{{Form::label('pseudo','pseudo (*): ')}}
{{Form::text('pseudo',Input::old('nom'))}}
</p>
@if ($errors->has('pseudo'))
<p class='error'> {{ $errors->first('pseudo')}}</p>
@endif
<br>
<br>
<p>
{{Form::label('url_Avatar','Avatar: ')}}
{{Form::file('url_Avatar',Input::old('Url_Avatar'))}}
</p>
@if ($errors->has('url_Avatar'))
<p class='error'> {{ $errors->first('url_Avatar')}}</p>
@endif
<br> …Run Code Online (Sandbox Code Playgroud) 我有两行的数据文件(两行仅用于我的示例,实际上,该文件可以包含数百万行)并且我使用带有偏移量的 SplFileObject 和 LimitIterator。但是这种组合在某些情况下有奇怪的行为:
$offset = 0;
$file = new \SplFileObject($filePath);
$fileIterator = new \LimitIterator($file, $offset, 100);
foreach ($fileIterator as $key => $line) {
echo $key;
}
Run Code Online (Sandbox Code Playgroud)
输出为:01
但是将$offset设置为1,输出为空(foreach 不迭代任何行)。
我的数据文件包含这个:
{"generatedAt":1434665322,"numRecords":"1}
{"id":"215255","code":"NB000110"}
Run Code Online (Sandbox Code Playgroud)
我做错了什么?
谢谢
我使用SplFileObject和LimitIterator来读取大文件中从位置 x 到 y 的内容。
当使用像/home/devel/stuff/myfile.log.
当使用这样的路径时,http://mydomain.com:8090/devel/stuff/myfile.log它不起作用。不过路径是正确的。
使用绝对路径时会失败吗?
错误消息是:
PHP Warning: SplFileObject::rewind() [<a href='splfileobject.rewind'>splfileobject.rewind</a>]: stream does not support seeking in ...
PHP Fatal error: Uncaught exception 'RuntimeException' with message 'Cannot rewind file ...'
完整代码:
// $pStrFile contains the valid (yes!) path
$oFile = new SplFileObject($pStrFile);
// $nFrom = 80 and $nLines = 30
$fileIterator = new LimitIterator($oFile, $nFrom, $nLines);
foreach($fileIterator as $line) {
$strLines .= $line;
}
Run Code Online (Sandbox Code Playgroud) php ×9
spl ×4
csv ×1
fgetcsv ×1
fgets ×1
file ×1
file-io ×1
file-upload ×1
fopen ×1
fseek ×1
laravel-4 ×1
large-files ×1
offset ×1
performance ×1
unlink ×1