[PHP] File() leest niet het hele bestand

Pagina: 1
Acties:
  • 225 views sinds 30-01-2008
  • Reageer

Onderwerpen


  • mschol
  • Registratie: November 2002
  • Niet online
Wat doet mijn script?
mijn script leest vanaf fok mijn profiel pagina in.
Deze wordt opgeslagen in profile.html
Profile.html wordt vervolgens door mijn script ingelezen en doorzocht naar een bepaalde waarde.
als deze waarde is gevonden dan wordt deze opgeslagen in een database.

Het probleem
het inlezen van profile.html m.b.v. file() lukt tot regel 76, daarna stopt het script met inlezen en geeft geen foutmelding terug.

Wat denk ik dat het probleem zou kunnen zijn?
  1. Memory limiet van php wordt overschreden
  2. Curl is nog bezig bestand aan het wegschrijven op moment van inlezen
Wat heb ik geprobeerd?
• Google
• Got search
• Error reporting op E_ALL zetten
• De stuk code dat profile.html inleest in een apart bestand zetten en testen Dit werkt wel :?
• php memory limit verhoogd m.b.v. een ini_set
• max_execution_time verhoogd naar 120
• php 60 seconden laten slapen na einde van curl.

Script
zie Deze url voor de source code
Wie heeft een ideetje wat het kan zijn

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Ik zou dat SessID maar even uit je code halen. Je wilt niet weten wat voor narigheid je jezelf hiermee op de hals kunt halen :) Als er straks opeens posts van jou op Fok! verschijnen waar je niets vanaf weet is het je wel duidelijk >:)

[ Voor 29% gewijzigd door Gerco op 20-09-2006 09:49 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • mschol
  • Registratie: November 2002
  • Niet online
Gerco schreef op woensdag 20 september 2006 @ 09:48:
Ik zou dat SessID maar even uit je code halen. Je wilt niet weten wat voor narigheid je jezelf hiermee op de hals kunt halen :) Als er straks opeens posts van jou op Fok! verschijnen waar je niets vanaf weet is het je wel duidelijk >:)
8)7
thnx :P

hierbij ook een screenshot van wat er verkeerd gaat:
http://fia181-83.dsl.hccnet.nl/fok/ERR.JPG

  • mschol
  • Registratie: November 2002
  • Niet online
met deze code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
while($i<1000) 
{ 

   if(preg_match_all($regex,$lines[$i],$needle)) 
   { 
      $needle = split(' ',$needle[0][0]); 
      if($needle[0] != '' && is_numeric($needle[0])) 
      { 
       
         $query = RunQuery("INSERT INTO `posts` (`posts`,`datum`,`ID`) VALUES('$needle[0]','".date('Y-m-d H:i:s')."','".$ID."')"); 
         CloseConDB($con); 
         unlink($local_file); 
         //exit; 
         echo("done<br>"); 
        } 
   } 
   $i++; 
} 
echo("done_na_while");


krijg ik als het lokale bestand NIET bestaat alleen done_na_while terug
bestaat het lokale bestand WEL, dan krijg ik done en done_na_while terug
na die regel 76
code:
1
 Mijn DVD Collectie</a> | <a href="http://forum.fok.


stopt hij met output maar de while loop loopt netjes door..

[ Voor 11% gewijzigd door mschol op 21-09-2006 08:07 ]


  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Is het niet verstandiger, om direct je profiel pagina te laden met PHP? Als ik namelijk bij file() file kijk, kan je zelfs verwijzen naar een externe pagina, die dan geladen moet worden... :)

Of heb je er een reden voor, om het eerst in een database op te slaan, terwijl Fok dit allemaal al voor je doet? :)

Lijkt me dat het sneller (en redundanter is) als je het direct vanaf Fok laadt. Enige nadeel is wel, dat je script niet meer werkt, als Fok plat ligt, maar hoe vaak gebeurd dat nou, ook haast nooit meer (geloof ik)... ;)

  • mschol
  • Registratie: November 2002
  • Niet online
