我有一個多次調用jQuery.load('test.php')
的HTML頁面。 test.php的輸出是「256kB」,如下所示,64個請求x 256kb應該需要16MB。然而,cPanel的資源使用情況表明,64個請求的單個運行實際上具有154MB的成本(或每個請求2.4 MB)。多週期違反我的共享主機1GB的虛擬內存限制而導致錯誤:對PHP腳本的多個jQuery.load()調用導致「無法分配內存:無法創建子進程」錯誤
(12)Cannot allocate memory: couldn't create child process: /opt/suphp/sbin/suphp
因爲這不符合靜態文件我懷疑PHP具有一些開銷出現,但多少?爲什麼當腳本結束時虛擬內存不能立即回收?我試過'死'和'退出()'沒有效果。有沒有辦法強制PHP(v5.2.17)垃圾收集?
的test.html:
<table>
<tr>
<td id="column_1"></td>
<td id="column_2"></td>
<td id="column_3"></td>
<td id="column_4"></td>
</tr>
</table>
<script>
function loadPage() {
$('<div>').load('/test.php', function (response) {
$('#column_1').append(response);
});
$('<div>').load('/test.php', function (response) {
$('#column_2').append(response);
});
$('<div>').load('/test.php', function (response) {
$('#column_3').append(response);
});
$('<div>').load('/test.php', function (response) {
$('#column_4').append(response);
});
}
$(document).ready(function() {
for (var j = 0; j < 16; j++) {
loadPage();
}
});
</script>
test.php的:
echo memory_get_peak_usage(true)/1024 . 'kB';
(注:我真的不運行jQuery.load()64次,但原始的錯誤導致這個問題的是大約12個請求,每個請求佔用5MB的空間,我曾經想過一種更好的方式,它需要更少的請求,但是希望確保這個錯誤不會在生產中重複出現,當應用程序失敗時我期望收到多個同時請求)
謝謝您的建議。如何知道suphp實例是否是動態鏈接的,請記住這是一個合理限制的共享主機帳戶? – AJR
它很可能是動態鏈接的。但是如果你可以執行'ldd'命令,或者''file'',你可以肯定知道。嘗試使用包含'<?php系統(「ldd/opt/suphp/sbin/suphp 2> &1");?>'看看會發生什麼。 – LSerni
我還沒有完全解決這個問題,因爲在短時間內64個PHP調用仍然會觸發可用的虛擬內存,但我認爲我無法在共享主機上做很多事情。 Iserni的答案被接受了,因爲它給了我很多選擇來緩解原始問題(而JSON的東西非常酷)。 – AJR