Nagy fájlok letöltése PHP cURL segítségével
2021-09-27T13:17:40+02:00
2021-10-24T14:48:29+02:00
2022-08-12T05:10:28+02:00
*deleted_23419333
Sziasztok!

Ez működik:

<?php function browser( $opt = array() ) { $cu = curl_init(); curl_setopt( $cu, CURLOPT_URL, $opt [ 'URL' ] ); curl_setopt( $cu, CURLOPT_USERAGENT, $opt [ 'User-Agent' ] ); curl_setopt( $cu, CURLOPT_RETURNTRANSFER, 1 ); if( array_key_exists( 'login', $opt ) && $opt [ 'login' ] == 'default' ) { curl_setopt( $cu, CURLOPT_HTTPAUTH, CURLAUTH_BASIC ); curl_setopt( $cu, CURLOPT_USERPWD, $opt [ 'User Name' ] . ':' . $opt [ 'Password' ] ); } else {} curl_setopt( $cu, CURLOPT_COOKIEFILE, $opt [ 'COOKIEFILE' ] ); curl_setopt( $cu, CURLOPT_COOKIEJAR, $opt [ 'COOKIEFILE' ] ); $html = curl_exec( $cu ); curl_close( $cu ); return $html; } $html = browser( array( 'URL'=> 'https://*.com/mp4/', 'User-Agent'=> 'Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0', 'COOKIEFILE'=> 'cookie.txt', 'login'=> 'default', 'User Name'=> 'u', 'Password'=> 'p' ) ); ?>

Ebből a $html változóból a DOMDocument osztállyal kinyerem a letölteni kívánt nagy méretű fájl URL címét, ami:

$URL = 'https://*.com/mp4/fajl.mp4';

Hogyan tudnám letölteni a szerverre ezt a nagy méretű fájlt a cURL segítségével?

A downloads mappába szeretném letölteni és a fájl neve legyen fajl.mp4 helyett: 2021.mp4

Nyilván nem egy fájlról van szó, de ha már egy sikerülne, akkor a többire rájövök.

Két problémám van:

1. A fájl túl nagy, így attól tartok, hogy időtúllépés miatt megszakadhat a letöltés.

2. A file_get_contents függvény azért nem jó mert a fájl letöltéséhez is be kell jelentkezni, tehát kell a cURL, amivel viszont ezt nem tudom megvalósítani.

Ha lehet, akkor a fenti browser függvényt kiegészítve szeretném letölteni a fájlt, de ehhez nem ragaszkodom annyira mert utólag ezt már szerintem megtudnám oldani.

Egy cPanel-es tárhelyen szeretném ezt megoldani, amihez van WHM hozzáférésem is, de ez utóbbit még sose használtam, így nem értek hozzá.
Mutasd a teljes hozzászólást!
Az idővel kapcsolatban: nem webről, hanem parancssorból kellene hajtanod a php-t. (Itt már valakinek sikerült cpanel alól is).

Nem biztos, hogy jó ötlet az egészet egy darabban letölteni a memóriába, különösen web oldalon ott is lehetnek php korlátok. Nézz szét a CURLOPT_FILE vagy CURLOPT_READFUNCTION tájékán.

A szerverek nagy részénél tudsz Range fejlécet használni, hogy csak a fájl egy részét kérd el egyszerre. Alternatív megoldásként megteheted, hogy egy futtatáskor csak pár megabájtot hozol el, azt hozzáfűzöd a már letöltött fájlhoz. Aztán újra futtatod az egészet, amíg meg nem érkezik a teljes fájl.
Mutasd a teljes hozzászólást!

  • Kiegészítettem a függvényt:

    function browser( $opt = array() ) { // ... curl_setopt( $cu, CURLOPT_COOKIEJAR, $opt [ 'COOKIEFILE' ] ); if( array_key_exists( 'download', $opt ) && $opt [ 'download' ] == true ) { $fp = fopen( dirname( __FILE__ ) . '/2021.mp4', 'w+' ); curl_setopt( $cu, CURLOPT_TIMEOUT, 50 ); curl_setopt( $cu, CURLOPT_FILE, $fp ); } else {} $html = curl_exec( $cu ); curl_close( $cu ); if( array_key_exists( 'download', $opt ) && $opt [ 'download' ] == true ) { fclose( $fp ); } else {} return $html; }

    Így már tudok letölteni (kisebb fájlokat):

    $file = browser( array( 'URL'=> 'https://*.com/mp4/fajl.mp4', 'User-Agent'=> 'Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0', 'COOKIEFILE'=> 'cookie.txt', 'login'=> 'default', 'User Name'=> 'u', 'Password'=> 'p', 'download'=> true ) );

    A nagyobb fájlokat is hamarosan megpróbálom. Addig ha van észrevétel, javaslat... Köszönöm!
    Mutasd a teljes hozzászólást!
  • Egy nagyobb, 373.4 MB-os fájlból csak 236.1 MB-ot tudtam letölteni, pedig próbáltam a fájl elejére írni:

    <?php set_time_limit( 0 ); function browser( $opt = array() ) { // ...

    Illetve ez sem oldja meg a problémát mert kevesebb mint 50 másodpercig fut csak a PHP:

    curl_setopt( $cu, CURLOPT_TIMEOUT, 50 );

    Körülbelül 20 másodpercig fut, 50 helyett.
    Mutasd a teljes hozzászólást!
  • Az idővel kapcsolatban: nem webről, hanem parancssorból kellene hajtanod a php-t. (Itt már valakinek sikerült cpanel alól is).

    Nem biztos, hogy jó ötlet az egészet egy darabban letölteni a memóriába, különösen web oldalon ott is lehetnek php korlátok. Nézz szét a CURLOPT_FILE vagy CURLOPT_READFUNCTION tájékán.

    A szerverek nagy részénél tudsz Range fejlécet használni, hogy csak a fájl egy részét kérd el egyszerre. Alternatív megoldásként megteheted, hogy egy futtatáskor csak pár megabájtot hozol el, azt hozzáfűzöd a már letöltött fájlhoz. Aztán újra futtatod az egészet, amíg meg nem érkezik a teljes fájl.
    Mutasd a teljes hozzászólást!
  • Nem biztos, hogy jó ötlet az egészet egy darabban letölteni a memóriába...

    Hogy érted azt, hogy a memóriába? Nem a HDD-re/SSD-re kerül?
    Mutasd a teljes hozzászólást!
  • Hogy érted azt, hogy a memóriába? Nem a HDD-re/SSD-re kerül?

    Végül oda, de a te megoldásodnál a CURLOPT_RETURNTRANSFER miatt egy változóba is ($html), ami ugye a memóriában van.
    Mutasd a teljes hozzászólást!
abcd