GJ-tje schreef op donderdag 21 september 2006 @ 08:05:
Is het niet verstandiger, om direct je profiel pagina te laden met PHP? Als ik namelijk bij file() file kijk, kan je zelfs verwijzen naar een externe pagina, die dan geladen moet worden... :)

Of heb je er een reden voor, om het eerst in een database op te slaan, terwijl Fok dit allemaal al voor je doet? :)

Lijkt me dat het sneller (en redundanter is) als je het direct vanaf Fok laadt. Enige nadeel is wel, dat je script niet meer werkt, als Fok plat ligt, maar hoe vaak gebeurd dat nou, ook haast nooit meer (geloof ik)... ;)
ik moet de pagina met curl ophalen omdat ik cookies MOET versturen met mijn request naar de server
en alleen file() stond ook in mijn oude code en werkte prima, totdat het forum werd geupdate :P

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

mschol schreef op donderdag 21 september 2006 @ 08:09:
[...]

ik moet de pagina met curl ophalen omdat ik cookies MOET versturen met mijn request naar de server
en alleen file() stond ook in mijn oude code en werkte prima, totdat het forum werd geupdate :P
Dan open je gewoon een socket met PHP, kan je de hele HTTP communicatie zelf doen :)
Datzelfde doe ik hier op GoT ook om mijn signature te updaten.

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

mschol schreef op donderdag 21 september 2006 @ 08:09:
ik moet de pagina met curl ophalen omdat ik cookies MOET versturen met mijn request naar de server
en alleen file() stond ook in mijn oude code en werkte prima, totdat het forum werd geupdate :P
Lijkt me niet dat je ingelogt moet zijn om iemands profiel te kunnen bekijken toch? :? Dan hoef je die cookies toch niet te versturen? ;)

[ Voor 6% gewijzigd door CH4OS op 21-09-2006 08:45 ]


  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

GJ-tje schreef op donderdag 21 september 2006 @ 08:44:
[...]
Lijkt me niet dat je ingelogt moet zijn om iemands profiel te kunnen bekijken toch? :? Dan hoef je die cookies toch niet te versturen? ;)
doorgaands wil je juist niet dat een profiel gelezen kan worden door iemand die niet ingelogd is uit privacy overwegingen

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Erkens schreef op donderdag 21 september 2006 @ 08:51:
doorgaands wil je juist niet dat een profiel gelezen kan worden door iemand die niet ingelogd is uit privacy overwegingen
True, daarom zijn er van die leuke opties, waarmee je dingen kan verbergen of niet... :) En anders vul je die velden toch gewoon niet in, als je niet wilt dat iemand die informatie te weten komt? :)

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

GJ-tje schreef op donderdag 21 september 2006 @ 08:55:
[...]
True, daarom zijn er van die leuke opties, waarmee je dingen kan verbergen of niet... :) En anders vul je die velden toch gewoon niet in, als je niet wilt dat iemand die informatie te weten komt? :)
gaat meer om bots die dergelijke informatie vergaren ;)
probeer hier maar, log eens uit en bekijk je profiel, gaat je niet lukken.

  • mschol
  • Registratie: November 2002
  • Niet online
GJ-tje schreef op donderdag 21 september 2006 @ 08:44:
[...]
Lijkt me niet dat je ingelogt moet zijn om iemands profiel te kunnen bekijken toch? :? Dan hoef je die cookies toch niet te versturen? ;)
je hoeft niet perse ingelogd te zijn idd maar er moet een sessie id en een userid in een sessie cookie meegestuurd worden (dit vond de admin kennelijk nodig :P )

  • mschol
  • Registratie: November 2002
  • Niet online
Erkens schreef op donderdag 21 september 2006 @ 08:51:
[...]

doorgaands wil je juist niet dat een profiel gelezen kan worden door iemand die niet ingelogd is uit privacy overwegingen
dat kan op fok zonder problemen in iedergeval..
je moet alleen bekend zijn met een sessie id :P

Acties:
  • 0 Henk 'm!

  • mschol
  • Registratie: November 2002
  • Niet online
niemand die nog een ideetje heeft?

