我正在对基于MS的Web应用程序进行一些整合,这迫使我通过SOAP将数据提取到我的PHP应用程序,这很好。在PHP foreach循环中需要更多速度
我在一个xml中获得了一个文件系统的结构,我将它转换为一个对象。所有文件都有一个ID和它的路径。为了能够将文档放在树视图中,我已经构建了一些方法来通过文件和文件夹结构计算文档的位置。这工作正常,直到我开始尝试使用大型文件列表。
我需要的是比foreach循环更快的方法(或做事情的方式)。
下面的方法是麻烦制造者。
/**
* Find parent id based on path
* @param array $documents
* @param string $parentPath
* @return int
*/
private function getParentId($documents, $parentPath) {
$parentId = 0;
foreach ($documents as $document) {
if ($parentPath == $document->ServerUrl) {
$parentId = $document->ID;
break;
}
}
return $parentId;
}
// With 20 documents nested in different folders this method renders in 0.00033712387084961
// With 9000 documents nested in different folders it takes 60 seconds
发送到对象的数组类似的数据阵列的这个
Array
(
[0] => testprojectDocumentLibraryObject Object
(
[ParentID] => 0
[Level] => 1
[ParentPath] => /Shared Documents
[ID] => 163
[GUID] => 505d70ea-51d7-4ef0-bf79-8e912553249e
[DocIcon] =>
[FileType] =>
[Title] => Folder1
[BaseName] => Folder1
[LinkFilename] => Folder1
[ContentType] => Folder
[FileSizeDisplay] =>
[_UIVersionString] => 1.0
[ServerUrl] => /Shared Documents/Folder1
[EncodedAbsUrl] => http://dev1.example.com/Shared%20Documents/Folder1
[Created] => 2011-10-08 20:57:47
[Modified] => 2011-10-08 20:57:47
[ModifiedBy] =>
[CreatedBy] =>
[_ModerationStatus] => 0
[WorkflowVersion] => 1
)
...
大一点的例子可以在这里找到 http://www.trikks.com/files/testprojectDocumentLibraryObject.txt
感谢您的帮助!
=== UPDATE ===
为了说明不同的东西需要我增加了这部分的时间。
- 包在8.5031080245972秒下载
- 包在1.2838368415833秒
- 包在0.051079988479614秒解压在3.8216209411621秒组织
- 列表数据
- 标准特性填补了0.46236896514893秒
- 定制解码物业填写40.856066942215秒
- 总计:本页面创建时间55.231353998184秒!
现在,这是一个自定义属性操作,即时消息描述,其他的东西已经有所优化。从WCF服务发送的数据是压缩和编码比例10:1(如10mb未压缩:1mb压缩)。
当前的优先事项是优化自定义属性部分,其中getParentId方法占用99%的执行时间!
需要更快的速度?要么得到更好的硬件,要么切换到更快的语言。考虑到PHP是[最慢的语言之一](http://shootout.alioth.debian.org/u32/which-programming-languages-are-fastest.php),这不应该是一项艰巨的任务。 – NullUserException
好吧,我同意你的意见。但在这种情况下,我没有选择。具有相同规格的服务器上的C#中的“相同”方法在不到2秒的时间内运行相同的数据。 –
听起来不太可能。 PHP循环并不是很快,但是你的做法并不多。 SOAP解包和对象树生成的可能性比较慢。 - 如果你多次运行你的函数,并且忘记在你的问题中提及关键细节,建议单独构建一个单独的 - > ServerURL到 - > ID数组映射*,然后用它来代替。 – mario