LINUX.ORG.RU

Какие опции добавить в php/curl?

 ,


0

1

wget -O file «url» --username=user --password=pass удачно скачивает zip файл размером 267478 байт. Файл нормально распаковывается с помощью unzip.

В то же время код на PHP/curl скачивает файл размером 402099 байт который не поддаётся распаковке. Чувствую тут какая то проблема с долбаным ftp binary/text transfer. Файл не распаковывается:

root@import:/var/www/lib/tmp/hui# unzip hui
Archive:  hui
error [hui]:  missing 68051554 bytes in zipfile
  (attempting to process anyway)
error [hui]:  start of central directory not found;
  zipfile corrupt.
  (please check that you have transferred or created the zipfile in the
  appropriate BINARY mode and that you have compiled UnZip properly)
root@import:/var/www/lib/tmp/hui#

Вот код на PHP/curl:

		while (true) {
			$fh = fopen($this->location, 'wb');
			if ($fh === false) {
				$this->errorType = '';
				$this->error = "Failed to create file {$this->location}";
				return false;
			}
			
			$ch = curl_init();
			
			if ($this->username !== '') {
				curl_setopt($ch, CURLOPT_USERPWD, urlencode($this->username).":".urlencode($this->password));
			}
			
			curl_setopt($ch, CURLOPT_URL, $url);
			curl_setopt($ch, CURLOPT_FILE, $fh);
			curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 100);
			curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
			if (curl_exec($ch) === false) {
				$this->errorType = 'url';
				$this->error = "Failed to fetch file: ".curl_error($ch);
				return false;
			}
			if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == 202) {
				fclose($fh);
				unlink($this->location);
				e("Received HTTP/202, waiting to retry...\n");
				sleep(5);
			} else {
				break;
			}
		}
		//e($url."\n");
		fclose($fh);

Подскажите какую опцию добавить что бы всё работало как надо?

PHP 5.4.41


Может, тупо таймаут срабатывает? Сколько закачка длится?

...

Часто и регулярно качаю бинарники CURL'ом (картинки, файлы) с кучи источников — никаких хитростей не было.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Файл то получается большего размера. Если бы таймаут тогда должен был быть наоборот меньше. Кроме того это CONNECTTIMEOUT т.е. на соединение. Прошу обратить внимание что надо качать по FTP а это очень хитрый протокол со множеством опций как например binary/text transfer.

mongo
() автор топика
Ответ на: комментарий от mongo

С CURLOPT_VERBOSE часть лога:

> PASV
< 227 Entering Passive Mode (194,115,88,80,177,102).
*   Trying 194.115.88.80...
* connected
* Connecting to 194.115.88.80 (194.115.88.80) port 45414
* FTP 0x17ea1a8 state change from PASV to STOP
* DO phase is complete
> TYPE I
* FTP 0x17ea1a8 state change from STOP to RETR_TYPE
< 200 Type set to I
> SIZE pricelist-2.txt.zip
* FTP 0x17ea1a8 state change from RETR_TYPE to RETR_SIZE
< 213 267478
> RETR pricelist-2.txt.zip
* FTP 0x17ea1a8 state change from RETR_SIZE to RETR
< 150 Opening BINARY mode data connection for pricelist-2.txt.zip (267478 bytes)
* Maxdownload = -1
* Getting file with size: 267478
* FTP 0x17ea1a8 state change from RETR to STOP
* DO-MORE phase ends with 0
* additional stuff not fine transfer.c:1037: 0 0
* nread <= 0, server closed connection, bailing
* Remembering we are in dir ""
< 226 Transfer complete
* Connection #0 to host paco.actebis.com left intact
> QUIT
* FTP 0x17ea1a8 state change from STOP to QUIT
< 221 Goodbye.
* FTP 0x17ea1a8 state change from QUIT to STOP
* Closing connection #0

Очень странно что в логе пишется корректный размер 267478 но в итоге получается файл с размером 402099, примерно в 1.5 раза больше.

mongo
() автор топика

возьми wireshark да глянь чего ему не хватает

kiotoze ★★★★
()
Ответ на: комментарий от mongo

А сервак что говорит, сколько он отдал?

drull ★☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.