当前位置: 首页 > 知识库问答 >
问题:

为什么和如何是我的PHP内存正在耗尽?[重复]

戴建义
2023-03-14

我得到了错误

PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 33292313 bytes)

当我运行分页功能时,我不知道发生了什么和/或为什么会出错。

从我在这里看到的其他问题来看,大多数人建议我更改php.ini文件中的内存限制。但是,我想知道为什么会发生此错误,以及我可以做些什么来防止将来发生此错误。

从这个问题中可以看出“致命错误:允许的内存大小x字节已用尽(试图分配y字节)”的含义?我可以看到php脚本已经超过了分配的内存限制(duh!),但它并没有真正的帮助。

问题:

  • php不就是一种与数据库交互的语言吗?那么为什么它需要内存来运行呢?
  • 什么原因导致错误?(我知道没有足够的内存,但为什么有这么多内存用完了)
  • 我能做些什么来防止它再次发生

我的分页功能:

function Pagination( $connection, $num, $page, $view  ) {

    $view=$view;

    //Results per page
    $pagerows=10;

    //Tells us the last page number
    $last=ceil( $num/$pagerows );

    // Establish the $PaginationNav variable(used to navigate the paginated results)
    $PaginationNav = '';

    //Check how many pages of results there are
    //If there is more than 1 page
    if( $last != 1 ) {

        //Check if we are on page 1, if so we don't need the 'previous' link
        //We are on page one
        if( $page == 1 ) {

            //Adds the current page
            $PaginationNav .= $page;

            //Adds the next 3 pages to the pagination
            for( $i=$page+1;$i<$last;$i++ ) {
                $PaginationNav .= "<a class='Pagination' href=\"$_SERVER[PHP_SELF]?view=$view&page=$i\">$i</a>";
                if( $i > $page+4 ) {
                    break;
                }
            }

            $PaginationNav .= "...";

            //Adds the last page to the pagination
            $PaginationNav .= "<a class='Pagination' href=\"$_SERVER[PHP_SELF]?view=$view&page=$last\">$last</a>";

            //Adds the next page button
            $next=$page + 1;

            $PaginationNav .= "<a class='Pagination' href=\"$_SERVER[PHP_SELF]?view=$view&page=$next\">Next </a> ";
        } else {
            //we are not on page 1

            //Adds the previous button to pagination
            $previous=$page - 1;

            $PaginationNav .= "<a class='Pagination' href=\"$_SERVER[PHP_SELF]?view=$view&page=$previous\">Previous</a>";

            //Adds the current page
            $PaginationNav .=$page;

            //Adds the left navigations
            for( $i = $page-4;$i=$page;$i++ ) {
                if( $i>0 ) {
                    $PaginationNav .= "<a class='Pagination' href=\"$_SERVER[PHP_SELF]?view=$view&page=$i\">$i</a>";
                }
            }

            //Adds the right navigations
            for( $i=$page;$i<$last;$i++ ) {
                $PaginationNav .= "<a class='Pagination' href=\"$_SERVER[PHP_SELF]?view=$view&page=$i\">$i</a>";
                if( $i > $page+4 ) {
                    break;
                }
            }

            //Adds the last page to the pagination
            $PaginationNav .= "<a class='Pagination' href=\"$_SERVER[PHP_SELF]?view=$view&page=$last\">... $last</a>";

            //Adds the next page button
            $next=$page + 1;

            $PaginationNav .= "<a class='Pagination' href=\"$_SERVER[PHP_SELF]?view=$view&page=$next\">Next </a> ";
        }
    }

    //There is only one page
    if( $last == 1 ) {
        $PaginationNav .= $page;
    }

    return $PaginationNav;
}

我看到的一个问题中有一条评论指出,仅仅增加内存限制并不能替代好的编码。我同意,我想把代码修改得更好,而不是简单地增加内存。

另外,我在编程方面没有受过正式的培训,我只是通过投身于编码来学习,所以如果答案很明显,我很抱歉。

共有2个答案

符学
2023-03-14

正如galchen所发现的,对于循环终止符,您有一个不正确的,导致无限循环,最终由于内存不足而中断。增加内存限制并不能解决此问题。

我想提供我对分页功能的重写。我还没有测试过它,但我相信它会产生更一致的结果。

function Pagination($connection,$num,$page,$view,$pagerows=10) {
    //Tells us the last page number
    $last = ceil($num/$pagerows);
    if( $last == 1) return $page;

    // Establish the $PaginationNav variable(used to navigate the paginated results)
    $PaginationNav = '';

    // Helper function to reduce repeated code - great if you want to change the link!
    $addpage = function($p,$custom="") use (&$PaginationNav) {
        $PaginationNav .= "<a class='Pagination' href='".$_SERVER['PHP_SELF']."?view=".$view."&page=".$i.">".($custom ? $custom : $i)."</a>";
    };

    //Check if we are on page 1, if so we don't need the 'previous' link
    if( $page != 1) {
        //Adds the previous button to pagination
        $addpage($page-1,"Previous");
    }
    if( $page > 4) {
        //Adds the first page to the pagination
        $addpage(1);
        $PaginationNav .= "...";
    }
    //Adds the left navigations
    for($i = max(1,$page-4); $i < $page; $i++) {
        $addpage($i);
    }
    //Adds the current page
    $PaginationNav .= $page;
    //Adds the right navigations
    for($i=$page; $i<$last && $i < $page+4; $i++) {
        $addpage($i);
    }
    if( $page < $last-4) {
        $PaginationNav .= "...";
        //Adds the last page to the pagination
        $addpage($last);
    }
    if( $page != $last) {
        //Adds the next page button
        $addpage($page+1,"Next");
    }
    return $PaginationNav;
}

熊嘉茂
2023-03-14

你有:

 for($i = $page-4;$i=$page;$i++)   // change to ==
 {
     if($i>0)
     {
         $PaginationNav .= "<a class='Pagination' href=\"$_SERVER[PHP_SELF]?view=$view&page=$i\">$i</a>";
     }
 }

$i=$page中,您将$page分配给$i,并且它每次都会返回$page(可能是正数),这将导致true条件。改成==

 类似资料:
  • 问题内容: 致命错误:在第269行的D:\ xampplite \ htdocs \ Scraper \ PHPExcel \ Reader \ Excel2007.php中,耗尽了134217728字节的内存大小(尝试分配1078799字节) 即使我仅尝试使用PHPExcel打开〜350 KB的小型excel文件,我的128M PHP内存限制也很快耗尽了。 虽然,我可以增加配置中的内存限制,但是

  • 我编写的java应用程序遇到了一个问题,导致硬件性能问题。问题(我很确定)是,我运行应用程序的一些机器只有1GB的内存。当我启动java应用程序时,我将堆大小设置为-xms512m-xmx1024m。 我的第一个问题是,我的假设是否正确,因为我将机器的所有内存分配给java堆,这显然会导致性能问题?

  • 我正在尝试运行artisan make:controller。 我有一个问题: 我试图增加

  • 我有以下代码: 不同的文件: 由于我编写了Mail()函数,因此出现以下错误: 致命错误:允许的内存大小134217728字节已用尽(尝试分配65488字节)

  • 本文向大家介绍浅谈内存耗尽后Redis会发生什么,包括了浅谈内存耗尽后Redis会发生什么的使用技巧和注意事项,需要的朋友参考一下 前言 作为一台服务器来说,内存并不是无限的,所以总会存在内存耗尽的情况,那么当 Redis 服务器的内存耗尽后,如果继续执行请求命令,Redis 会如何处理呢? 内存回收 使用Redis 服务时,很多情况下某些键值对只会在特定的时间内有效,为了防止这种类型的数据一直占

  • 我有一个网页,可以将图像上传到我的API Laravel项目。它一直工作到我上传大小巨大或等于2mb的图像,并在nginx 500错误中运行: 我在stack overflow和google上读到了大量相同的问题,但似乎没有任何效果。 仔细阅读错误消息,我可以理解,从我的PHP配置,该网站可以采取134217728字节的内存,但它无法尝试分配73728字节:它有任何意义吗?它只在允许的最大128m