PHP (grote) bestanden downloaden
Beste,
Ik moet met PHP .rar bestanden gaan downloaden. Nu kan dat met file_get_contents en dan opslaan of fopen of iets dergelijks, maar het gaat om bestanden van misschien wel 8 gb. Nu is het volgens mij zo, dat PHP tijdens het downloaden van het bestand, het bestand in het geheugen laad, en na het downloaden pas opslaat. Maar met bestanden van 8 gb is dat dus een probleem omdat het geheugen vol is voordat het bestand gedownload is, want mijn geheugen is geen 8gb.
Weet iemand er meer van hoe dat zit met in het geheugen schrijven? En hoe ik het kan oplossen ?
Alvast bedankt!
Ricardo
Ik moet met PHP .rar bestanden gaan downloaden. Nu kan dat met file_get_contents en dan opslaan of fopen of iets dergelijks, maar het gaat om bestanden van misschien wel 8 gb. Nu is het volgens mij zo, dat PHP tijdens het downloaden van het bestand, het bestand in het geheugen laad, en na het downloaden pas opslaat. Maar met bestanden van 8 gb is dat dus een probleem omdat het geheugen vol is voordat het bestand gedownload is, want mijn geheugen is geen 8gb.
Weet iemand er meer van hoe dat zit met in het geheugen schrijven? En hoe ik het kan oplossen ?
Alvast bedankt!
Ricardo
Je script stop al voordat die acht gig gedownload is.
Wat je ook wilt doen.
php lijkt mij niet de oplossing.
Wat je ook wilt doen.
php lijkt mij niet de oplossing.
Ok, dan maar via SSH een wget uitvoeren.
Wat ben je van plan?
Back-up zeker?
Back-up zeker?
Ricar do: In principe schrijft PHP toch naar /tmp ? Ben er niet zeker van. Natuurlijk is er een buffer in het geheugen, maar kan me niet voorstellen dat daar de complete inhoud naar toe gaat...
Tevens is er altijd nog zoiets als een memory swap. Mocht PHP zo bagger gecode zijn dat alles inderdaad eerst naar je RAM gaat, wat dus kudt zou zijn en me erg onwaarschijnlijk lijkt, kan je OS altijd nog naar je disk swappen.
Edit: Ik bedenk me nu dat je dit natuurlijk wel zelf in de hand hebt, ik was even verward met een upload.
Je kan natuurlijk erg gemakkelijk zelf een loopje maken die 1024 per iteration leest, en dan meteen wegschrijft. Je RAM gebruik is dan niet veel he ? ;)
Waarschijnlijk is een wget wel makkelijker, maar via php kan dus ook wel.
Oh, en over dat je script "toch wel stopt" (referring @ Karl): set_time_limit
Tevens is er altijd nog zoiets als een memory swap. Mocht PHP zo bagger gecode zijn dat alles inderdaad eerst naar je RAM gaat, wat dus kudt zou zijn en me erg onwaarschijnlijk lijkt, kan je OS altijd nog naar je disk swappen.
Edit: Ik bedenk me nu dat je dit natuurlijk wel zelf in de hand hebt, ik was even verward met een upload.
Je kan natuurlijk erg gemakkelijk zelf een loopje maken die 1024 per iteration leest, en dan meteen wegschrijft. Je RAM gebruik is dan niet veel he ? ;)
Waarschijnlijk is een wget wel makkelijker, maar via php kan dus ook wel.
Oh, en over dat je script "toch wel stopt" (referring @ Karl): set_time_limit
Gewijzigd op 03/10/2010 00:33:08 door niek s
Niek s op 03/10/2010 00:19:34:
Oh, en over dat je script "toch wel stopt" (referring @ Karl): set_time_limit
Natuurlijk kan het wel, maar jij weet ook wel dat hij dat beter niet kan doen (want hij zit nu al met problemen) en het vast ook voor iets is als back-ups. Dat laat je php niet afhandelen.
Knip en plak uit mijn winkeltje:
Is dit niet hetzelfde als het bestand met je browser downloaden? Ik weet niet of hier dan een limit aanzit maar hier heb ik nog geen problemen mee gehad.
Code (php)
Is dit niet hetzelfde als het bestand met je browser downloaden? Ik weet niet of hier dan een limit aanzit maar hier heb ik nog geen problemen mee gehad.
Gewijzigd op 03/10/2010 11:23:24 door Martijn B
Er moeten bestanden gedownload worden voor gameservers die daarna uitgepakt worden en geïnstalleerd etc. Ik heb het nu inderdaad met
Handige bijkomstigheid was dat je nu ook een download snelheid throttle kan geven waardoor niet de hele serverdownlink wordt gebruikt waardoor alle gameservers zouden gaan laggen ;)
Code (php)
1
2
3
2
3
<?php
exec('wget -P /var/serverfiles/ --limit-rate=8m ftp://ftp2.nl.freebsd.org/speedtest/10mb.bin');
?>
exec('wget -P /var/serverfiles/ --limit-rate=8m ftp://ftp2.nl.freebsd.org/speedtest/10mb.bin');
?>
Handige bijkomstigheid was dat je nu ook een download snelheid throttle kan geven waardoor niet de hele serverdownlink wordt gebruikt waardoor alle gameservers zouden gaan laggen ;)
een tip: zet een & achter de regel.
Mocht je PHP script toch uitvallen, blijft die wget tenminste als een daemon doordraaien tot-ie klaar is.
Mocht je PHP script toch uitvallen, blijft die wget tenminste als een daemon doordraaien tot-ie klaar is.




