AnalyzerHQ Fórum

 

Szerző Téma: A file_get_contents() függvény nagyon-nagyon lassú  (Megtekintve 2101 alkalommal)

0 Felhasználó és 1 vendég van a témában

2010. szeptember 10. - 14:22:16
  • Kölyök tag
  • **
  • Hozzászólások: 47
  • Karma: 5

Gondom van a file_get_contents() függvénnyel. Van egy oldalam, amibe egy másik oldal tartalmát húznám be, erre a file_get_contents() kézenfekvő is, hiszen az url fopen engedélyezett. Viszont, belefutottam egy gondba, ami miatt lassan kihullik a hajam.

Részletezem:

1. Van az xy.com lap, és benne egy ilyen rész (semmi extra):

<?php
// keret.php
print file_get_contents("http://www.zz.com/valami.php");
?>


2. Van a másik lap, aminek a kimenetét beszúrnám.

<?php
// valami.php
print "Nem tudom mi a gond...";
?>


Az a gondom, hogy az xy.com lap 0 terhelés mellett is baromi lassan (5-7 másodperc saccra) jelenik meg. A 2. lap böngészőben azonnal bevillan, és a file_get_contents() nélkül az 1. is hasonlóképp tesz. Nem tudom mi a fene lehet a gond.


2010. szeptember 10. - 14:26:44
Válasz #1
  • MadAdmin
  • Teljes tag
  • ***
  • Hozzászólások: 114
  • Karma: 6
    • MadAdmin.com

DNS probléma nem lehetséges? Ki tudod próbálni a 2. lap elérhetőségét arról a szerverről, ahol az 1. lap van? A sok másodperces várakozás leginkább ilyesmi miatt szokott lenni.


2010. szeptember 10. - 14:42:28
Válasz #2
  • Kölyök tag
  • **
  • Hozzászólások: 47
  • Karma: 5

