webForumDet fria alternativet

Tömma PHP-minnet

19 svar · 2 019 visningar · startad av Mycodez

MycodezMedlem sedan feb. 2010445 inlägg
#1

Tjena.

Jag har en fråga, som lyder hur går man till väga att tömma PHP-minnet? För jag har ett PHPskript, generare lite mail och php ut av mailen, men nu har jag problem med minnet efter jag kört mitt skript skarpt ett tag för se hur det fungerar i längden. Men jag har kontaktat min Binero om vad det skulle var att minnet tar slut, och dem misstänker det med, så nu undrar jag då hur går jag till väga att för att tömma minnet i PHP, under tiden skriptet körs? Är detta möjlig och hur ska det kodas?

MVH
Robin K,

PS: Snabba svar är mycket taksamt

prplxrMedlem sedan juni 2012582 inlägg
#2

Sätt ob_start() högst upp i filen och ob_flush() där du vill "tömma".

MycodezMedlem sedan feb. 2010445 inlägg
#3

okej jag gjorde det nu och jag får fortaradne detta meddelande upp:

OK
The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, root@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

Min kod jag kör ser ut så här:

<?php //require 'init.php'; 
ob_start();
require('fpdf.php');
require 'PDF.php';
require('mailFunc.php');
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>GAL</title>
<link href="css/demo.css" rel="stylesheet" type="text/css" />
</head>
<body>
<?php

$srv = 'xxx';
$user = 'xxx;
$pass = 'xxx;

$pfdRootDir = 'pdf';
$pdfd = scandir($pfdRootDir);
unset($pdfd[0],$pdfd[1]);

$conn = imap_open($srv, $user, $pass);
$boxes = imap_getmailboxes($conn, $srv, '*');
if (is_array($boxes)) {
    foreach ($boxes as $key => $val) {
        $nc = imap_open($val->name, $user, $pass);
        $name = utf8_encode(mb_convert_encoding( $val->name, "ISO_8859-1", "UTF7-IMAP"));
        $name = str_replace("å","a",$name);
        $name = str_replace("ä","a",$name);
        $name = str_replace("ö","o",$name);
        $name = str_replace("Å","A",$name);
        $name = str_replace("Ä","A",$name);
        $name = str_replace("Ö","O",$name);
        $name = end(explode('}', $name));
        $name = strtolower($name);
        $check = explode('/', $name);
        
        if(in_array('loggbok', $check)){
            $emails = imap_search($nc,'ALL');
            if($emails){
               // echo '<b>('.count($emails).') Mails ( '.$val->name.' )</b><br/>';
                rsort($emails);
                if(in_array($check[1], $pdfd)){
                    //echo "Map exist<br/>";
                }else{
                    mkdir($pfdRootDir.'/'.$check[1]);
                    //echo "Map Created<br/>";
                }
                $name = preg_replace('/\s+/', '', $check[2]);
                $pdfDir = $pfdRootDir.'/'.$check[1];
                if (file_exists($pdfDir.'/'. $name.'-V1.pdf')) {
                    $VerNr = 1;
                    while(file_exists($pdfDir.'/'. $name.'-V'.$VerNr.'.pdf')){
                        $VerNr++;
                    }
                     $pdfFullPath = $pdfDir.'/'.$name.'-V'.$VerNr.'.pdf';
                }else{
                    $pdfFullPath = $pdfDir.'/'.$name.'-V1.pdf'; 
                }
                $pdf = new PDF();
                $pdf->AliasNbPages();
                $pdf->AddPage();
                $pdf->SetFont('Times','',12);
                foreach ($emails as $email_id) {
                    $head = getHeaders($nc, $email_id);  // Get Header Info Return Array Of Headers **Key Are (subject,to,toOth,toNameOth,from,fromName)
                    $pdf->Cell(0,5,'Subjects :: '.utf8_encode(mb_convert_encoding($head['subject'], "ISO_8859-1", "UTF7-IMAP")),0,1);
                    $pdf->Cell(0,5,'TO :: '.$head['to'],0,1);
                    $pdf->Cell(0,5,'To Other :: '.$head['toOth'],0,1);
                    $pdf->Cell(0,5,'ToName Other :: '.$head['toNameOth'],0,1);
                    $pdf->Cell(0,5,'From :: '.$head['from'],0,1);
                    $pdf->Cell(0,5,'FromName :: '.$head['fromName'],0,1);
                    $pdf->Ln(5);
                    $pdf->Cell(0,5,'Message:',0,1);
                    $pdf->WriteHTML(getBody($nc, $email_id));
                    $str = GetAttech($nc, $email_id,"./"); // Get attached File from Mail Return name of file in comma separated string  args. (mailid, Path to store file)
                    $ar = explode(",",$str);
                    if(count($ar)){
                        foreach($ar as $key=>$value){
                            $pdf->Ln(5);
                            $pdf->Cell(0,5,'Bilagor:',0,1);
                             $value = str_replace(" ","-",$value);
                             $ext = strtoupper(end(explode('.',$value)));
                             ($value=="")?"":$URL = 'http://mailtest.robinkardell.com/se/'.$value;
                             if($ext == 'JPEG' ||$ext == 'JPG'|| $ext == 'PNG' || $ext == 'GIF'){
                               ($value=="")?"":$pdf->Image($URL,null,null,null,null,$ext);
                               ($value=="")?"":$pdf->Cell(0,5,'Atteched File :: '.$value,0,1);  
                             }else{
                                ($value=="")?"":$pdf->Cell(0,5,'Atteched File :: '.$value,0,1);
                             }
                        }
                        $pdf->Cell(0,5,'------------------------------------------',0,1);
                       }
                   }
                $pdf->Output($pdfFullPath, 'F');
            }
        }
        ob_flush();
        imap_close($nc);
    }    
}
imap_close($conn);
?>
</body>
</html>
drewMedlem sedan mars 2007845 inlägg
#4

