Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Ограничение по времени [2]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): « 1 [2]   

> Без описания
tuareg
Отправлено: 26 Июня, 2012 - 12:55:30
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




fdr21 пишет:
Что нам это дает, после завершение скрипта, через пару микросекунд, он снова себе же вызовет??? и так будет продолжатся сколько, бесконечно!!?

Можно сессию запустить. И если ничего нет, возврать exit в register_shutdown_function тогда рекурсия закончится
 
 Top
EuGen Администратор
Отправлено: 26 Июня, 2012 - 13:00:12
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




tuareg пишет:
А в самом скрипте PHP нельзя узнать?

Да конечно можно:

fdr21 пишет:
Что нам это дает, после завершение скрипта, через пару микросекунд, он снова себе же вызовет???

Когда скрипт завершает свою работу, вызывается функция register_shutdown_function. В момент, когда внутри нее произойдет вызов скрипта самим себя - да, будет на короткое время существовать две копии скрипта, и, чтобы не было двойной обработки, я добавил в начало скрипта вызов usleep(100) - 100мс вполне достаточно, чтобы скрипт, вызвавший своего "наследника", успел завершиться.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
tuareg
Отправлено: 26 Июня, 2012 - 13:42:01
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




К сожалению вариант с sistem не подойдет. На хостинге safe_mode=Off;
Есть ли другой вариант?
 
 Top
Zuldek
Отправлено: 26 Июня, 2012 - 13:51:04
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




tuareg пишет:
К сожалению вариант с sistem не подойдет. На хостинге safe_mode=Off;
Есть ли другой вариант?

пинайте его с внешки. Если есть по SSH доступ или банально http запросами, больше ничего не знаю. Кроном каждую минуту врятли разрешат скрипт пинать, раз у них такие настройки. В принципе если можно каждые 5 минут, то этот вариант вам тоже подходит: в ночь запускайте и все отработает нормально. Если раз в час, - уже хуже. Тогда имхо только запускать с внешки.
 
 Top
EuGen Администратор
Отправлено: 26 Июня, 2012 - 13:56:11
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Zuldek пишет:
Кроном каждую минуту

Крон только - да - самое большее - раз в минуту может. А речь о 20 секундах.

А изначальная задача - в чем? Может, она дискретизируема? То есть к примеру, нужно обработать N записей в БД. Занимает это M секунд (M>20); стало быть, разбивать нужно по floor(20*N/M) записей на 1 копию скрипта. И запускать не последовательно, а параллельно даже (ну или частично - скажем, по 5 секций за раз - это уж как ресурсы позволяют)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
tuareg
Отправлено: 26 Июня, 2012 - 14:07:39
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




Итак задача. Из БД нужно вытащить. Около 600-700(на данный момент) полей типа longtext
В цикле по ним нужно пройтись разбить на слова и т.д. На локальной машине, при количестве около 1000 записей, выскакивает ограничение по времени 30 секунд. Смысла перенастраивать limit по времени я не вижу, т.к наверняка, подобные ограничения есть и на хостингах, да и потом ну увеличу до 1 мин. Станет 1500 записей надо будет снова увеличивать. это путь в никуда!.
Я изначально и хотел сделать так что вытаскиваю допустим 40-50 записей, обработал их. Перезапустил скрипт (через сессию передал номер следующей) и т.д пока необработанных записей не осталось. Вот вкратце.
EuGen пишет:
И запускать не последовательно, а параллельно даже (ну или частично - скажем, по 5 секций за раз - это уж как ресурсы позволяют)
Лучше запускать последовательно. Потому что ведется определенная статистика
 
 Top
EuGen Администратор
Отправлено: 26 Июня, 2012 - 14:21:45
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




tuareg
Ну тогда Ваша задача дискретизируется идеально. Пишете, например, bash-скрипт такого содержания:
CODE (bash):
скопировать код в буфер обмена
  1. /path/to/php /path/to/script.php 0
  2. /path/to/php /path/to/script.php N N
  3. /path/to/php /path/to/script.php 2N N
  4. /path/to/php /path/to/script.php 3N N
  5. ...
  6. /path/to/php /path/to/script.php (M-1)N N

- где N - число записей, которые успевают обработаться за 20 секунд, M - число получившихся секций, /path/to/php - узнайте у хостера, где располагается cli-версия интерпретатора, ну или попробуйте вызывать просто php - возможно, он находится в стандартных каталогах и определится системой и без полного пути.
В самом скрипте делаете примерно так:
PHP:
скопировать код в буфер обмена
  1. // code
  2. $iOffset = (int)$_SERVER['argv'][1];
  3. $iCount  = (int)$_SERVER['argv'][2];
  4. $rSelect = mysql_query('SELECT * FROM `table` LIMIT '.$iOffset.', '.$iCount);
  5. //handle select ..

- а сам bash-скрипт (его текст) можно сгенерировать автоматически другим скриптом - думаю, это не составит труда.
При желании можно bash-скрипт заменить вызовом через Web и передачей параметров через $_GET - как вариант, но тогда нужно позаботиться о том, чтобы произошел последовательный вызов. Сделать это не сложно - у себя на клиенте пишете такой скрипт:
CODE (bash):
скопировать код в буфер обмена
  1. wget http://your.domain/script.php?offset=0&count=N
  2. wget http://your.domain/script.php?offset=2N&count=N
  3. wget http://your.domain/script.php?offset=3N&count=N
  4. ...
  5. wget http://your.domain/script.php?offset=(M-1)&count=N

- запускаете его на своей уже локальной машине, а в script.php делаете аналогично примеру выше, но $_SERVER, разумеется, изменяете на $_GET с соответствующими правками.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
tuareg
Отправлено: 26 Июня, 2012 - 14:28:26
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




EuGen Да я уже и сам понял.
Спасибо. Придется так и сделать. Печально, конечно, что нельзя сделать штатно PHP, ну что делать.
Еще раз спасибо
 
 Top
Страниц (2): « 1 [2]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB