Я знаю, что существует множество тем «PHP Fatal error: Недостаточно памяти».
До сих пор я перепробовал все, что нашел на них, но все равно получаю сообщение.
Моя настройка:
Windows Server 2008R2 Standard (64Bit; running on a VM)
6GB RAM
IIS 7.5
PHP 5.4
php.ini:
memory_limit = 4000M
.PHP-файл:
ini_set('memory_limit','4000M');
flush();
ob_flush();
Я выполняю запрос на сервере MSSQL, который возвращает мне очень большой набор данных. Вроде бы чуть больше 2Гб.
Что я вижу на сервере (диспетчер задач: память) при загрузке веб-страницы:
От + -2 ГБ он увеличивается до + -3,7 ГБ, а затем возвращается к + -2 ГБ.
РЕДАКТИРОВАТЬ:
На веб-странице нет результатов, и я получаю сообщение «Неустранимая ошибка PHP: недостаточно памяти (выделено 1836580864)» (попытка выделить 18350074 байта) в C: \ inetpub \ wwwroot \ ELogMonitor \ php \ helpers \ fncs.php on линия 76”Ошибка в PHP54_error.log.
Кстати: если я запускаю запрос в SQL Server Management Studio, никаких проблем не возникает.
Запрос (для тех, кто интересуется тем, что я делаю.):
$sql = "SELECT dbo.EntryTypes.EntryType
,dbo.Servers.SERVER
,dbo.LogNames.LogName
,dbo.Sources.Source
,dbo.EventIds.EventId
,dbo.Main.Time
,dbo.Main.Msg
FROM dbo.EntryTypes
INNER JOIN dbo.Main ON dbo.EntryTypes.pk_EntryType = dbo.Main.fk_EntryType
INNER JOIN dbo.EventIds ON dbo.EventIds.pk_EventId = dbo.Main.fk_EventId
INNER JOIN dbo.LogNames ON dbo.LogNames.pk_LogName = dbo.Main.fk_LogName
INNER JOIN dbo.Servers ON dbo.Servers.pk_Server = dbo.Main.fk_Server
INNER JOIN dbo.Sources ON dbo.Sources.pk_Source = dbo.Main.fk_Source
WHERE dbo.EntryTypes.EntryType = 'Error'
GROUP BY dbo.EntryTypes.EntryType
,dbo.LogNames.LogName
,dbo.Sources.Source
,dbo.EventIds.EventId
,dbo.Servers.SERVER
,dbo.Main.Msg
,dbo.Main.Time
ORDER BY dbo.EntryTypes.EntryType
,dbo.LogNames.LogName
,dbo.Sources.Source
,dbo.EventIds.EventId
,dbo.Servers.SERVER
,dbo.Main.Msg
,dbo.Main.Time";
Что я делаю с результатом:
function tableizeQryRes($arr) {
$isFirst=true;
$tbl = '<table>';
foreach ($arr as $key => $val) {
if ($isFirst) {
$tblHeader = '<tr><td></td>';
$tblBody = '<tr><td>'.$key.'</td>';
foreach ($val as $sub_key => $sub_val) {
$tblHeader .= '<td>'.$sub_key.'</td>';
$tblBody .= '<td>'.$sub_val.'</td>';
}
$tblHeader .= '</tr>';
$tblBody .= '</tr>';
$tbl .= $tblHeader;
$tbl .= $tblBody;
$isFirst=false;
} else {
$tbl .= '<tr><td>'.$key.'</td>';
foreach ($val as $sub_key => $sub_val) {
$tbl .= '<td>'.$sub_val.'</td>'; //(<-- line 76)
}
$tbl .= '</tr>';
}
}
$tbl .= '</table>';
echo '<div>';
echo $tbl;
echo '<br/>';
echo '<br/>';
echo '</div>';
}
?>
Просто из любопытства, какой тип запроса вы выполняете и почему доходность такая большая?
Если вы работаете с несколькими наборами результатов, почему бы вам не попытаться вызвать запрос по частям, ограничивая результаты. в основном, вынимая меньшие куски за раз.
Затем после каждого запроса делайте то, что нужно сделать, и очищайте данные с помощью:
промывать();
ob_flush ();
Но мне нужно знать, как ты это называешь и как ты на самом деле звонишь.
Страница, вызов веб-службы, консольное приложение
Других решений пока нет …