Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 06/11/11 в 12:17 |
Собственно хотел уточнить, у меня есть список файлов, которые находятся на удаленном сервере, мне нужно их перетянуть к себе на комп.
Это можно сделать функцией сору( ) или это только ей и делается???
|
|
|
|
С нами с 27.09.03
Сообщения: 5454
Рейтинг: 2506
|
Добавлено: 06/11/11 в 12:24 |
да вроде пишут что можно copy юзать
но если на локальный комп и файлы большие то имхо проще список в флешгет забить
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 06/11/11 в 12:29 |
не, тут задачу себе поставил что нужно тянуть изображения по списку, затем их переименовывать и сохранять у себя.
Т.е. там все по алгоритму, чтоб каждое изображение принадлехало своему хтмл файлу
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 06/11/11 в 12:36 |
как-то так
Код: | $content = file_get_contents('http://master-x.com/img/1.jpg');
file_put_contents('img/html1.jpg', $content); |
|
|
|
|
С нами с 27.09.03
Сообщения: 5454
Рейтинг: 2506
|
Добавлено: 06/11/11 в 12:50 |
ibiz писал: | как-то так
Код: | $content = file_get_contents('http://master-x.com/img/1.jpg');
file_put_contents('img/html1.jpg', $content); | |
я тоже сразу про file_get/put_contents подумал, но почитал мануал по copy, и собственно оно то же самое делает оказывается
хз как внутри копи работает, но возможно не держит весь файл в памяти в отличие от file_get_contents, надо будет как-нибудь самому воспользоваться.
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 06/11/11 в 12:59 |
наткнуля на то что не рекомендуют file_get_contents()
читать тут
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 06/11/11 в 13:06 |
Lexikon писал: | наткнуля на то что не рекомендуют file_get_contents()
читать тут |
не загружается ссылка, гугель выдал вот что:
Цитата: |
Почему нельзя использовать fopen, file_get_contents при работе с HTTP
Как мы знаем, fopen, file, file_get_contents могут принимать в качестве параметра URL удаленного файла. НО использование этих функций не правильно, и вот почему:
1. Эти функции работают с удаленными хостами толдько при включенной директиве allow_url_fopen в php.ini (установить эту директиву в .htaccess или скрипте нельзя). Как правило хостеры ее отключают. По крайней мере умные.
2. fopen не имеет параметра тайм-аута, что самое важное,т.к. в случае если сайт не отвечает или тяжело отвечает, скрипт может легко "подвиснуть".
3. Если где-то используется fopen и случайно пропущена обработка возможности ошибочного входного параметра, то может быть XSS или переполнения буфера.
4. Нет возможности указать порт, по которому необходимо соединиться с сервером.
5. Лишние операции, т.к. тот же fopen вызывать будет сокеты. Зачем использовать сверх функции?
Что же использовать?
http://php.net/fsockopen
http://php.net/sockets |
по всем пунктам для file_get_contents нашел только allow_url_fopen в php.ini
если уж совсем хочется, правильно-правильно сделать, то юзай curl
|
|
|
|
С нами с 27.09.03
Сообщения: 5454
Рейтинг: 2506
|
Добавлено: 06/11/11 в 13:15 |
Lexikon писал: | наткнуля на то что не рекомендуют file_get_contents()
читать тут |
бред теоретиков, не читай такое
особенно умилило
Цитата: | 5. Лишние операции, т.к. тот же fopen вызывать будет сокеты. Зачем использовать сверх функции? |
ответ: потому что работа с сокетами требует 10 строк кода а file_get_contents - одну.
единственное толковое замечание про таймауты, но насколько я помню из опыта, они так же глючат и при работе с сокетами.
так что совсем правильно как заметил ibiz будет юзать curl.
но не надо стрелять из пушки по воробьям.
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 06/11/11 в 13:26 |
grozny писал: |
единственное толковое замечание про таймауты, но насколько я помню из опыта, они так же глючат и при работе с сокетами.
|
вообщето file_get_contents поддерживает таймауты, про глюки это отдельная тема
Код: | string file_get_contents ( string $filename [, bool $use_include_path = false [, resource $context [, int $offset = -1 [, int $maxlen ]]]] )
|
Код: |
$ctx = stream_context_create(array(
'http' => array(
'timeout' => 1
)
)
);
file_get_contents("http://example.com/", 0, $ctx);
|
|
|
|
|
С нами с 27.09.03
Сообщения: 5454
Рейтинг: 2506
|
Добавлено: 06/11/11 в 13:28 |
ibiz писал: | вообщето file_get_contents поддерживает таймауты, про глюки это отдельная тема
|
и правда... я просто на них забил т.к. они у меня ни разу не работали
пробую с периодичностью раз в 3 года
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 06/11/11 в 13:38 |
ясненько, мне собственно не на сервер ставить, а у себя на локалке работать чтоб облегчить некоторые замарочки.
|
|
|
|
Добрых Дел Мастер
С нами с 03.05.08
Сообщения: 3143
Рейтинг: 1227
|
Добавлено: 06/11/11 в 13:42 |
не придумывай лишнего. возьми Zend_Http
Zend_Loader::loadClass('Zend_Http_Client');
public function download_upload($url) {
$client = new Zend_Http_Client();
$client->setConfig($GLOBALS['proxy_setting']);
$client->setHeaders($GLOBALS['headers_setting']);
$client->setCookieJar();
try {
$client->setUri($url);
$response = $client->request();
} catch (Zend_Uri_Exception $exc) {
echo $exc->getMessage();
return;
} catch (Exception $exc) {
echo $exc->getMessage();
return;
}
$img_src = $response->getBody();
if(
$response->isSuccessful()
AND
preg_match("~image~is", $response->getHeader('Content-Type')) == 1
) {
$imagetype = $response->getHeader('Content-Type');
preg_match("~.*/(.*)~is", $imagetype, $type);
$filename = md5(uniqid('', TRUE)) . '.' . $type[1];
file_put_contents($filename, $img_src, FILE_USE_INCLUDE_PATH);
}
}
ну тут я с картинками работал. поправишь как тебе надо. глобальные массивы сделаешь локальными. они такого плана
$headers_setting = array(
'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language' => 'ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3',
'Accept-Encoding' => 'gzip,deflate',
'Accept-Charset' => 'windows-1251,utf-8;q=0.7,*;q=0.7',
);
$proxy_setting = array(
'useragent' => 'any random',
'keepalive' => TRUE,
'strictredirects' => TRUE,
'timeout' => 600,
'sslusecontext' => TRUE,
'adapter' => 'Zend_Http_Client_Adapter_Curl',
'curloptions' => array(
#CURLOPT_PROXY => '127.0.0.1',
#CURLOPT_PROXYPORT => 9050,
#CURLOPT_HTTPPROXYTUNNEL => TRUE,
#CURLOPT_SSL_VERIFYPEER => 0,
#CURLOPT_PROXYTYPE => CURLPROXY_SOCKS5,
),
);
|
|
пришел к победе коммунистического труда
|
6
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 06/11/11 в 13:53 |
FXIX писал: | не придумывай лишнего. возьми Zend_Http
|
|
|
|
|
Добрых Дел Мастер
С нами с 03.05.08
Сообщения: 3143
Рейтинг: 1227
|
Добавлено: 06/11/11 в 14:05 |
смешного мало . пусть привыкает к хорошему
|
|
пришел к победе коммунистического труда
|
6
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 06/11/11 в 14:07 |
Спасибо конечно, но куда я его приткну, зенда у меня нет. Апач стоит, и впринципе то что мне нужно на меньшее количество строк выйдет, я сейчас еще туда впихну изменение размера и попробую это всё прикрутить к прошлому скрипту чтоб я уже задание через форму давал. Посмтрим что выйдет.
И так же не интересно, сразу взять готовое, я сначала с малого, хоть поизучаю простые функции.
|
|
|
|
С нами с 27.09.03
Сообщения: 5454
Рейтинг: 2506
|
Добавлено: 06/11/11 в 14:21 |
FXIX: отжог простотой
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 06/11/11 в 14:29 |
Код: | $remote = "http://remote-server.com/image.jpg";
$local = "local-path/image.jpg";
if( get_file($remote, $local) ) {
echo 'file saved.';
}
else {
echo 'something went wrong.';
} |
Код: [развернуть] | function get_file( $remote, $local ) {
$host = parse_url( $remote, PHP_URL_HOST );
$path = parse_url( $remote, PHP_URL_PATH );
$file_pointer = fsockopen( $host, 80, $errno, $errmsg, 30 );
if( !$file_pointer ) {
echo "Can't connect to ".$host."\n";
return false;
}
fwrite( $file_pointer, "GET ".$path." HTTP/1.1\r\nHost: ".$host."\r\nConnection: Close\r\n\r\n" );
$response= "";
while( ! feof( $file_pointer ) ) {
$response.= fgets( $file_pointer, 4096 );
}
fclose( $file_pointer );
$neck = strpos( $response, "\r\n\r\n" );
$head = substr( $response, 0, $neck );
$body = substr( $response, $neck + 4 );
$lines = explode( "\r\n", $head );
preg_match( '/HTTP\/(\\d\\.\\d)\\s*(\\d+)\\s*(.*)/', $lines[ 0 ], $m );
$status = $m[ 2 ];
if( $status == 200 ) {
file_put_contents( $local, $body );
return( true );
} else {
return( false );
}
} |
|
|
|
|
Добрых Дел Мастер
С нами с 03.05.08
Сообщения: 3143
Рейтинг: 1227
|
Добавлено: 06/11/11 в 14:33 |
Lexikon писал: | Спасибо конечно, но куда я его приткну, зенда у меня нет. |
зенд скачай. там либ http://framework.zend.com/manual/en/reference.html под 100% твоих пхп задач. и на 10 лет вперед. ты все равно к нему придешь. лучше раньше.
Lexikon писал: |
И так же не интересно, сразу взять готовое, я сначала с малого, хоть поизучаю простые функции. |
ну можешь сокеты пописать и через wireshark заголовки поснифать . послушать что шепчет браузер апачу, и что в ответ апач говорит браузеру.
ты или пишешь код, или юзаешь инструмент. инструмент выглядит так:
подключаем класс Zend_Http_Client через автолоадер. к автолоадерам ты придешь
Zend_Loader::loadClass('Zend_Http_Client');
пишем конфиг браузера. к этому ты придешь когда начнешь писать парсеры и грабилки
$client->setConfig(
юзерагент
авторедирект
прокси
);
$client->setHeaders(
кодировки
чарсеты
тип контента
итд
);
ставим "липкие" куки. к этому ты придешь сразу же на любом первом вебсервисе. или регалке. когда сквозь 6 редиректов через js будет прилетать 33 куки
$client->setCookieJar();
выставляем сам урл
$client->setUri($url);
отправляем и перехватываем ошибки
$response = $client->request();
этим ловим неправильные\несуществующие урлы и вообще любую блевотину и отрыжку апача (коды и слова ответа может покурить. надоест тебе)
Zend_Uri_Exception $exc
это сам файл. в переменной.
$img_src = $response->getBody();
если сервер ответил 200 Ok (он может все что угодно ответить. у бога дней много. невозбраняется ебаться вручную)
$response->isSuccessful()
ну остальное там по картинке.
парсим полученный заголовок Content-Type
$response->getHeader('Content-Type')
получаем расширение картинки. например .png
preg_match("~.*/(.*)~is", $imagetype, $type);
генерим уникальное имя файла в каталоге
$filename = md5(uniqid('', TRUE)) . '.' . $type[1];
пишем файл
file_put_contents($filename, $img_src, FILE_USE_INCLUDE_PATH);
Сложного тут ничего нет. зато 50вмз-шные скрипты ты будешь писать за 5 минут. вместо 50 . Т.к. зенд пишут люди гораздо умнее всех нас вместе взятых - ты получаешь возможность просто писать, а не ебаться
|
|
пришел к победе коммунистического труда
|
7
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 06/11/11 в 14:39 |
так зенд платный ведь, или я немного не понял что именно мне сделать.
Кстати для работы зенда апач ведь тоже нужен???
Нашел у себя на старом бесплатном диске , зенд 5.5.1.282 незнаю как он будет правда работать. Или проще последнюю купить, я смотрю ее сейчас везде рекламят.
|
|
|
|
С нами с 27.09.03
Сообщения: 5454
Рейтинг: 2506
|
Добавлено: 06/11/11 в 14:57 |
имеется в виду бесплатный Zend Framework - пхпшный фреймворк, к которому конечно нужен апач и собственно пхп)
есть еще Zend Server - виндовая софтина, которая инсталит тебе сразу и Zend Framework, и апач и пхп.
но она вроде тоже бесплатная.
но я по прежнему думаю что это мазохистский геморой для задач такого уровня
|
|
|
|
С нами с 01.04.07
Сообщения: 4378
Рейтинг: 2970
|
Добавлено: 06/11/11 в 15:30 |
Zend Framework и жаваскриптовые куки читает?
Хотя, даже и если - нафига такой трактор?
То же на курле ($url, $ref, $dest - адрес картинки, реф сайта - можно тот же что и адрес, путь для сохранения):
Код: |
function refcopy($url, $ref, $dest)
{
$user_agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)';
$headers = array('Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/msword, application/x-matrix, */*', 'Accept-Language: en-us', 'Connection: keep-alive');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_REFERER, $ref);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close ($ch);
file_put_contents($dest, $result);
return true;
}
|
Конечно, заголовки не проверяет, но для 95% случаев достаточно.
|
|
|
|
Добрых Дел Мастер
С нами с 03.05.08
Сообщения: 3143
Рейтинг: 1227
|
Добавлено: 06/11/11 в 15:38 |
grozny писал: |
но я по прежнему думаю что это мазохистский геморой для задач такого уровня |
гемороя нет. в 99% случаев можно все оставить по-умолчанию.
require_once 'Zend_Http_Client';
$client = new Zend_Http_Client($url);
$response = $client->request();
$img = $response->getBody();
file_put_contents('filename', $img);
смысл то в другом совсем.
|
|
пришел к победе коммунистического труда
|
7
|
|
|
С нами с 27.09.03
Сообщения: 5454
Рейтинг: 2506
|
Добавлено: 06/11/11 в 15:45 |
FXIX писал: | гемороя нет. в 99% случаев можно все оставить по-умолчанию.
require_once 'Zend_Http_Client';
$client = new Zend_Http_Client($url);
$response = $client->request();
$img = $response->getBody();
file_put_contents('filename', $img); |
о чем я и говорю, в 99% случаев это заменяется на copy($url, 'filename');
чья-то умная мысль - все вещи надо делать настолько просто, насколько это возможно, но не проще
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 06/11/11 в 16:07 |
ТС надо перекидать самосвал песка, а ему предлагают использовать грейдер для карьеров вместо лопаты... уверен даже ошибка на таймаут не пригодится, ну не пиздец ли
|
|
|
|
Добрых Дел Мастер
С нами с 03.05.08
Сообщения: 3143
Рейтинг: 1227
|
Добавлено: 06/11/11 в 16:21 |
таймаут пригодится если работа идет через цепочку. к примеру через TOR
|
|
пришел к победе коммунистического труда
|
6
|
|
|