hierzo heb ik nog wat testen uitgevoerd

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Werkt het ophalen van een andere pagina wel goed? De frontpage van tweakers.net bijvoorbeeld of een andere pagina op fok? Probeer eerst eens een zo simpel mogelijk werkende versie te maken en ga dan steeds meer toevoegen. Dan kom je er snel achter wat niet werkt.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • mschol
  • Registratie: November 2002
  • Niet online
Michali schreef op vrijdag 22 september 2006 @ 11:52:
Werkt het ophalen van een andere pagina wel goed? De frontpage van tweakers.net bijvoorbeeld of een andere pagina op fok? Probeer eerst eens een zo simpel mogelijk werkende versie te maken en ga dan steeds meer toevoegen. Dan kom je er snel achter wat niet werkt.
als ik het script splits in 2 aparte scripts dus
1 ophalen pagina en opslaan in html bestand
2 uitlezen html bestand en opslaan in database
werkt het wel
dus opzich is alle code goed.

als ik nu.nl ophaal dan haalt hij wel alles op in 1x ?

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
mschol schreef op vrijdag 22 september 2006 @ 12:01:
[...]

als ik het script splits in 2 aparte scripts dus
1 ophalen pagina en opslaan in html bestand
2 uitlezen html bestand en opslaan in database
werkt het wel
dus opzich is alle code goed.
En je voert de scripts apart uit bedoel je?
als ik nu.nl ophaal dan haalt hij wel alles op in 1x ?
Dat gaat wel in 1 keer goed bedoel je?

Probeer trouwens eens:
PHP:
1
fclose($file);

Te doen voor dat je het bestand probeert in te lezen. Hij namelijk nog gelocked zo.

Waarom zou je trouwens eerst naar een bestand schrijven? Je kunt toch ook met output control werken?
PHP:
1
2
3
4
ob_start();
curl_exec($ch);
$fileContent = ob_get_contents();
ob_end_clean();


Maar dan moet je CURLOPT_FILE option wel weghalen, anders wordt niet naar de standaard output geschreven.

Ik zie nog een foutje trouwens: fopen($local_file,w); moet fopen($local_file,'w'); zijn. Anders krijg je een undefined constant notice. Zet error_reporting(E_ALL); maar eens boven in het bestand.

[ Voor 41% gewijzigd door Michali op 22-09-2006 12:10 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Dit lijkt me toch standaard debugwerk.

Regel 30 (vlak boven $con = ...) zet je: print_r($lines);
je ziet dan of $lines alle regels bevat.

Waar komt 1000 vandaan op regel 38?
Die hele while-loop lijkt me hier ongepast, omdat je speciaal voor het doorlopen van arrays de foreach-loop kunt gebruiken. Lost je probleem niet op; maakt je code wel stukken leesbaarder.
error_reporting(E_ALL);
Inderdaad, E_ALL is geen string maar een constante.

Acties:
  • 0 Henk 'm!

  • mschol
  • Registratie: November 2002
  • Niet online
Michali schreef op vrijdag 22 september 2006 @ 12:03:
[...]

En je voert de scripts apart uit bedoel je?
Ja en ook als ik dm.v. Header(); in bestand 1 bestand 2 aanroep werkt het ook.
[...]

Dat gaat wel in 1 keer goed bedoel je?
ja dan gaat het idd in 1x goed
Probeer trouwens eens:
PHP:
1
fclose($file);

Te doen voor dat je het bestand probeert in te lezen. Hij namelijk nog gelocked zo.
als ik dat doe dan krijg ik alleen 1 als output, de fclose laat het hele script stoppen met uitvoer..
Waarom zou je trouwens eerst naar een bestand schrijven? Je kunt toch ook met output control werken?
PHP:
1
2
3
4
ob_start();
curl_exec($ch);
$fileContent = ob_get_contents();
ob_end_clean();


Maar dan moet je CURLOPT_FILE option wel weghalen, anders wordt niet naar de standaard output geschreven.
omdat ik daar geen idee van heb hoe het werkt.

--edit--

de output control werkt ook niet , er wordt nog steeds tot regel 76 output gegeven maar de loop gaat wel door...

[ Voor 6% gewijzigd door mschol op 22-09-2006 12:52 ]


Acties:
  • 0 Henk 'm!

  • mschol
  • Registratie: November 2002
  • Niet online
GlowMouse schreef op vrijdag 22 september 2006 @ 12:16:
Dit lijkt me toch standaard debugwerk.

Regel 30 (vlak boven $con = ...) zet je: print_r($lines);
je ziet dan of $lines alle regels bevat.
Sorry hoor maar ik ben er niet opgekomen (ik ben dus ook erg dankbaar dat jullie mee willen denken)
dit ga ik in iedergeval proberen

--edit--
tot regel 76 wordt er output gegeven, alleen krijg ik wel done_na_while terug :)
Waar komt 1000 vandaan op regel 38?
Die hele while-loop lijkt me hier ongepast, omdat je speciaal voor het doorlopen van arrays de foreach-loop kunt gebruiken. Lost je probleem niet op; maakt je code wel stukken leesbaarder.


