Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Удаленная скачка.
 
 автор: Лена Смирнова   (17.08.2009 в 01:43)   письмо автору
 
 

Помогите решить задачку, я использую copy для скачки к себе на сервер файл с удаленного сервера, но вот в чем беда, в момент скачки файла сервер может стать не доступным и тогда например сохраняется пол фильма, как можно решить подобную проблему, что, если файл загрузился не весь, то не сохранять его.

  Ответить  
 
 автор: Fractured   (17.08.2009 в 02:41)   письмо автору
 
   для: Лена Смирнова   (17.08.2009 в 01:43)
 

Загружать через curl (это не страшно! :] ). Тогда там сможете получить ошибку, вероятнее всего CURLE_PARTIAL_FILE (18), означающую, что файл пришёл более маленький, чем ожидался, то есть загрузка произошла не до конца.

  Ответить  
 
 автор: Лена Смирнова   (17.08.2009 в 03:09)   письмо автору
 
   для: Fractured   (17.08.2009 в 02:41)
 

А конкретней примером можно?
Как сделать, что если есть ошибка, не сохранять файл или удалить не до конца загруженный файл

  Ответить  
 
 автор: а-я   (17.08.2009 в 05:21)   письмо автору
 
   для: Лена Смирнова   (17.08.2009 в 01:43)
 

Можно так поступить, если не хотите переходить на курл, сокет.
Что-то в этом роде.

<?

$url 
''// адрес файла

$headers get_headers($url1);

    if(
$headers['Content-Length'] > && $headers['Content-Type'] != 'text/html') {
    
// копируем файл, $file -наш файл
    
        
if($headers['Content-Length'] != filesize($file)) {
        
// удаляем не докаченный файл
        
        
echo 'Нас обломали!';
        }

    } 
    else echo 
'Файл не найден!';

?>

  Ответить  
 
 автор: Лена Смирнова   (17.08.2009 в 16:23)   письмо автору
 
   для: а-я   (17.08.2009 в 05:21)
 

Делаю так:

<?
if(!file_exists($newname))
{
Copy($url"".$newname);




$headers get_headers($url1);
if(
$headers['Content-Length'] != filesize($newname))
{
echo 
"error";
unlink("$newname");
exit();
}
?>


Но скрипт просто завершается по таймауту и не доходит до строчек проверки размера.
Есть еще советы?

  Ответить  
 
 автор: а-я   (17.08.2009 в 18:43)   письмо автору
 
   для: Лена Смирнова   (17.08.2009 в 16:23)
 

ну) фильм за 30 сек не скачать)

Вам обязательно это сделать через PHP? Эт же нагрузка большая! Целый процесс апача буит занят, пока фильм не докачается.

может эт дело отдавать серверу? есть такая возможность?

а на php сделать простое обновление и проверку докачки файла.

  Ответить  
 
 автор: а-я   (17.08.2009 в 18:53)   письмо автору
 
   для: Лена Смирнова   (17.08.2009 в 16:23)
 

может как-то так делать? хммм...

<?
$GLOBALS
['url'] = $url;
$GLOBALS['newname'] = (string) $newname;

    if(!
file_exists($GLOBALS['newname'])) {

    
register_shutdown_function('is_fullfile');

    
Copy($GLOBALS['url'], $GLOBALS['newname']); 

    }




function 
is_fullfile() {

$headers get_headers($GLOBALS['url'], 1);

    if(
$headers['Content-Length'] != filesize($GLOBALS['newname']))
    
unlink($GLOBALS['newname']);

}

?>

  Ответить  
 
 автор: Лена Смирнова   (24.08.2009 в 16:44)   письмо автору
 
   для: а-я   (17.08.2009 в 18:53)
 

Опишите словами, что происходит в этом коде?

  Ответить  
 
 автор: Евгений Петров   (24.08.2009 в 16:57)   письмо автору
 
   для: Лена Смирнова   (24.08.2009 в 16:44)
 

Перед тем как начинаете качать файл запоминайте где то что вы начали его качать. А при успешном завершении убирайте этот флаг. А дальше каким то скриптом проверяйте периодически у каких файлов уже продолжительное время стоит флаг закачки и удаляйте эти файлы.

  Ответить  
 
 автор: Fractured   (24.08.2009 в 19:15)   письмо автору
 
   для: Евгений Петров   (24.08.2009 в 16:57)
 