"The server encountered an internal error or misconfiguration and was unable to complete your request." brukar det inte stå när minnet är slut.

MycodezMedlem sedan feb. 2010445 inlägg
#5

okej men vad kan det vara då?

drewMedlem sedan mars 2007845 inlägg
#6

Något fel i din .htaccess fil, kanske det vanligaste felet. Eller så är det fel i din apache config.

b242569Medlem sedan sep. 20051 760 inlägg
#7

Det kan vara så att du har glömt ' någonstans. I koden visas

$srv = 'xxx';
$user = 'xxx;
$pass = 'xxx;

Om det hela tiden står 'xxx' med ' både före och direkt efter torde det kunna bli annorlunda.

drewMedlem sedan mars 2007845 inlägg
#8

Det skulle resultera i en blanksida (om servern inte visar fel) och inte felkonfigurering.

b242569Medlem sedan sep. 20051 760 inlägg
#9

Men högst upp

require('fpdf.php');
require 'PDF.php';
require('mailFunc.php');

'PDF.php' står inte inom parentes som de övriga require.

MycodezMedlem sedan feb. 2010445 inlägg
#10

detta med
$srv = 'xxx';
$user = 'xxx;
$pass = 'xxx;

det var en miss av mig när jag dolde den verkliga, texten som står där, så jag råkade visst få med en enkelfunt där men så e det inte när skriptet kör skarpt.

men jag kan dock inte ändra min .htaccess fil eller apache configen, för detta skript körs och ligger hos Binero, och som jag vet kan jag inte ändra min inställningar där eller kan man det? i så fall hur?

drewMedlem sedan mars 2007845 inlägg
#11

b242569 skrev:

require 'PDF.php';
'PDF.php' står inte inom parentes som de övriga require.

Det spelar ingen roll. Det behöver inte stå inom parenteser.

MycodezMedlem sedan feb. 2010445 inlägg
#12

Jag har kollat lite med fel meddelande
**OK
The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, root@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error.**

More information about this error may be available in the server error log.

kan det vara pga denna varning jag inte sätt tidigare, (har visst haft att jag inte ska vissa error på).

varningen lyder
Warning: Invalid argument supplied for foreach() in /storage/content/28/165928/mailtest.robinkardell.com/public_html/se/mailFunc.php on line 87

rad 87 är:
foreach($struckture->parts as $key => $value)

och koden är:

