我正在對基於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