sql server — PHP фатальная ошибка: недостаточно памяти ?! (Sth. Отличается от других тем)

Я знаю, что существует множество тем «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>';
}
?>

0

Решение

Просто из любопытства, какой тип запроса вы выполняете и почему доходность такая большая?

Если вы работаете с несколькими наборами результатов, почему бы вам не попытаться вызвать запрос по частям, ограничивая результаты. в основном, вынимая меньшие куски за раз.

Затем после каждого запроса делайте то, что нужно сделать, и очищайте данные с помощью:
промывать();
ob_flush ();

Но мне нужно знать, как ты это называешь и как ты на самом деле звонишь.
Страница, вызов веб-службы, консольное приложение

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]