function GetAttech($connect,$mid,$path) // Get Atteced File from Mail
{
    $struckture = imap_fetchstructure($connect,$mid);
    $ar="";
    foreach($struckture->parts as $key => $value)
    {
        $enc=$struckture->parts[$key]->encoding;
        if($struckture->parts[$key]->ifdparameters)
        {
            $name=$struckture->parts[$key]->dparameters[0]->value;
            $name = str_replace(" ","-",$name);
            $message = imap_fetchbody($connect,$mid,$key+1);
            if ($enc == 0)
                $message = imap_8bit($message);
            if ($enc == 1)
                $message = imap_8bit ($message);
            if ($enc == 2)
                $message = imap_binary ($message);
            if ($enc == 3)
                $message = imap_base64 ($message);
            if ($enc == 4)
                $message = quoted_printable_decode($message);
            if ($enc == 5)
                $message = $message;
            $fp=fopen($path.$name,"w");
            fwrite($fp,$message);
            fclose($fp);
            $ar=$ar.$name.",";
        }
    }
    $ar=substr($ar,0,(strlen($ar)-1));
    return $ar;
}
drewMedlem sedan mars 2007845 inlägg
#13

Du har imap_open() någonstans innan den där funktionen anropas?

MycodezMedlem sedan feb. 2010445 inlägg
#14

Ja, först kör jag en imap_open för öppna så jag får till gång till mapp strukturen som finns i mailen. sen gör jag en imap_open för varje ny mapp för att kunna läsa ens mapps understruktur, sen kolla om en mapp innehåller titeln loggbok för att sen kunna läsa alla mail som finns i den mappen men sen stänger jag av alla imap open med imap_close,
och denna funktion anropas när man läser in mailen, i huvud funktionen.
men har ingen IMAP_open någonstans i den filen det anropet finns.

MycodezMedlem sedan feb. 2010445 inlägg
#15

jag har nu googlat runt och kollat lite och fått tips om vad som kan var fel

jag ändra mitt funktion till detta

function GetAttech($connect,$mid,$path) // Get Atteced File from Mail
{
    $struckture = imap_fetchstructure($connect,$mid);
    $ar="";
    if(is_array($struckture)){
        foreach($struckture->$parts as $key => $value)
        {
            $enc=$struckture->parts[$key]->encoding;
            if($struckture->parts[$key]->ifdparameters)
            {
                $name=$struckture->parts[$key]->dparameters[0]->value;
                $name = str_replace(" ","-",$name);
                $message = imap_fetchbody($connect,$mid,$key+1);
                if ($enc == 0)
                    $message = imap_8bit($message);
                if ($enc == 1)
                    $message = imap_8bit ($message);
                if ($enc == 2)
                    $message = imap_binary ($message);
                if ($enc == 3)
                    $message = imap_base64 ($message);
                if ($enc == 4)
                    $message = quoted_printable_decode($message);
                if ($enc == 5)
                    $message = $message;
                $fp=fopen($path.$name,"w");
                fwrite($fp,$message);
                fclose($fp);
                $ar=$ar.$name.",";
            }
        }
    }
    $ar=substr($ar,0,(strlen($ar)-1));
    return $ar;
}

men nu får jag detta i stället
Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, root@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

vad kan var fel? för jag vet inte riktigt vad som händer just nu kan jag ärligt säga nu :OO

prplxrMedlem sedan juni 2012582 inlägg
#16

Titta i loggboken och ge oss felmeddelandet därifrån. Det där hjälper oss inte mycket. Alternativt så på felmeddelandevisning och kopiera på den vägen.

MycodezMedlem sedan feb. 2010445 inlägg
#17

Jag får inget error i min loggbok :/

drewMedlem sedan mars 2007845 inlägg
#18

"The server encountered an internal error or misconfiguration" brukar alltid ge något i loggen. Jag tror aldrig jag stött på att det inte skulle finnas något i loggen, vad jag kan komma ihåg.

Titta i Apache loggen både den vanliga access.log och error.log. På *nix är dom i /var/log/apache2/ förutsatt att det är Apache 2 du använder.

MycodezMedlem sedan feb. 2010445 inlägg
#19

tack ska kolla upp det. :)

MycodezMedlem sedan feb. 2010445 inlägg
#20

ingen av filerna innehåller text ser jag :)

139 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)