Вообще-то shutdown-функция не вызывается, если тип завершающей ошибки Fatal error.

Извините, правильней адресовать не Вам.

  Ответить  
 
 автор: Лена Смирнова   (24.08.2009 в 23:26)   письмо автору
 
   для: Евгений Петров   (24.08.2009 в 16:57)
 

Спасибо, использую именно ваш метод!

  Ответить  
 
 автор: а-я   (24.08.2009 в 17:34)   письмо автору
 
   для: Лена Смирнова   (24.08.2009 в 16:44)
 

file_exists
register_shutdown_function
copy
get_headers
filesize
unlink

  Ответить  
 
 автор: Fractured   (24.08.2009 в 19:17)   письмо автору
 
   для: а-я   (24.08.2009 в 17:34)
 

Вообще-то shutdown-функция не вызывается, если тип завершающей ошибки Fatal error.

  Ответить  
 
 автор: а-я   (24.08.2009 в 20:11)   письмо автору
 
   для: Fractured   (24.08.2009 в 19:17)
 

завершение лимита - это Fatal error?

  Ответить  
 
 автор: Fractured   (24.08.2009 в 20:26)   письмо автору
 
   для: а-я   (24.08.2009 в 20:11)
 

Да

  Ответить  
 
 автор: а-я   (24.08.2009 в 20:34)   письмо автору
 
   для: Fractured   (24.08.2009 в 20:26)
 

манул о другом говорит, при зависании скрипта, как раз на эту функцию все ссылки.

  Ответить  
 
 автор: Fractured   (24.08.2009 в 21:21)   письмо автору
 
   для: а-я   (24.08.2009 в 20:34)
 

1. Покажите где Вы такое нашли (это надо делать сразу, чтобы не тратить время).
2. Сами бы проверили.
3. Разве было бы логичным позволять пользователю после завершения максимального времени выполнения скрипта выполнять ещё какой-то код?

  Ответить  
 
 автор: а-я   (25.08.2009 в 00:32)   письмо автору
 
   для: Fractured   (24.08.2009 в 21:21)
 

1)
читаем "внимание", красным выделено -
как я понял, если уснул скрипт.


2)

2009/8/21 Dmitry Koterov <dmitry.kote...@gmail.com> 

> register_shutdown_function'ом - нельзя (он не вызывается при fatal error). 

Вообще говоря вызывается: 

[weirdan@home ~]$ php -r '
function a() {var_dump(microtime(true), "sss");} 
register_shutdown_function("a"); var_dump(microtime(true)); qwe();


float(1250890575.7799) 

Fatal error: Call to undefined function qwe() in Command line code on line 1 
float(1250890575.7802) 
string(3) "sss" 
[weirdan@home ~]$ php -v 
PHP 5.2.8 (cli) (built: Dec 23 2008 17:27:24) 
Copyright (c) 1997-2008 The PHP Group 
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies 
[weirdan@home ~]$



пробуем сами

<?
function fun() {
echo 
'time: '.time();


register_shutdown_function('fun'); 
neizvestno();

echo 
'работает?';
?>


результат:

Fatal error: Call to undefined function neizvestno() in Z:\...\www\index.php on line 7
time: 1251145813

вроде фатальная ошибка и оборвалась работа после неизвестной функции neizvestno() ,
а функция fun() сработала.

  Ответить  
 
 автор: Fractured   (25.08.2009 в 01:23)   письмо автору
 
   для: а-я   (25.08.2009 в 00:32)
 

> 1)
> читаем "внимание", красным выделено -
> как я понял, если уснул скрипт.

Я не уловил Вашу мысль. Мы говорим об обратной ситуации, когда скрипт завершается преждевременно.

2) Да, интересно.

Но тем не менее, мы говорим о завершении скрипта по истечении максимального времени выполнения скрипта. Именно это попробуйте протестировать. А то это ближе к "в огороде бузина..."

  Ответить  
 
 автор: Fractured   (24.08.2009 в 19:18)   письмо автору
 
   для: Лена Смирнова   (24.08.2009 в 16:44)
 

-

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования