PHP time_limit и рекурсия

12
A4
На сайте с 05.01.2012
Offline
55
2776

Предположим у пользователя на хостинге медленная скорость передачи данных. Ему треуется загрузить очень большой файл(до 100мб) средствами PHP. Сразу оговоримся что доступа к php.ini у нас нет и хостеру не нравятся выкрутасы вида:


set_time_limit(0);
function download_file_func(.....){
.....
};

Я подумал что в этом случае ситуацию спасет рекурсия(но я не уверен до конца). То есть мы разбиваем исходный файл на отрезки по 5МБ. После того как будет скачано 5МБ функция запишет эти данные в выходной файл и запустит сама себя еще раз скачав следующие 5МБ. И так до тех пор пока файл не будет скачан полностью. Можно даже в несколько потоков все организовать благо curl позволяет. Так вот прокатит ли такой механизм.

Следует учесть что за 30 секунд(время работы скрипта по умолчанию) 5 мегабайт файла загрузиться успевает, не смотря не фиговую скорость интернета.

Подскажите пожалуйста оно того стоит? В принципе я уже почти дописал функцию, но все-же душу грызут сомнения такого рода:

Дело в том что рекурсивная функция находится в одном и том-же скрипте(естесственно она же сама себя вызывает), а так как время исполнения скрипта - 30 сек - не зря ли я стараюсь?

IL
На сайте с 20.04.2007
Offline
435
#1
aftamat4ik:
а так как время исполнения скрипта - 30 сек - не зря ли я стараюсь?

так попробуйте =)

не писать много, а рекурсивную "болванку" запустить, которая 20 секунд "ждёт" и только потом себя вызывает... допустим 5 раз..

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
D
На сайте с 14.01.2007
Offline
153
#2
aftamat4ik:
не зря ли я стараюсь

зря:( вы правы насчёт "одного скрипта"

A4
На сайте с 05.01.2012
Offline
55
#3

Точно! сча попробую)

---------- Добавлено 25.02.2013 в 15:52 ----------

РАБОТАЕТ!!! Урааа)

Тестил вот этим:


single_rec(0);
echo "sucess";

function single_rec($i){
if($i<5){
sleep(20);
return single_rec($i+1);
}else return 0;
}


---------- Добавлено 25.02.2013 в 15:54 ----------

Есть у подобного подхода "подводные камни"?
IL
На сайте с 20.04.2007
Offline
435
#4
aftamat4ik:
РАБОТАЕТ!!! Урааа)
Тестил вот этим:

Эм.. а точно time_limit не нравится хостингу? :)

S
На сайте с 03.07.2009
Offline
41
#5

прописать в файле функцию которая на 29 секунде будет делать get запрос к самой себе и на этом заканчивать свою работу, предварительно записав результат работы в файл tmp, где писать на каком этапе завершил свою работу. При вызове самого себя читает конфиг из тмп и продолжает качать дальше. Как так, думаю можно реализовать данную задачу.

Кодинг на PHP. Разработка расширений под Joomla.
TF-Studio
На сайте с 17.08.2010
Offline
334
#6

а не проще хостера сменить?

сейчас их как грязи.

Всё ещё лучший способ заработка для белых сайтов: GoGetLinks (https://www.gogetlinks.net/?inv=fahbn8).
A4
На сайте с 05.01.2012
Offline
55
#7
TF-Studio:
а не проще хостера сменить?
сейчас их как грязи.

Не, не, в хостере дело. Дело в модуле который пишу. Не все же пользователи имеют скажем так безграничные ресурсы на своих хостингах и прочем => значит надо максимально оптимизировать код под среднестатического юзеря, который не хочет портить себе нервы общением с хостером, а хочет просто Результат.

В итоге приходится оптимизировать код под стандартизированный конфиг сервера...

ivan-lev:
Эм.. а точно time_limit не нравится хостингу?

Мне не нравится хД) Я вообще такой изврат стараюсь нигде кроме денвера не применять - не знаю почему, наверное интуиция...

sdaprel:
прописать в файле функцию которая на 29 секунде будет делать get запрос к самой себе и на этом заканчивать свою работу, предварительно записав результат работы в файл tmp, где писать на каком этапе завершил свою работу. При вызове самого себя читает конфиг из тмп и продолжает качать дальше. Как так, думаю можно реализовать данную задачу

На самом деле я и планировал сделать примерно это, просто вышеуказанный кусок кода доказал свою работоспособность и я не заморачиваюсь теперь хД

skAmZ
На сайте с 04.09.2009
Offline
122
#8
aftamat4ik:
РАБОТАЕТ!!! Урааа)
Тестил вот этим:

Вы зря радуетесь. sleep не включается в time_limit.

http://danilovonline.ru/druzhba-sleep-i-set_time_limit-v-php/

Милованов Ю.С
На сайте с 24.01.2008
Offline
196
#9

Провел эксперимент с рекурсией(php_value max_execution_time 5).


<?php
error_reporting(E_ALL);
sleep(4);
if ($_GET['i'] < 5)
{
echo $_GET['i']";
$_GET['i']++;
echo file_get_contents('http://127.0.0.1/test.php?i='.$_GET['i']);
}
?>

Запускаю скрипт с http://127.0.0.1/test.php?i=0

Ответы сервера:

без слипа: 01234

со слипом: 0 Fatal error: Maximum execution time of 5 seconds exceeded in C:\WebServer\Apache2.2\htdocs\test.php on line 8

ЗЫ. сервер стоит на винде, так что слип учитывается. Так что Ваша идея с рекурсией не проканает, так как срипт не заканчивает работу при вызове самого себя, а ждет ответ:)

Подпись))
siv1987
На сайте с 02.04.2009
Offline
427
#10
aftamat4ik:
Ему треуется загрузить очень большой файл(до 100мб) средствами PHP.

Так "загрузить" или все-таки скачать на сервер?

aftamat4ik:
Дело в том что рекурсивная функция находится в одном и том-же скрипте(естесственно она же сама себя вызывает), а так как время исполнения скрипта - 30 сек - не зря ли я стараюсь?

Зря. http://www.php.net/manual/ru/function.set-time-limit.php

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий