Ankündigung

Einklappen
Keine Ankündigung bisher.

Script verwendet mehr Speicher als durch memory_limit erlaubt

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Script verwendet mehr Speicher als durch memory_limit erlaubt

    PHP-Code:
    <?php
    error_reporting
    (E_ALL);
    ini_set("display_errors"1);

    echo 
    "memory_limit: "ini_get("memory_limit"), "<br>";
    echo 
    "Mem: "round(memory_get_usage()/1024/10242), "MB<br>";

    $array = [];
    for (
    $i 0$i 1024 70$i++) {
            
    $array[] = str_repeat(chr(rand(6565+26)), 1024);
    }

    echo 
    "Mem: "round(memory_get_usage()/1024/10242), "MB<br>";
    unset(
    $array);
    echo 
    "Mem: "round(memory_get_usage()/1024/10242), "MB<br>";
    Output:
    Code:
    memory_limit: 64M
    Mem: 0.33MB
    Mem: 91.84MB
    Mem: 0.33MB

    Läuft auf Ubuntu Server 16.04
    PHP 7.0.8 auf mit mod_php in Apache 2.4.18

    Unter PHP 5.5.9 seh ich das Verhalten nicht.

    Jemand eine Idee, wie das sein kann?

    Grüße.

  • #2
    Immer auch mal auf bugs testen, das kann man selber tun mit google.
    Ist in nachfolgenden Versionen behoben.
    http://php.net/ChangeLog-7.php

    Kommentar


    • #3
      Das hab ich natürlich schon gemacht aber nix in die Richtung gefunden. Hast du da evlt. nen Link dort hin?

      Grüße.

      Kommentar


      • #4
        https://bugs.php.net/bug.php?id=72742

        Kommentar


        • #5
          Ähm...und was genau soll das mit dem von mir geschilderten Verhalten zu tun haben?

          Ich hab das selbe Verhalten nun auch unter php 7.1 feststellen können.

          Grüße.

          Kommentar


          • #6
            Dachte es hätte mit dem mem_alloc zu tun.
            So nun habe ich es bei mir auf dem Server getestet und da kommt folgendes
            PHP-Version: 7.0.13
            memory_limit: 64M
            Mem: 0.34MB

            Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 20480 bytes) in /home/xxx/public_html/test/mem.php on line 10
            Muss also an etwas anderem liegen.

            Kommentar


            • #7
              uhm .. nach meinem Wissen ist memory_limit eine von den Optionen der PHP.ini die du nicht "online" modizieren kannst - weil der Befehl einfach zu spät kommt - die PHP-Sitzung ist bereits mit dem Wert der hart-kodiert in der php.ini steht initialisiert - danach geht dein Befehl an /dev/null (wird ignoriert) - ändere halt die php,ini direkt (wenn du darfst) .. dann solltest du auch die Fehlermeldung von protestix bekommen
              "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

              Kommentar


              • #8
                Zitat von eagle275 Beitrag anzeigen
                uhm .. nach meinem Wissen ist memory_limit eine von den Optionen der PHP.ini die du nicht "online" modizieren kannst - weil der Befehl einfach zu spät kommt
                Doch geht, habe es nachgelesen und selber ausprobiert.

                Kommentar


                • #9
                  Die Frage ist da eher, ob das irgendwie praxisrelevant ist. Und dank den Generatoren (yield), die mit 5.5 gekommen sind, kann man inzwischen viele (sicher aber nicht alle) Prozesse so umsetzen, dass sie nur noch minimalen Arbeitsspeicherbedarf haben. Ich habe jedenfalle noch nie gesehen, dass ein Script seinen Arbeitsspeicherverbrauch nachträglich nach oben hin anpasst und hätte tatsächlich jetzt wie eagle275 angenommen, dass man den Wert nicht im Nachhinein ändern kann.

                  Kommentar


                  • #10
                    eagle275
                    Der Wert ist in der php.ini festgelegt. Ich hab im Script nur den aktuellen eingestellten Wert mit ausgegeben.

                    rkr
                    Es geht darum die max. Anzahl Apache-Prozesse festzulegen. Wenn ein Prozess auf einmal 90MB (statt der erwarteten 64MB) verwenden kann...

                    Grüße.

                    Kommentar


                    • #11
                      Zitat von php1704
                      Es geht darum die max. Anzahl Apache-Prozesse festzulegen. Wenn ein Prozess auf einmal 90MB (statt der erwarteten 64MB) verwenden kann...
                      Eigentlich geht es um den maximalen Speicherverbrauch, den man einem einzelnen PHP-Script zugesteht. Wenn ich einen Script maximal 256mb zugestehe, dann heißt das nicht, dass ich maximal MAXRAM/Memory_Limit Worker haben kann...

                      Kommentar


                      • #12
                        Doch genau so sieht's aus. Zwar jetzt ned RAM/memory_limit aber im Prinzip schon...man hat ne gewisse Menge an RAM den der Apache+PHP nutzen können/dürfen und den teilt man durch den Speiche den 1 Worker max. verwenden darf.

                        Grüße.

                        Kommentar


                        • #13
                          Unter OS: Linux 7.0.11 kann ich den Test #1 so nicht nach vollziehen:
                          PHP-Code:
                          ini_set("memory_limit","64M");
                          echo 
                          "memory_limit: "ini_get("memory_limit"), "<br>";
                          echo 
                          "Mem: "round(memory_get_usage()/1024/10242), "MB<br>";

                          $array = [];
                          for (
                          $i 0$i 1024 70$i++) {
                                  
                          $array[] = str_repeat(chr(rand(6565+26)), 1024);
                          }

                          echo 
                          "Mem: "round(memory_get_usage()/1024/10242), "MB<br>";
                          unset(
                          $array); 
                          Code:
                          memory_limit: 64M
                          Mem: 0.37MB
                          
                          Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 20480 bytes) in ...
                          Merkwürdig ist folgendes Verhalten, das ähnlich wie in #1 geschildert ist:
                          PHP-Code:
                          ini_set("memory_limit","128M");
                          ini_set("memory_limit","64M");
                          echo 
                          "memory_limit: "ini_get("memory_limit"), "<br>";
                          echo 
                          "Mem: "round(memory_get_usage()/1024/10242), "MB<br>";

                          $array = [];
                          for (
                          $i 0$i 1024 70$i++) {
                                  
                          $array[] = str_repeat(chr(rand(6565+26)), 1024);
                          }

                          echo 
                          "Mem: "round(memory_get_usage()/1024/10242), "MB<br>";
                          unset(
                          $array); 

                          Code:
                          memory_limit: 64M
                          Mem: 0.37MB
                          Mem: 91.88MB

                          Kommentar


                          • #14
                            Zitat von jspit Beitrag anzeigen
                            Unter OS: Linux 7.0.11 kann ich den Test #1 so nicht nach vollziehen:
                            Bei mir funktioniert das genau so, wie es sollte:

                            PHP 7.0.9-1+deb.sury.org~trusty+1 (cli)

                            PHP-Code:
                            <?php
                            ini_set
                            ("memory_limit","128M");
                            ini_set("memory_limit","64M");
                            echo 
                            "memory_limit: "ini_get("memory_limit"), "\n";
                            echo 
                            "Mem: "round(memory_get_usage(true)/1024/10242), "MB\n";

                            $array = [];
                            for (
                            $i 0$i 1024 70$i++) {
                                
                            $array[] = str_repeat(chr(rand(6565+26)), 1024);
                            }

                            echo 
                            "Mem: "round(memory_get_usage(true)/1024/10242), "MB\n";
                            PHP-Code:
                            memory_limit64M
                            Mem
                            2MB
                            PHP Fatal error
                            :  Allowed memory size of 67108864 bytes exhausted (tried to allocate 20480 bytesin /tmp/test.php on line 9 
                            Zitat von php1704 Beitrag anzeigen
                            Doch genau so sieht's aus. Zwar jetzt ned RAM/memory_limit aber im Prinzip schon...man hat ne gewisse Menge an RAM den der Apache+PHP nutzen können/dürfen und den teilt man durch den Speiche den 1 Worker max. verwenden darf.
                            Genau. Aber nicht memory_limit, sondern den tatsächlichen maximalen durchschnittlichen Speicherverbrauch aller auf diesem Server laufenden PHP-Anwendungen.

                            Kommentar


                            • #15
                              Ich hab das Test-Script mal ein wenig erweitert.
                              Seltsamerweise kriegt man "ab und zu" durchaus nen Error, wie erwartet...allerdings hab ich das Script nun auch schon ne weile (bis knapp 'nem GB Speicherverbrauch) laufen lassen...
                              Ich hab's auch schon mit php-fpm statt mod_php versucht. Auch das gleiche Verhalten.

                              PHP-Code:
                              <?php $count = isset($_GET['c']) ? intval($_GET['c']) : 1?>
                              <!DOCTYPE html>
                              <html>
                              <head>
                                  <meta http-equiv="refresh"
                                      content="1; URL=http://<?= $_SERVER['HTTP_HOST'?>/<?= $_SERVER['SCRIPT_NAME'?>?c=<?= ($count 1?>">
                              </head>
                              <body>
                              <?= date("Y-m-d H:i:s"?><br>
                              <?php
                              error_reporting
                              (E_ALL);
                              ini_set("display_errors"1);

                              echo 
                              "count: "$count"<br>";
                              echo 
                              "memory_limit: "ini_get("memory_limit"), "<br>";
                              echo 
                              "Mem used (start): "round(memory_get_usage()/1024/10242), "MB<br>";

                              $array = [];
                              for (
                              $i 0$i 1024 $count$i++) {
                                  
                              $array[] = str_repeat(chr(rand(6565+26)), 1024);
                              }

                              echo 
                              "Mem used (end): "round(memory_get_usage()/1024/10242), "MB<br>";
                              unset(
                              $array);
                              echo 
                              "Mem used (peak): "round(memory_get_peak_usage()/1024/10242), "MB<br>";
                              ?>
                              </body>
                              </html>

                              Code:
                              2016-12-12 22:39:46
                              count: 210
                              memory_limit: 32M
                              Mem used (start): 0.34MB
                              Mem used (end): 270.85MB
                              Mem used (peak): 270.85MB
                              Hab Apache mal auf 1 Worker-Process beschränkt. Kann man in der Prozessliste schön zuschauen, wie der Speicherbedarf mit "mem used" mit hoch geht.

                              Die CLI-Version funktioniert hingegen wie erwartet. Nur PHP im Webserver zeigt das Verhalten.

                              *ratlos*

                              Grüße.

                              Kommentar

                              Lädt...
                              X