[...]

Inderdaad, E_ALL is geen string maar een constante.
de 1000 is inmiddels vervangen door count($lines)
maar een while loop kan wel, een foreach maakt het dus alleen overzichtelijker...
ik zal zo ook even de source code updaten

[ Voor 5% gewijzigd door mschol op 22-09-2006 12:43 ]


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
mschol schreef op vrijdag 22 september 2006 @ 12:41:
[...]

Sorry hoor maar ik ben er niet opgekomen (ik ben dus ook erg dankbaar dat jullie mee willen denken)
dit ga ik in iedergeval proberen
Oefening baart kunst :)
maar een while loop kan wel, een foreach maakt het dus alleen overzichtelijker...
Als basisregel kun je het volgende lijstje afgaan:
1. array doorlopen -> foreach
2. weet je vantevoren hoevaak je iets moet doen -> for
3. anders -> while
ik zal zo ook even de source code updaten
Ik zie dat je nu E_All hebt staan. PHP is case-sensitive, en er moet echt E_ALL staan.

Acties:
  • 0 Henk 'm!

  • mschol
  • Registratie: November 2002
  • Niet online
hmmm na nog wat proberen met flock();
lijkt het me nu te zijn gelukt :)
wat heb ik veranderd:
PHP:
1
2
3
    curl_setopt($ch, CURLOPT_FILE, $file);
    curl_exec($ch);
    curl_close($ch);

naar
PHP:
1
2
3
4
5
    flock($file,LOCK_EX);
    curl_setopt($ch, CURLOPT_FILE, $file);
    curl_exec($ch);
    curl_close($ch);
    fclose($file);


dit lijkt vlekkeloos te werken... :)

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Probeer dit eens:
PHP:
1
2
3
4
5
ob_start();
curl_exec($ch);
curl_close($ch);
$pageContent = ob_get_contents();
ob_end_clean();

en dan dat hele gedoe met fopen, flock, fclose en file weglaten. Werkt dat niet beter?

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • mschol
  • Registratie: November 2002
  • Niet online
Michali schreef op vrijdag 22 september 2006 @ 17:42:
Probeer dit eens:
PHP:
1
2
3
4
5
ob_start();
curl_exec($ch);
curl_close($ch);
$pageContent = ob_get_contents();
ob_end_clean();

en dan dat hele gedoe met fopen, flock, fclose en file weglaten. Werkt dat niet beter?
zie 4de post boven jou eens :)

al geprobeerd nadat dat werdt aangedragen :)

--edit--

nu werkt het wel ?? 8)7

maar dan moet ik dus $page_contents door en dat is geen array maar een string
dan moet ik weer gaan uitzoeken (al zal het misschien niet heel lastig zijn) hoe ik die regex er dan overheen haal...

[ Voor 22% gewijzigd door mschol op 22-09-2006 17:56 ]


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Je kunt hem exploden, op bijvoorbeeld \n. Dan heb je losse regels.

Noushka's Magnificent Dream | Unity

Pagina: 1