Gå til innhold

PHP·pub - Programming With Attitude - and beer


Anbefalte innlegg

Gjest Slettet+6132

Prosessoren på serveren er en Pentium på 200MHz, så jeg tviler på den har flere kjerner. Skal prøve koden din jeg, takk så mye.

 

(Konspirasjon: Kanskje serveren er så treg at tiden kjeder seg og løper fra serveren? Hurra!)

Lenke til kommentar
Videoannonse
Annonse

Løsning:

 

Feilen:

echo microtime(TRUE) - microtime(TRUE);
# Vil gi noe som 4.199218749E-05

 

Løsningen:

# fikser feilmargin i koden
ini_set("precision", 100);
$start = microtime(TRUE);
/* code */
$stop = microtime(TRUE);
# round MÅ brukes for å unngå super output på hundre tegn
echo "Dette tok: ", round($stop*1000 - $start*1000, 20);

 

Feil2:

$start = microtime(TRUE);
for($i=0;$i<=100000;$i++)
{/* */ }
$stop = microtime(TRUE);
echo "Dette tok: ", round($stop*1000 - $start*1000, 20);

# Dette vil nå gi hos en 1000 ganger høyere tid.

Lenke til kommentar
Er tallet lavere en 0,006 så vil PHP gjøre tiden om til ms, tror jeg.

6773103[/snapback]

Nope, det skrives bare ut på et annen måte (vitenskapelig notasjon eller hva det nå heter. Iallfall [tall mellom 1 og 10]*10^[et eller annet tall], eller som det skrives i PHP f.eks 1.2E-5).

 

Forøvrig:

Feilen:

echo microtime(TRUE) - microtime(TRUE);
# Vil gi noe som 4.199218749E-05

6773236[/snapback]

Den vil jo være ganske åpenbart feil siden du tar et tidspunkt og trekker fra et tidspunkt etterpå. Blir det samme som å si:

$var1 = microtime(true);
$var2 = microtime(true);
echo $var1 - $var2;

Så du er nok likelangt.

 

Klarer forøvrig ikke å gjenskape problemet hos meg selv. Samme hva jeg gjør får jeg alltid et positivt tall, selv når jeg klemmer de så tett inntil hverandre som jeg klarer tidsmessig.

$var1 = microtime(true);
$var2 = microtime(true);
echo $var2 - $var1;

Lenke til kommentar
Gjest Slettet+6132
Klarer forøvrig ikke å gjenskape problemet hos meg selv. Samme hva jeg gjør får jeg alltid et positivt tall, selv når jeg klemmer de så tett inntil hverandre som jeg klarer tidsmessig.

$var1 = microtime(true);
$var2 = microtime(true);
echo $var2 - $var1;

Er ikke så ofte det skjer, men det skjer. Scriptet det er snakk om er ganske stort og alt styres fra en php-fil som inkluderer alt annet som trengs. Selve fila det er snakk om (som styrer alt) er vel på snaue 500 linjer med starttid helv øverst og sluttid så godt som nederst. Har output buffering noe å si kanskje (benytter meg av det)?
Lenke til kommentar
Klarer forøvrig ikke å gjenskape problemet hos meg selv. Samme hva jeg gjør får jeg alltid et positivt tall, selv når jeg klemmer de så tett inntil hverandre som jeg klarer tidsmessig.

$var1 = microtime(true);
$var2 = microtime(true);
echo $var2 - $var1;

Er ikke så ofte det skjer, men det skjer. Scriptet det er snakk om er ganske stort og alt styres fra en php-fil som inkluderer alt annet som trengs. Selve fila det er snakk om (som styrer alt) er vel på snaue 500 linjer med starttid helv øverst og sluttid så godt som nederst. Har output buffering noe å si kanskje (benytter meg av det)?

6773624[/snapback]

Det skal ikke ha noe å si iallfall. Alt man gjør er jo bare å cache all output. Når det i tillegg er opp mot 500 linjer mellom hver måling burde jo differansen være positiv :dontgetit: Eneste jeg kan tenke meg akkurat nå er at det er en bug :shrug:
Lenke til kommentar

Hmm ... irriterende. Forsøker skrive til en fil ved å legge til øverst, men da fjerner man jo selvsagt resten av fila :hmm:

$content = $new.'\n'.file_get_contents("file.txt");

