2017-04-14 65 views
0

我遇到了我的共享主機提供商和我的128Mb內存限制問題。我將AJAX中的數據插入到一個PHP控制器中,該控制器獲取一個文件,解析AJAX中的新數據並用原始內容+新數據覆蓋該文件。我們正在處理一個JSON文件。PHP內存限制與激烈的json文件更新

在這一點上,主人已經把我所有的東西都絆倒了。 JSON的大小達到16Mb之前,廢話擊中風扇。如果我們有任何建議來更有效地整合數據,我將不勝感激。我現在將內存限制甩到-1 - 我很樂意避免這樣做!

這裏是我的代碼

<?php 

function appendCurrentFile($payload) { 

$_POST['payload'] = null; // CLEAR post payload 

ini_set("memory_limit",-1); // Fixes the problem the WRONG WAY 

$files = glob('/path/*'); // Get all json files in storage directory 

natsort($files); // Files to array 

$lastFile = array_pop($files); // Get last file (most recent JSON dump) 

$fileData = json_decode(file_get_contents($lastFile)); // Load file contents into it's own array 

$payload = json_decode($payload); // Take the POST payload from AJAX and parse into array 

$newArray = array_merge($fileData->cards, $payload); // Merge the data from our file and our payload 

$payload = null; // Clear payload variable 

$fileData->cards = $newArray; // Set the file object array as our new, merged array 

$newArray = null; // Clear our merged array 

file_put_contents($lastFile, json_encode($fileData, JSON_UNESCAPED_SLASHES)); // Overwrite latest file with existing data + new data. 

echo 'JSON updated! Memory Used: '.round((memory_get_peak_usage()/134217728 * 100), 0).'%'; // Report how badly we're abusing our memory 

} 
?> 
+0

https://stackoverflow.com/questions/4049428/processing-large-json-files-in-php –

+0

你抓住的最後一個文件,新數據添加到它,寫一個新的更大的文件,並重復廣告噁心?也許你的問題不是內存分配。 –

+0

請詳細說明。 –

回答

0

二手的fopen( 'file.json', 'A +'),以及一些字符串操作代替。減少內存負載。每次總計約1%,而不是每個輪詢(從允許的最大內存)增加1-3%的內存使用量。編輯:感謝您的迴應!

$files = glob('/path/*'); // Get all json files in storage directory 

natsort($files); // Files to array 

$lastFile = array_pop($files); // Get last file (most recent JSON dump) 

$file = fopen($lastFile, 'a+'); // Stream file with write access, put cursor at end 

fwrite($file, $payload); // Insert json chunk into end of file. 

fclose($file); // Close file 

echo 'JSON updated! Memory Used: '.round((memory_get_peak_usage()/134217728 * 100), 0).'%'; // Report how badly we're abusing our memory (Now only 1% of total memory each time instead of 1-3% incremented per poll.