[PHP] feof verschillend gedrag bij zelfde input

Pagina: 1
Acties:

Onderwerpen


  • Lulukai
  • Registratie: Maart 2007
  • Laatst online: 12:19

Lulukai

God's gift to women

Topicstarter
bedankt

[ Voor 99% gewijzigd door Lulukai op 31-07-2014 17:17 ]

.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Als je het alleen het aantal regels wil tellen doe je toch gewoon een sizeof(file($filename)) :?

Verder heb ik 't idee dat je niet alle code die je testpagina uitvoert hier post; het probleem/verschil zit 'm waarschijnlijk elders. Heb je de code zoals je die hier post al eens geprobeerd en gekeken of je daarmee 't probleem kunt reproduceren? Zo nee: doe dat eens eerst dan.

[ Voor 77% gewijzigd door RobIII op 15-04-2011 18:30 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Lulukai
  • Registratie: Maart 2007
  • Laatst online: 12:19

Lulukai

God's gift to women

Topicstarter
opgelost

[ Voor 161% gewijzigd door Lulukai op 31-07-2014 17:17 ]

.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
En je weet zeker dat je ook daadwerkelijk telkens die file geserveerd krijgt? Of krijg je na een aantal keren een 501 ofzo?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

function testje($invoer) {
    echo $invoer;
    $file_handle = fopen('http://www.mderuyck.com/zooi/timo/'.$invoer ,"r");

    $teller=0;
    while (!feof($file_handle) ) {
        $teller+=1;
        var_dump(fgetcsv($file_handle, 1024, ';'));
    }
    fclose($file_handle);
}

for ($i = 0; $i < 20; $i++) {
  testje("SearchResult-1.csv");
  testje("SearchResult-2.csv");
  testje("SearchResult-3.csv");
}
?>


En dan zie ik na een tijdje met regelmaat een bool(false) voorbij komen; m.a.w: je server gaat op z'n bek.

[ Voor 96% gewijzigd door RobIII op 15-04-2011 18:38 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Lulukai
  • Registratie: Maart 2007
  • Laatst online: 12:19

Lulukai

God's gift to women

Topicstarter
RobIII schreef op vrijdag 15 april 2011 @ 18:35:
En je weet zeker dat je ook daadwerkelijk telkens die file geserveerd krijgt? Of krijg je na een aantal keren een 501 ofzo?
Assumptions are evil, maar ik veronderstel van wel: de teller kan enkel aangepast worden in de while-loop en de while-loop wordt enkel doorlopen als de filestream nog niet EOF is.

.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
ruyckske schreef op vrijdag 15 april 2011 @ 18:38:
[...]

Assumptions are evil, maar ik veronderstel van wel
One word: DEBUGGEN. Debuggen: Hoe doe ik dat?

Zie ook mijn edit in mijn vorige post.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Lulukai
  • Registratie: Maart 2007
  • Laatst online: 12:19

Lulukai

God's gift to women

Topicstarter
RobIII schreef op vrijdag 15 april 2011 @ 18:35:
En dan zie ik na een tijdje met regelmaat een bool(false) voorbij komen; m.a.w: je server gaat op z'n bek.
Bedankt. Maar waarom mist ie dan zogezegd een lijn en wordt het voor een 2e keer uitgevoerd?

[ Voor 21% gewijzigd door Lulukai op 15-04-2011 18:42 ]

.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
ruyckske schreef op vrijdag 15 april 2011 @ 18:41:
[...]

Bedankt. Maar waarom mist ie dan zogezegd een lijn en wordt het voor een 2e keer uitgevoerd?
Wat ik bedoel: De output is niet consequent; er komen waarschijnlijk bij hoge(re) belasting extra crlf's voor ofzo. Wat er precies loos is mag je zelf debuggen ;)

Kijk maar eens goed naar de volgende output:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function testje($invoer) {
    $file_handle = fopen('http://www.mderuyck.com/zooi/timo/'.$invoer ,"r");

    $teller=0;
    while (!feof($file_handle) ) {
        echo "[" . trim(fgets($file_handle)) . "]\r\n";
    }
    fclose($file_handle);
}

for ($i = 0; $i < 20; $i++) {
  testje("SearchResult-1.csv");
  testje("SearchResult-2.csv");
  testje("SearchResult-3.csv");
}


[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]


/edit: Vreemd, als ik de pagina (vaak) ophaal met curl heb ik er geen last van...

/edit2: Lees de comments hier eens........

[ Voor 151% gewijzigd door RobIII op 15-04-2011 19:00 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Lulukai
  • Registratie: Maart 2007
  • Laatst online: 12:19

Lulukai

God's gift to women

Topicstarter
RobIII schreef op vrijdag 15 april 2011 @ 18:44:
[...]

/edit: Vreemd, als ik de pagina (vaak) ophaal met curl heb ik er geen last van...
cURL is voor zulke dingen veel performanter heb ik ergens eens gelezen;

.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
function testje($invoer) {
    $fp = fopen('http://www.mderuyck.com/zooi/timo/'. $invoer, "r");

    if ($fp !== false) {
      $teller = 0;

      $current_line = fgets($fp);
      while ((feof($fp) !== false) && ($current_line !== false)) {
        $teller++;
        $current_line = fgets($fp);
      }
      fclose($fp);
      echo $teller;
    } else {
      echo 'F';
    }
}

error_reporting(E_ALL | E_STRICT);
for ($i = 0; $i < 50; $i++) {
  testje("SearchResult-1.csv");
  testje("SearchResult-2.csv");
  testje("SearchResult-3.csv");
}
?>

100110110011000010111111111111111000011111011000100100000011111001011101011100101100001111000100101111000100000000100011010000100000111110100101110000


Schiet mij maar lek...
Je zou even met een wireshark ofzo kunnen kijken of 't euvel nou in de respons van de mderuyck.com zit...

[ Voor 10% gewijzigd door RobIII op 15-04-2011 19:11 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 23-10 18:32
Misschien kun je bij het debuggen hier wat mee (mn via meta data kijken wat je binnenkrijgt van server)
http://www.php.net/manual/en/wrappers.http.php
http://www.php.net/manual....stream-get-meta-data.php

Bij een lege regel een andere eof status. En verder heb ik geen idee...

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]<br/>
Array
(
    [wrapper_data] => Array
        (
            [0] => HTTP/1.1 200 OK
            [1] => Date: Fri, 15 Apr 2011 22:44:02 GMT
            [2] => Server: Apache/2
            [3] => Last-Modified: Fri, 15 Apr 2011 15:46:45 GMT
            [4] => ETag: "7a59f76-bf-4a0f6f2ef2340"
            [5] => Accept-Ranges: bytes
            [6] => Content-Length: 191
            [7] => Vary: Accept-Encoding,User-Agent
            [8] => Connection: close
            [9] => Content-Type: text/csv
        )

    [wrapper_type] => http
    [stream_type] => tcp_socket/ssl
    [mode] => r
    [unread_bytes] => 0
    [seekable] => 
    [uri] => http://www.mderuyck.com/zooi/timo/SearchResult-3.csv
    [timed_out] => 
    [blocked] => 1
    [eof] => 1
)
[]<br/>
Array
(
    [wrapper_data] => Array
        (
            [0] => HTTP/1.1 200 OK
            [1] => Date: Fri, 15 Apr 2011 22:44:02 GMT
            [2] => Server: Apache/2
            [3] => Last-Modified: Fri, 15 Apr 2011 15:46:45 GMT
            [4] => ETag: "7a59f75-bf-4a0f6f2ef2340"
            [5] => Accept-Ranges: bytes
            [6] => Content-Length: 191
            [7] => Vary: Accept-Encoding,User-Agent
            [8] => Connection: close
            [9] => Content-Type: text/csv
        )

    [wrapper_type] => http
    [stream_type] => tcp_socket/ssl
    [mode] => r
    [unread_bytes] => 0
    [seekable] => 
    [uri] => http://www.mderuyck.com/zooi/timo/SearchResult-1.csv
    [timed_out] => 
    [blocked] => 1
    [eof] => 
)

[ Voor 81% gewijzigd door Bolukan op 16-04-2011 00:46 ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 07:23
Eerste stap lijkt me toch de data opslaan vóór je 'm parset. Als 'ie dan uit een ander aantal regels bestaat dan je verwachtte, kun je printen wat je precies gekregen had.

Misschien treedt de fout dan opeens niet meer op (Heisenbug) maar je weet dat pas als je 't probeert (en dan kun je alsnog met Wireshark aan de slag).

(Overigens krijg ik met RobIII's scriptje alleen maar 1tjes te zien. Dit is met PHP 5.3.6 op 32-bits Linux. Wat voor platform en PHP-versie gebruiken jullie? edit: Never mind, ik zie nu wel zo af en toe een 0, maar het zijn er maar één of twee per run.)

[ Voor 27% gewijzigd door Soultaker op 16-04-2011 00:53 ]


  • Bolukan
  • Registratie: Oktober 2002
  • Laatst online: 23-10 18:32
feof lijkt niet altijd goed te werken, maar stream_get_meta_data werkt wel goed (unread bytes = 0)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Array
(
    [wrapper_data] => Array
        (
            [0] => HTTP/1.1 200 OK
            [1] => Date: Fri, 15 Apr 2011 22:48:05 GMT
            [2] => Server: Apache/2
            [3] => Last-Modified: Fri, 15 Apr 2011 15:46:45 GMT
            [4] => ETag: "7a59f75-bf-4a0f6f2ef2340"
            [5] => Accept-Ranges: bytes
            [6] => Content-Length: 191
            [7] => Vary: Accept-Encoding,User-Agent
            [8] => Connection: close
            [9] => Content-Type: text/csv
        )

    [wrapper_type] => http
    [stream_type] => tcp_socket/ssl
    [mode] => r
    [unread_bytes] => 191
    [seekable] => 
    [uri] => http://www.mderuyck.com/zooi/timo/SearchResult-1.csv
    [timed_out] => 
    [blocked] => 1
    [eof] => 
)
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]<br/>
Array
(
   KNIP
    [unread_bytes] => 0
   KNIP
    [eof] => 
)
[]<br/>
Array
(
   KNIP
)
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]<br/>
Array
(
   KNIP
)
[Nummer zending;Stad/land vertrek;Datum in ontvangstname;Stad/land bestemming;Naam bestemming;Laatste Status;Afleveringsdatum;Afleveringsuur;Klanten referentie;Datum ;Tijdstip;Status;Plaats]<br/>

[ Voor 42% gewijzigd door Bolukan op 16-04-2011 00:55 . Reden: irrelevante regels verwijderd ]


  • sPENKMAN
  • Registratie: April 2002
  • Laatst online: 09-10 13:30
Met deze code kan ik het probleem ook niet meer reproduceren op mijn eigen server waar dit wel lukt met jouw code. Dit is overigens onder 5.3.6 alhoewel dit geen invloed lijkt te hebben in de reproduceerbaarheid :)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php

function testje($invoer) {
echo "<br>".$invoer;
    $file_handle = fopen('http://www.mderuyck.com/zooi/timo/'.$invoer ,"r");
    $teller = 0;

    while (($data = fgetcsv($file_handle, 0, ",")) !== FALSE) {
        $num = count($data);
        echo $teller."";
        $teller++;
    }
    echo "$teller";
    fclose($file_handle);
}

for ($i = 0; $i < 20; $i++) {
  testje("SearchResult-1.csv");
  testje("SearchResult-2.csv");
  testje("SearchResult-3.csv");
}

?>



Edit: Zojuist een loopje gedraaid met 15.000 requests, output blijft 100% op de verwachte "01" komen, bovenstaande lijkt dus een oplossing / workaround te zijn. Blijft alleen de vraag waarom dit verschil optreed, ik zou het in ieder geval niet weten, daar is mijn kennis dan weer te beperkt voor :+

[ Voor 24% gewijzigd door sPENKMAN op 16-04-2011 01:19 ]

Eve char: Warock <TEST>


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 07:23
Zijn de bestanden heel erg groot? Anders is het misschien een optie om cURL te gebruiken in plaats van de fopen-wrappers, als dat betrouwbaarder is. Ik denk dat de fopen-wrappers gewoon buggy geïmplementeerd zijn in PHP.

[ Voor 19% gewijzigd door Soultaker op 16-04-2011 01:25 ]


  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
Feof geeft op geen manier aan dat je aan het einde van een regel bent. Het zegt alleen dat je niet aan het einde van je stream bent in dit geval.

Wanneer gaat dit fout?
Als de download trager is dan de code.

Waarom?
Je hebt geen EOF in de stream gekregen. De code denkt dat er nog een regel komt, volgende loopje krijgt de code een EOF en kapt ermee. Je fgetcsv zal ook 1 keer false returnen op dat moment.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
ReenL schreef op zaterdag 16 april 2011 @ 14:41:
Waarom?
Je hebt geen EOF in de stream gekregen. De code denkt dat er nog een regel komt, volgende loopje krijgt de code een EOF en kapt ermee. Je fgetcsv zal ook 1 keer false returnen op dat moment.
Hoe verklaar jij RobIII in "[PHP] feof verschillend gedrag bij zelfd..." dan?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

Zou het zo kunnen zijn dat het volgende stuk commentaar ook van toepassing kan zijn op dit verhaal?
Please note that feof() used with TCP-Connections, returns false as long as the connection is open.
It even returns false when there is no data available.
Het lijkt net of het even duurt nadat alle gegevens uitgelezen zijn voordat de connectie wordt verbroken. Zie onderstaande voorbeeld. Zonder de fgets() komt er (uiteraard) geen eof.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$fp = fopen('http://www.mderuyck.com/zooi/timo/SearchResult-1.csv', "r"); 

$current_line = fgets($fp);
while (true) {
      var_dump(feof($fp));
}
/*
bool(false)
bool(false) [32x]
bool(true)
bool(true) [...]
*/

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
Je gebruikt && dus beide statements moeten waar zijn feof is blijkbaar false, je zou heel feof niet moeten gebruiken, dat zou mijn argument pas ontkrachten.
Het lijkt net of het even duurt nadat alle gegevens uitgelezen zijn voordat de connectie wordt verbroken. Zie onderstaande voorbeeld. Zonder de fgets() komt er (uiteraard) geen eof.
Dat is inderdaad de andere kant op en verklaart het probleem wat Rob3 heeft :)

[ Voor 26% gewijzigd door ReenL op 16-04-2011 22:39 . Reden: Quote 2 erbij :) ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 07:23
ReenL schreef op zaterdag 16 april 2011 @ 14:41:
Je hebt geen EOF in de stream gekregen. De code denkt dat er nog een regel komt, volgende loopje krijgt de code een EOF en kapt ermee. Je fgetcsv zal ook 1 keer false returnen op dat moment.
Ik ben vooral bekend met POSIX-compliant API's en daarbij is het gebruikelijk dat het lezen van file descriptors blockt wanneer er geen data beschikbaar is (tenzij de file desciptor specifiek in non-blocking mode gezet is). Met andere woorden, fgets() zou alleen een lege string kunnen returnen wanneer de socketverbinding gesloten is.

Klopt het dat jij claimt dat dat in PHP niet zo werkt? Als dat het geval is, dan zijn die fopen()-wrappers toch praktisch onbruikbaar omdat je lokale processing toch bijna altijd sneller gaat dan het netwerk?

[ Voor 7% gewijzigd door Soultaker op 17-04-2011 17:37 ]


  • Patriot
  • Registratie: December 2004
  • Laatst online: 01-11 16:05

Patriot

Fulltime #whatpulsert

ReenL schreef op zaterdag 16 april 2011 @ 14:41:
Feof geeft op geen manier aan dat je aan het einde van een regel bent. Het zegt alleen dat je niet aan het einde van je stream bent in dit geval.

Wanneer gaat dit fout?
Als de download trager is dan de code.

Waarom?
Je hebt geen EOF in de stream gekregen. De code denkt dat er nog een regel komt, volgende loopje krijgt de code een EOF en kapt ermee. Je fgetcsv zal ook 1 keer false returnen op dat moment.
Wat je zegt is niet helemaal waar hoor. In deze context feof() geeft alleen true terug op het moment dat de verbinding met de externe server is gesloten en de pointer op dat moment op de EOF staat. In de situatie van de TS is dat laatste gewoon het geval op het moment dat fgetcsv() is aangeroepen. Mijn vermoeden is dat het eerste het probleem is, de verbinding doet er gewoon nog eventjes over om dicht te gaan en dan geeft feof() nog even false.

Het is in ieder geval op te lossen door niet afhankelijk te zijn van feof(). Dit doet het bij mij zonder problemen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php

function testje($invoer) {

    echo "<br>".$invoer;

    $file_handle = fopen('http://www.mderuyck.com/zooi/timo/'.$invoer ,"r");
    $teller=0;

    while (($line_of_text = fgetcsv($file_handle, 1024, ';')) !== false) {
        echo $teller."";
        $teller+=1;
    }    

    echo $teller;

    fclose($file_handle);
}

for ($i = 0; $i < 100; $i++) {
    testje("SearchResult-1.csv");
    testje("SearchResult-2.csv");
    testje("SearchResult-3.csv");
}

?>


Het probleem wat je dan hebt is dat er andere condities aan het voltooien van de while vast zitten. Als dat niet handig is, dan is het misschien beter om de gehele file gewoon in te laden met bijv. file_get_contents() en de verwerking qua csv gewoon zelf af te handelen.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
ReenL schreef op zaterdag 16 april 2011 @ 22:36:
[...]


Je gebruikt && dus beide statements moeten waar zijn feof is blijkbaar false, je zou heel feof niet moeten gebruiken, dat zou mijn argument pas ontkrachten.
8)7 d'oh

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
Klopt het dat jij claimt dat dat in PHP niet zo werkt? Als dat het geval is, dan zijn die fopen()-wrappers toch praktisch onbruikbaar omdat je lokale processing toch bijna altijd sneller gaat dan het netwerk?
Feof is non-blocking. fgets is blocking, tenzij je dat anders instelt.
Wat je zegt is niet helemaal waar hoor. In deze context feof() geeft alleen true terug op het moment dat de verbinding met de externe server is gesloten en de pointer op dat moment op de EOF staat.
We bedoelen hetzelfde, mijn verwoording was misschien wat chaos.
8)7 d'oh
* ReenL maakt een diepe buiging :)
Pagina: 1