$fp = fopen('file.txt', 'w');
fwrite($fp, $content);
fclose($fp);

Selvsagt, kan gjøre det sånn, men da får man jo et problem straks fil + det man skal legge til er høyere enn minnegrensa i PHP (som forsåvidt løses med to filer og a i stedet for w). Det ideele hadde vært å skrive direkte øverst i fila uten å måtte skrive alt sammen på nytt til fil.

 

Ideer anyone? :shrug:

Lenke til kommentar

Kan dette ikke løses ved å legge ting nederst i filen istedenfor i toppen? Lese av og legge til nederst fremfor øverst gjør vel at en slipper å lese inn hele filen for hver gang, men kan bare kjøre en append (a istedet for w). Litt usikker på hvordan en kan lese effektivt av slutten på en fil, men det er noe du må finne ut av basert på mengden skriving vs. mengden lesing. Leser du mest, kjør fra start av filen, skriver du mest, legger du til på slutten av filen. :)

Lenke til kommentar
Vel, å legge det nyest nederst blir bare dumt siden det blir både mest lesing generelt og lesing av det nyeste.

6796011[/snapback]

 

Uki, da har du rett og slett et problem. Å legge til på slutten av en fil er en enkel operasjon som kan gjøres uten å lese hele filen, men når du skal legge til noe på slutten av en fil må du åpne hele filen og legge alt innholdet inn i filen på nytt igjen. Mye stress for lite arbeid, men når du skal lese mye fra starten av filen er det bare slik det må være, rett og slett.

 

Om det er uakseptabelt å lese inn/skrive inn hele filen for hver nye linje som skrives, bør du kanskje vurdere andre måter å lagre data på, eller andre måter å skrive/lese data fra filene på.

Lenke til kommentar

Å legge til øverst er faktisk mulig, men det vil ikke gi forventa resultat. Om du skal skrive $bytes til $file og $bytes er mindre enn innholdet i file, vil du overskrive de første bokstavene av fila tilsvarende $bytes, mens resten blir som det er. Ellers vil hele filinnholdet overskrives.

 

Jeg gjorde en liten test. La oss si at test.txt ikke finnes enda:

bjorninge@bjorninge-laptop:~/Desktop$ php -r'

$file = fopen("test.txt", "w");

fwrite($file, "denne dataen er lagt til først!\n");

fclose($file);'

 

 

bjorninge@bjorninge-laptop:~/Desktop$ php -r'

$file = fopen("test.txt", "r+");rewind($file);

fwrite($file, "denne dataen er lagt til sist!\n");

fclose($file);echo file_get_contents("test.txt");'

denne dataen er lagt til sist!

!

 

 

Så det beste vil vel være å appende til fila, mens du fseek()-er deg X antall linjer tilbake ved lesing. Et annet alternativ er å bruke flere filer, og bare sørge for at hver fil er liten nok till at php kan lese den uten minneproblemer.

Endret av dabear
Lenke til kommentar
Du har ikke mulighet for å lagre dataene i en database?

6801213[/snapback]

Joda, jeg har det, men ikke andre ;) Uannsett, 8MB (er vel det som er standard max minnebruk i PHP) holder jo lenge.

 

 

Er jo mulig du kan kødde litt ved å bruke (pseudo-linux-kode):

- opprett filen ny_fil

- skriv din setning i ny_fil

- cat gammel_fil > ny_fil

- mv ny_fil gammel_fil

 

Ellers tror jeg du kan gjøre noe av det samme (uten linux-kommandoene) ved hjelp av streams, men de kom vel først i PHP5.

6801848[/snapback]

Hmm ... forsåvidt ikke så dumt. Bare "oversette" det til PHP.

 

rename("file", "old_file");
$fp_new = fopen("file", "w");
$fp_old = fopen("old_file", "r");
fwrite($fp_new, $new_content);
while (!feof($fp_old))
{
  $data = fread($fp_old, 1048576); //opptil 1MiB data lese omgangen, bare for å slippe å loope sånn veldig
  fwrite($fp_new, $data);
}
fclose($fp_old);
fclose($fp_new);
unlink("old_file");

Bare passe på å bruke den som en "nødløsning" når fila + nytt innhold er sånn cirka i nærheten av minnegrensa.

 

Edit: Ups, kanskje fread i stedet for fgets :p

Endret av Ernie
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...