Kipróbáltam, wget paranccsal a szerverről szintén gyors minden, amíg nincs file_get_contents(). Egyéb ötlet? :(


2010. szeptember 10. - 14:50:53
Válasz #3
  • MadAdmin
  • Teljes tag
  • ***
  • Hozzászólások: 114
  • Karma: 6
    • MadAdmin.com

Tudni kellene mi lassú, hogy hol és mire várnak a scriptek. Tegyél valami időmérést a scriptek elejére és végére, hogy megtudd tképp mi a lassú.

Pl.

<?php
$start_time
=explode(" ",microtime());

//
//
// érdemi rész
//
//

$endtime=explode(" ",microtime());
$exec_time $end_time[1] + $end_time[0] - $start_time[1] - $start_time[0];
print 
$exec_time;
?>



2010. szeptember 10. - 16:56:09
Válasz #4
  • Kölyök tag
  • **
  • Hozzászólások: 47
  • Karma: 5

Tudni kellene mi lassú, hogy hol és mire várnak a scriptek. Tegyél valami időmérést a scriptek elejére és végére, hogy megtudd tképp mi a lassú.

Pl.

<?php
$start_time
=explode(" ",microtime());

//
//
// érdemi rész
//
//

$endtime=explode(" ",microtime());
$exec_time $end_time[1] + $end_time[0] - $start_time[1] - $start_time[0];
print 
$exec_time;
?>



Kipróbáltam a fentit, de nem jutottam előrébb, a file_get_contents() függvény a lassúság oka. Annyi új fejlemény van, hogy a file_get_contents() csak akkor lassú, ha PHP kimenetet rántom be vele, egy statikus HTML file pontosan ugyanonnan ahol a másik PHP file van, gyors. Nem file_get_contents függvénnyel, hanem böngészőből és wgettel viszont gyors a valami.php is. Totál nem értem. Kezdek valami php bugra gyanakodni. :(


2010. szeptember 10. - 17:02:19
Válasz #5
  • MadAdmin
  • Teljes tag
  • ***
  • Hozzászólások: 114
  • Karma: 6
    • MadAdmin.com

Huha. Tehát a valami.php lassú, amiben csak egy file_get_contents() van? De ha nem PHP kimenetből kapja a contentet, akkor meg ugyanazzal gyors? Ugyanazt adtad neki statikban? Ez eléggé képtelenségnek hangzik...


2010. szeptember 10. - 17:08:05
Válasz #6
  • Kölyök tag
  • **
  • Hozzászólások: 47
  • Karma: 5

Huha. Tehát a valami.php lassú, amiben csak egy file_get_contents() van? De ha nem PHP kimenetből kapja a contentet, akkor meg ugyanazzal gyors? Ugyanazt adtad neki statikban? Ez eléggé képtelenségnek hangzik...

Pontosan. A fenti példában a valami.php file helyett egy valami.txt-t, ugyanazzal a "Nem tudom..." sorral nem produkálja a jelenséget. Nézegetem wgettel a két lekérés eredményét és fejlécét, de csak 1-2 különbség van a static és a php verzió közt. Pár header, Last-Modification, ETag, stb. Beletettem ezeket is a valami.php fájlba a header() függvénnyel, mostmár 100%-ban ugyanazt kapom a két kérésre. Innentől kezdem feladni... Nézegetem a PHP bugokat, de nem találok ilyesmit ott se... :(


2010. szeptember 10. - 17:09:24
Válasz #7
  • MadAdmin
  • Teljes tag
  • ***
  • Hozzászólások: 114
  • Karma: 6
    • MadAdmin.com

Milyen PHP verziód van? Valami egyedi patch, suhosin, vagy ilyesmi?


2010. szeptember 10. - 17:12:20
Válasz #8
  • Kölyök tag
  • **
  • Hozzászólások: 47
  • Karma: 5

Apache 2.2.15 és php 5.3.2, de ezeket nem tudom frissíteni, nincs közöm a szerverhez, azt a megrendelőm szolgáltatója adja. phpinfo() szerint nincs semmi patch, vagy egyediség, de nem látok rá ennél jobban.


2010. szeptember 10. - 17:16:08
Válasz #9
  • MadAdmin
  • Teljes tag
  • ***
  • Hozzászólások: 114
  • Karma: 6
    • MadAdmin.com

Tudom reprodukálni scriptes hibádat egy tök más PHP verziójú szerveren. Erre meg speciel rá is látok, semmi extra nincs benne. Innentől érdekes a dolog. :)


2010. szeptember 10. - 17:45:28
Válasz #10
  • Újonc
  • *
  • Hozzászólások: 10
  • Karma: 0

Szerintem kérdezzetek rá a szolgáltatónál, mert ilyen egyszerű kódnál ilyen hibának járjanak utána ők. Ez tuti nem coder mellényúlás.
Clementh


2010. szeptember 10. - 17:48:15
Válasz #11
  • Kölyök tag
  • **
  • Hozzászólások: 47
  • Karma: 5

Szerintem kérdezzetek rá a szolgáltatónál, mert ilyen egyszerű kódnál ilyen hibának járjanak utána ők. Ez tuti nem coder mellényúlás.

Szerintem ennek semmi értelme nem lenne, a szolgáltatók nem foglalkoznak ilyen hibákkal.


2010. szeptember 10. - 22:07:06
Válasz #12
  • MadAdmin
  • Teljes tag
  • ***
  • Hozzászólások: 114
  • Karma: 6
    • MadAdmin.com

Szerintem sincs értelme a szolgáltatót bevonni, nem mindenhol hajtanak el, de a probléma okát kidebugolni nem igen fogják. Ez a fejlesztő dolga.

Viszont úgy néz ki meg van a probléma forrása. :)

Kisült egy kis debug után, hogy a file_get_contents() bugos kissé. A keep-alive connection zavarja össze a függvényt, emiatt a file_get_contents() hiába kapja meg a content-lenght mennyiségű adatot, szépen kivárja a timeoutot, amíg a kiszolgáló lezárja a kapcsolatot. Megoldásra több lehetőség is van.

1. a file_get_contents() megkerülése, pl. fopen(), fread(), fclose(),
2. "Connection: close" header küldése,
3. bármi egyéb, ami a keep-alive és a file_get_contents() együttesből kiiktat egyet, :)

Szóval egy megoldás:

<?php
header
("Connection: close");
print 
"Nem tudom mi a gond...";
?>



2010. szeptember 11. - 10:19:46
Válasz #13
  • Kölyök tag
  • **
  • Hozzászólások: 47
  • Karma: 5

Ez a keep-alive volt a gubanc. Sejtettem, hogy valami bug lehet, de nem találtam meg. Más fórumokon is próbálkoztam, de úgy tűnik itt kellett volna kezdenem. Itt 1-2 ember lézeng csak, mégis itt a pont. :)

Köszi a segítséget!


2010. szeptember 16. - 22:01:52
Válasz #14
  • Kölyök tag
  • **
  • Hozzászólások: 47
  • Karma: 5

Egyébként az file_get_contents() vagy fopen-fread-fclose az előnyösebb? Mármint a keep-aliveos gubancra keresgetve jutott eszembe, hogy vajon van más ilyen durva bugja is ennek a függvénynek? Keservesnek látom, hogy a bug igazából ismert, és nem friss, már előző verziók óta létezik php-ben. :(