PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : (Suche) - PHP Entwickler für einfache Aufgabe



DerT
12.04.2017, 13:06
Hallo Leute,

ich bin auf der Suche nach jemanden Der mir mein Problem lösen kann. Und zwar habe ich grade bei einem Projekt das Folgende Problem:
Ich erstelle mit Java große Dateien(10gb) mit Verschiedenen Geschwindigkeiten 50kb/s bis 1MB/s -> "test92.rnd" die Datei liegt im Ordner:
/var/www/
Jetzt möchte ich, wenn jemand die download.php aufruft diese Datei herunterladen kann.
Wenn die Datei schon erstellt wurde ist das ja kein Problem. Aber ich möchte das wenn die Datei noch nicht zuende erstellt wurde Sie schon runtergeladen werden kann und das die Download Geschwindigkeit angepasst wird.
Die Größe der Datei ist bekannt.

Ich zahle in Bitcoins oder Paypal.
Angebote bitte per PM.

DerT
16.04.2017, 22:27
hat niemand die kenntnisse in PHP?

Uranjitsu
16.04.2017, 22:49
Gedulde Dich doch bitte noch ein wenig.
Wenn jemand Interesse und Zeit aufbringen kann, wird er sich schon melden.

1stAid
17.04.2017, 00:46
Allein der Gedanke...
eine Datei die nicht fertig erstellt ist...
wird ja normalerweise geschützt.
Das ganze einem Client zu übergeben als Stream, da ja zum (start) Zeitpunkt kein Ende vorhanden ist.
Das fat / 32bit Systeme Probleme haben die Datei zu laden.
Ich bin kein Experte in php, aber so klein ist die Aufgabe glaube ich nicht. Allein die Berechnung um die passende Dl Geschwindigkeit zu errechnen .....
Es müsste wohl auf Client-seite wie bei Videos gepuffert werden usw.

Wenn ich mich täusche, lasse ich mich gerne belehren.

Es könnte einfacher sein du erstellst serverseitig rarparts und lässt diese wenn sie fertig sind bereitstellen.

fralix
13.05.2017, 19:08
Soweit ich weiß, ist das mit reinem PHP gar nicht möglich. Wenn, dann müssen da Modifikationen am Webserver, wenn nicht sogar ein komplett Neuer ran.
Wenn du Details über die Dateien herausgibst, könnte man vorher schon Teile davon herunterladen. Das liegt dann am Dateityp - ansonsten wie von 1stAid bereits erwähnt Rarparts erstellen.

webmaster1337
14.05.2017, 12:15
Eventuell schafft man das, wenn man die Dateien via PHP "chuncked" liest, dann über output buffer schrittweise ausgibt. Entsprechend wären natürlich dann noch eine "Prüffunktion" notwendig, die nötigenfalls via sleep DL-Speed drosselt (aber meist resultiert dies in timeouts und anderen nervigen Downloadfehlern.)

http://cn2.php.net/manual/en/function.readfile.php#48683

Was ich allerdings nicht weiss, ist, wie das ganze ist wenn du im Header die Filesize (evtl. mit "provisorischer" Filesize?) nicht übermittelst? Meine Vorposter haben dieses Problem ja bereits angesprochen.

Unlimiter
14.05.2017, 12:43
Ja, es funktioniert mit diesem Snippet auf die Weise in bestimmten Fällen. Wenn du die Größe der Datei nicht angibst, ist kein Fortschritt zu lesen (Download startet anstelle der "xx von xx geladen"). Die Datei wird aber geladen. Das Problem ist aber weniger die fehlende Fortschritt-Anzeige (bei großen Files werden die Leute trotzdem durchdrehen und abbrechen).

Viel mehr sind folgende Punkte ein Problem:

Die Datei kommt nicht komplett an (z.B. wird zu langsam geschrieben, aber zu schnell gelesen oder der eine Prozess kommt seltener an die Reihe als der andere)
Irregulärer Name bei Zip-Files während der Erstellung
Eventuell vorhandenes Mutex beim Erstellen eines Files, dass Zugriffe während des Schreibens auf die Datei nicht zulässt
usw.


Davon abgesehen ist die Empfehlung der Nutzung "sleep" extrem schlecht. Immerhin sorgt es dafür, dass die maximale Laufzeit des Scripts erreicht wird, ohne das getan zu haben was es sollte. Eine Sekunde zu pausieren, ist schon ein enormer Wert. Ein usleep sollte reichen.

Dementsprechend muss man sich übrigens um die Laufzeit kümmern, die man entweder unlimitiert gestalten oder ständig um x Sekunden erhöhen muss.

webmaster1337
14.05.2017, 22:21
Ja, es funktioniert mit diesem Snippet auf die Weise in bestimmten Fällen. Wenn du die Größe der Datei nicht angibst, ist kein Fortschritt zu lesen (Download startet anstelle der "xx von xx geladen"). Die Datei wird aber geladen. Das Problem ist aber weniger die fehlende Fortschritt-Anzeige (bei großen Files werden die Leute trotzdem durchdrehen und abbrechen).

Viel mehr sind folgende Punkte ein Problem:

Die Datei kommt nicht komplett an (z.B. wird zu langsam geschrieben, aber zu schnell gelesen oder der eine Prozess kommt seltener an die Reihe als der andere)
Irregulärer Name bei Zip-Files während der Erstellung
Eventuell vorhandenes Mutex beim Erstellen eines Files, dass Zugriffe während des Schreibens auf die Datei nicht zulässt
usw.


Davon abgesehen ist die Empfehlung der Nutzung "sleep" extrem schlecht. Immerhin sorgt es dafür, dass die maximale Laufzeit des Scripts erreicht wird, ohne das getan zu haben was es sollte. Eine Sekunde zu pausieren, ist schon ein enormer Wert. Ein usleep sollte reichen.

Dementsprechend muss man sich übrigens um die Laufzeit kümmern, die man entweder unlimitiert gestalten oder ständig um x Sekunden erhöhen muss.

Die maximale Laufzeit kann mit set_time_limit(0) auf unendlich lang gesetzt werden. Aber das mit dem usleep ist echt hilfreich, kannte diese Funktion bis anhin noch nicht :)

fritzi
14.05.2017, 23:20
Und ich dachte schon meine Ideen sind schon immer schräg.

Auf jeden Fall ist die Überschrift "PHP Entwickler für einfache Aufgabe" Krass gelogen ;)

Ich glaube nicht das du das mit PHP zufriedenstellen lösen kannst, die Ansätze sind einfach alle zu fehleranfällig und Fricklig.

Du solltest die Files aufteilen (zb in 1Mb Häppchen) und dir jemand suchen der dir ein Tool schreibt um sie zu downloaden und zusammenzufügen. Das dürfte wesentlich einfacher gehen als PHP zu vergewaltigen. So in der Art wie wir sie damals benutzt haben als Warez noch bei Geocities und Co lag. (Mir fällt gerade der Name der Tools nicht mehr ein)

darkness
15.05.2017, 05:14
Sollte doch möglich sein per Stream die Datei an den User zu senden. Sprich einfach Chunks zu senden. Eventuell ist PHP die falsche "Sprache" dafür? Wirf doch mal ein Auge auf (fancy) nodejs. Würde mir jetzt einfallen.

Unlimiter
15.05.2017, 05:42
Die maximale Laufzeit kann mit set_time_limit(0) auf unendlich lang gesetzt werden

Nein. Laufzeit kann mit set_time_limit(0) wird die genutzte Laufzeit zurück auf 0 gesetzt. Dadurch wird die max_execution_time nicht erreicht. Würde die Laufzeit unendlich lange gesetzt werden können, müsste die Funktion auch nur einmal aufgerufen werden. Auch wenn ich denke, zu wissen was du meinst, ist es aus technischer Sicht eine große Differenz.

Ansonsten weiß ich nicht, ob es sinnvoll ist noch ein zusätzlich Tool für den Download schreiben zu lassen. Die Datei in Blöcke aufzuteilen ist natürlich immer eine schlaue Idee, um so zwar nicht die Fehleranfälligkeit bei der Übertragung, aber zumindest die nachzuladenden Daten zu verringern. Wobei ein eigenes Tool natürlich die Koordination zwischen den einzelnen Downloads und möglicherweise benötigten Re-Downloads steuern könnte.

Das Problem ist ja, dass selbst wenn wir davon ausgehen, dass Blöcke angelegt werden, frühestens bei der beendeten Erstellung eines Blockes alle benötigten Headerdaten korrekt vorliegen.

The ZIP Archive File Format (http://www.fileformat.info/format/zip/corion.htm)

Dasselbe wäre auch bei RAR der Fall.

Ein Tool kann natürlich den Download dann pausieren, bis der fertige Block vorliegt, weswegen die kleine Größe auch wichtig wäre. Ja, bei näherer Überlegung ist das die sauberste Art die angegebene Aufgabenstellung (mit sehr geringen Infos) zu lösen.

@Sponge: Es geht bei großen Dateien, die keine Streamdatei darstellen aber darum, dass die Daten auch korrekt beim User ankommen. Bei einem Stream von Videos oder Musik wäre es ohne Probleme möglich, da hier nicht erwartet wird, dass ein paar gekippte Bits falsche Darstellungen produzieren. Wir haben hier aber eine Datei (unabhängig des Formats), welches geschickt werden soll. Außerdem sollte man beachten, dass User keine Lust haben eine 1 - mehrere GB große Datei zu laden, die dann korrupt ist.

// + fritzis Möglichkeit würde in gewissen Rahmen erlauben die Downloadgeschwindigkeit trotz allem mitzugestalten. Abhängig davon welcher Block gesendet wird und mit den zur Verfügung gestellten Daten im Header kann in gewissen Rahmen bestimmt werden, was der "optimale" DL-Speed relativ zum Erstellungsvorgang ist.

Kurze Anmerkung: Du streamst Daten immer. Auch ein Download streamt Bits.

Nimbus
15.05.2017, 12:47
Der User ist inaktiv. Die Diskussion also etwas obsolet. Da ich allerdings gerne doof rumdiskutiere schreib ich doch mal was :P

Es ist meiner Meinung nach etwas unklar woran die Download Geschwindigkeit angepasst werden soll. Ich tippe mal auf das "maximal mögliche" (alles was schon verfügbar ist wird geladen) oder an "Die Geschwindigkeit mit der die Datei erstellt wird".
Ohne zu wissen, wie sich die Datei beim Erstellen entwickelt ist das natürlich schwer. Ich bin jetzt ehrlich gesagt davon ausgegangen, dass bereits geschriebene Bits sich nicht mehr ändern und einfach je nach Bedarf/Verfügbarkeit durch gereicht werden können. Wenn die Datei tatsächlich von vorne bis hinten sequenziell geschrieben wird, dann sollte die Aufgabe so lösbar sein.

HaZe
15.05.2017, 18:14
Nein. Laufzeit kann mit set_time_limit(0) wird die genutzte Laufzeit zurück auf 0 gesetzt. Dadurch wird die max_execution_time nicht erreicht. Würde die Laufzeit unendlich lange gesetzt werden können, müsste die Funktion auch nur einmal aufgerufen werden. Auch wenn ich denke, zu wissen was du meinst, ist es aus technischer Sicht eine große Differenz.
Muss sie auch nur. Du hast aber prinzipiell für alle Parameter außer 0 nicht unrecht.
https://www.szenebox.org/images/_imported/2017/05/40.jpg
PHP: set_time_limit - Manual (http://php.net/manual/de/function.set-time-limit.php)

skreutzer
17.05.2017, 12:00
Ich würde das mit AJAX probieren, um den Timeout des PHP-Hosters zu umgehen. Der Client wartet dann halt dazwischen und teilt dem Server anschließend mit, wie viele Bytes bereits geladen wurden. Der Server schaut nach, ob mittlerweile ein neuer Chunck/Block bereitsteht oder meinetwegen auch, was die neue Dateigröße ist, und liefert den aus. Wenn der Server die Datei schneller schreibt als der Downloader, könnte natürlich auch die Chunk-Größe erhöht werden (solange sie nicht gegen das PHP-Timeout stößt) oder die Wartezeit beim Client heruntergehandelt werden. Problem könnte allerdings sein: wohin mit den heruntergeladenen Daten? JavaScript darf ja vermutlich nicht einfach irgendwo im Dateisystem schreiben, und gut, man könnte die Daten in den WebStorage des Browsers schreiben, aber der hat möglicherweise auch ein Größenlimit und das Problem bleibt weiter ungelöst: wie kann man dem Nutzer in JavaScript einen "Speichern-Unter"-Dialog bieten, der dann die Daten vom WebStorage in den gewünschten Zielpfad kopiert? Und letztendlich käme dieser Kopiervorgang am Schluss noch dazu, obwohl die Daten lokal ohnehin schon vorliegen.

wat
17.05.2017, 13:57
Und wieder einige Dinge gelernt hier :emoji51:

fritzi
17.05.2017, 16:41
...aber der hat möglicherweise auch ein Größenlimit und das Problem bleibt weiter ungelöst:

Nicht nur möglicherweise. Das wird so nichts ;)

badloader
01.06.2017, 21:01
Ich würde ja sagen, dass webtorrent.io das Richtige ist, aber das wäre auch gelogen, weil es nicht möglich ist die Chunks im Voraus zu berechnen, solange wir den Inhalt der Datei nicht kennen.

Stream buffern geht schon, wird aber wirklich immer Ärger mit Timeouts machen... Sehr interessante Frage