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 :: Ограничение времени выполнения цикла

 PHP.SU

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


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

> Без описания
lawer85
Отправлено: 02 Января, 2016 - 16:11:06
Post Id


Частый гость


Покинул форум
Сообщений всего: 189
Дата рег-ции: Янв. 2013  


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




Есть цикл, который наполняет БД случайным образом действиями сотрудников.

Мне нужно, чтобы скажем c 22:00 до 09:00 данные не добавлялись, что-то вроде отдыха.

Вот мой вариант, но он не верный. Есть записи начало работы до 9 утра.

PHP:
скопировать код в буфер обмена
  1. require_once "config.php";
  2.  
  3. $result = $mysqli->query("SELECT id FROM contacts");
  4. $row = array();
  5. for($i = 0; $i < $result->num_rows; $i++){
  6.                 $row[] = $result->fetch_assoc();
  7. }
  8. //echo "<pre>";
  9. //print_r($row);
  10. //echo "</pre>";
  11. foreach ($row as $id) {
  12.         $id = $id["id"];
  13.         $time = time();
  14.         $pause = 1200;
  15.         $rest = 12 * 3600;
  16.         for($i = 0; $i < mt_rand(10, 600); $i++){
  17.                 $date = date("Y-m-d H:i:s", $time);
  18.                 $duration = mt_rand(60*5, 3600*5);
  19.                 $actions = array("development", "support", "marketing", "documents", "negotiations");
  20.                 $action = $actions[array_rand($actions)];
  21.                
  22.                 $sql = "INSERT INTO activities (contact_id, duration, employee_id, created_at, action) VALUES ('$id', '$duration', '$id', '$date', '$action')";
  23.                 $mysqli->query($sql);
  24.                 $d = date("H", $time);
  25.                 echo $d."<br />";
  26.                 if($d > 22 && $d < 9){
  27.                         $time += $duration + $rest;
  28.                 }else{
  29.                         $time += $duration + $pause;
  30.                 }
  31.                
  32.         }
  33. }
  34.  
  35. $mysqli->close();
  36. ?>

(Отредактировано автором: 02 Января, 2016 - 16:12:28)

 
 Top
dcc0
Отправлено: 02 Января, 2016 - 17:03:52
Post Id


Участник


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


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





Если $d больше 22 и меньше 9 ? Вы уверены?
Какие числа попадают в данный диапазон?


-----
Март 2021. Бросил программирование
 
 Top
lawer85
Отправлено: 02 Января, 2016 - 23:20:59
Post Id


Частый гость


Покинул форум
Сообщений всего: 189
Дата рег-ции: Янв. 2013  


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




dcc0 пишет:
Если $d больше 22 и меньше 9 ? Вы уверены?
Какие числа попадают в данный диапазон?


А как правильно указать чтобы не было выполнения работы в диапозоне от 22 часов вечера до 9 утра?
 
 Top
Строитель Модератор
Отправлено: 03 Января, 2016 - 00:28:31
Post Id



Участник


Покинул форум
Сообщений всего: 1581
Дата рег-ции: Февр. 2014  
Откуда: Украина


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




lawer85 пишет:
А как правильно указать чтобы не было выполнения работы в диапозоне от 22 часов вечера до 9 утра?
PHP:
скопировать код в буфер обмена
  1. if (($d >= 0 && $d < 9) || $d >= 22) {
  2.     continue; //ничего не делаем
  3.     // или прерывайте цикл break; если это нужно
  4. }

(Отредактировано автором: 03 Января, 2016 - 00:33:39)

 
 Top
lawer85
Отправлено: 03 Января, 2016 - 01:04:25
Post Id


Частый гость


Покинул форум
Сообщений всего: 189
Дата рег-ции: Янв. 2013  


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




Строитель пишет:
lawer85 пишет:
А как правильно указать чтобы не было выполнения работы в диапозоне от 22 часов вечера до 9 утра?
PHP:
скопировать код в буфер обмена
  1. if (($d >= 0 && $d < 9) || $d >= 22) {
  2.     continue; //ничего не делаем
  3.     // или прерывайте цикл break; если это нужно
  4. }


Я понял, только вот в этом промежутке мне надо прибавить какое-то время к текущему скажем час ночи или 4 утра, чтобы начало след действия сотрудника началось после 9 утра, однако как сделать так, чтобы автоматом подбиралось сколько часов надо прибавить, т.е. 22 часа значит надо прибавить 12 часов, если час ночи то 9 часов и т.д.?
 
 Top
Prizma
Отправлено: 03 Января, 2016 - 04:23:06
Post Id



Посетитель


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


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




Возможно я идиот... но все же

1. Почему проверка в цикле?? у вас скрипт будет выполняться 24 часа в сутки? (тогда вопрос, как это возможно, я даже с set_time_limit(0) выжимал около 15-20 минут... Возможно изменить настройки сервера можно разогнать его до unlimited? (это вопрос - интересно)
2. Ладно пусть в цикле, но черт возьми почему проверки в конце и где остановка?
3. Раз остановки нет, не знаю сколько у вас записей в таблице contacts, но все же если предположить, что их очень много, то даже добавив к проверке остановку, все равно скрипт продолжит парсить contacts и не прервется пока первый цикл не переберет всю таблицу.

Я не спрашиваю зачем, могу предположить, что задание в вузе или ставите какой то эксперимент или это вообще просто пример, а реализация будет в ином месте...


lawer85 пишет:
Есть цикл, который наполняет БД случайным образом действиями сотрудников.

Мне нужно, чтобы скажем c 22:00 до 09:00 данные не добавлялись, что-то вроде отдыха.

если бы не смотрел на вашу реализацию сделал бы как то так:
PHP:
скопировать код в буфер обмена
  1. // возващает true если пора отдыхать
  2. function isTimeToSleep() {
  3.     $d = date("H", $time);
  4.     return (($d >= 0 && $d < 9) || $d >= 22);
  5. }
  6.  
  7. // прерываем скрипт там где надо
  8. if(isTimeToSleep()) {
  9.     /* делаем все что надо перед завершением, если надо */
  10.     die;
  11.     /* вместо die можно использовать sleep сделав расчет времени до утра и тогда ровно в 9:00 он продолжит пахать с того места где остановился) */
  12. }
 
My status
 Top
lawer85
Отправлено: 03 Января, 2016 - 12:20:24
Post Id


Частый гость


Покинул форум
Сообщений всего: 189
Дата рег-ции: Янв. 2013  


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




Prizma пишет:
Возможно я идиот... но все же

1. Почему проверка в цикле?? у вас скрипт будет выполняться 24 часа в сутки? (тогда вопрос, как это возможно, я даже с set_time_limit(0) выжимал около 15-20 минут... Возможно изменить настройки сервера можно разогнать его до unlimited? (это вопрос - интересно)
2. Ладно пусть в цикле, но черт возьми почему проверки в конце и где остановка?
3. Раз остановки нет, не знаю сколько у вас записей в таблице contacts, но все же если предположить, что их очень много, то даже добавив к проверке остановку, все равно скрипт продолжит парсить contacts и не прервется пока первый цикл не переберет всю таблицу.

Я не спрашиваю зачем, могу предположить, что задание в вузе или ставите какой то эксперимент или это вообще просто пример, а реализация будет в ином месте...


lawer85 пишет:
Есть цикл, который наполняет БД случайным образом действиями сотрудников.

Мне нужно, чтобы скажем c 22:00 до 09:00 данные не добавлялись, что-то вроде отдыха.

если бы не смотрел на вашу реализацию сделал бы как то так:
PHP:
скопировать код в буфер обмена
  1. // возващает true если пора отдыхать
  2. function isTimeToSleep() {
  3.     $d = date("H", $time);
  4.     return (($d >= 0 && $d < 9) || $d >= 22);
  5. }
  6.  
  7. // прерываем скрипт там где надо
  8. if(isTimeToSleep()) {
  9.     /* делаем все что надо перед завершением, если надо */
  10.     die;
  11.     /* вместо die можно использовать sleep сделав расчет времени до утра и тогда ровно в 9:00 он продолжит пахать с того места где остановился) */
  12. }


Вы не поняли. Скрипт не работает 24 часа в сутки. Скрипт заполняет БД разными действиями сотрудников и этих действий от 10 до 600 и каждое выполняется от 5 минут до 5 часов. Из скрипта видно что кол-во действий и время на выполнение берется рандомно. Поэтому идет речь о сутках(24 часа). Другими словами мы за несколько дней можем заполнить БД данными.
 
 Top
lawer85
Отправлено: 03 Января, 2016 - 18:32:54
Post Id


Частый гость


Покинул форум
Сообщений всего: 189
Дата рег-ции: Янв. 2013  


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




Вобщем сделал.

Вот конечный код

PHP:
скопировать код в буфер обмена
  1. require_once "config.php";
  2.  
  3. $result = $mysqli->query("SELECT id FROM contacts");
  4. $row = array();
  5. for($i = 0; $i < $result->num_rows; $i++){
  6.                 $row[] = $result->fetch_assoc();
  7. }
  8. //echo "<pre>";
  9. //print_r($row);
  10. //echo "</pre>";
  11. foreach ($row as $id) {
  12.         $id = $id["id"];
  13.         $time = time();
  14.         $pause = 1200;
  15.         $rest = array('22' => 12 * 3600, '23' => 11 * 3600, '00' => 10 * 3600, '01' => 9 * 3600, '02' => 8 * 3600, '03' => 7 * 3600, '04' => 6 * 3600, '05' => 5 * 3600, '06' => 4 * 3600, '07' => 3 * 3600, '08' => 2 * 3600);
  16.         for($i = 0; $i < mt_rand(10, 600); $i++){
  17.                 $d = date("H", $time);
  18.                 if(($d >= '00' && $d < '09') || $d >= '22'){
  19.                         foreach($rest as $key => $value){
  20.                                 if($d == $key){
  21.                                         $time += $value;
  22.                                         $date = date("Y-m-d H:i:s", $time);
  23.                                 }      
  24.                         }
  25.                 }else{
  26.                         $date = date("Y-m-d H:i:s", $time);
  27.                         echo $date."<br />";
  28.                 }
  29.                
  30.                 $duration = mt_rand(60*5, 3600*5);
  31.                 $actions = array("development", "support", "marketing", "documents", "negotiations");
  32.                 $action = $actions[array_rand($actions)];
  33.                
  34.                 $sql = "INSERT INTO activities (contact_id, duration, employee_id, created_at, action) VALUES ('$id', '$duration', '$id', '$date', '$action')";
  35.                 $mysqli->query($sql);
  36.                
  37.                 $time += $duration + $pause;
  38.                
  39.         }
  40. }
  41.  
  42. $mysqli->close();

(Отредактировано автором: 03 Января, 2016 - 18:33:29)

 
 Top
Prizma
Отправлено: 03 Января, 2016 - 22:09:03
Post Id



Посетитель


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


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




lawer85 пишет:
Вы не поняли. Скрипт не работает 24 часа в сутки. Скрипт заполняет БД разными действиями сотрудников и этих действий от 10 до 600 и каждое выполняется от 5 минут до 5 часов. Из скрипта видно что кол-во действий и время на выполнение берется рандомно. Поэтому идет речь о сутках(24 часа). Другими словами мы за несколько дней можем заполнить БД данными.

lawer85 пишет:
if(($d >= '00' && $d < '09') || $d >= '22'){
                        foreach($rest as $key => $value){
                                if($d == $key){
                                        $time += $value;
                                        $date = date("Y-m-d H:i:s", $time);
                                }      
                        }
                }else{
                        $date = date("Y-m-d H:i:s", $time);
                        echo $date."<br />";
                }

Понятно, тебе нужно все лишь что бы значение timestamp в поле `created_at` принимало значения в диапозоне от 9 до 23 часов. Вот только, что за реализация такая интересная.. Возможно она и работает но лучше написать в условии, наверно вот так:
PHP:
скопировать код в буфер обмена
  1. $d = ltrim(date("H", $time), '0');
  2. if((($d >= 0) && ($d < 9)) || ($d >= 22)) {
  3.     /* ... */
  4. }
Ну и собственно вопрос должен был звучать как то так, чтобы его поняли правильно:
Помогите составить условие для if, ...
 
My status
 Top
lawer85
Отправлено: 03 Января, 2016 - 22:24:16
Post Id


Частый гость


Покинул форум
Сообщений всего: 189
Дата рег-ции: Янв. 2013  


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




Prizma пишет:
lawer85 пишет:
Вы не поняли. Скрипт не работает 24 часа в сутки. Скрипт заполняет БД разными действиями сотрудников и этих действий от 10 до 600 и каждое выполняется от 5 минут до 5 часов. Из скрипта видно что кол-во действий и время на выполнение берется рандомно. Поэтому идет речь о сутках(24 часа). Другими словами мы за несколько дней можем заполнить БД данными.

lawer85 пишет:
if(($d >= '00' && $d < '09') || $d >= '22'){
                        foreach($rest as $key => $value){
                                if($d == $key){
                                        $time += $value;
                                        $date = date("Y-m-d H:i:s", $time);
                                }      
                        }
                }else{
                        $date = date("Y-m-d H:i:s", $time);
                        echo $date."<br />";
                }

Понятно, тебе нужно все лишь что бы значение timestamp в поле `created_at` принимало значения в диапозоне от 9 до 23 часов. Вот только, что за реализация такая интересная.. Возможно она и работает но лучше написать в условии, наверно вот так:
PHP:
скопировать код в буфер обмена
  1. $d = ltrim(date("H", $time), '0');
  2. if((($d >= 0) && ($d < 9)) || ($d >= 22)) {
  3.     /* ... */
  4. }
Ну и собственно вопрос должен был звучать как то так, чтобы его поняли правильно:
Помогите составить условие для if, ...


Я об этом не подумал. Спасибо за совет. Хотя по-моему это будет влиять не на саму работу скрипта, а скорее на внешний вид что ли. Т.е. будем работать с привычными цифрами 1 2 вместо 01 02

Кстати верно понял то, что мне надо.
 
 Top
Prizma
Отправлено: 03 Января, 2016 - 23:24:00
Post Id



Посетитель


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


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




lawer85 пишет:
Я об этом не подумал. Спасибо за совет. Хотя по-моему это будет влиять не на саму работу скрипта, а скорее на внешний вид что ли. Т.е. будем работать с привычными цифрами 1 2 вместо 01 02

во первых числами, а во вторых нету числа 01 ... зато есть строка '01' приводимая в данном выражении при сравнении к числу 1.

Просто не логично сравнивать одну строку с другой оператором ">=", когда обе строки будут приведены к числу и ноль с кавычками с самого начала нечего не значат. Собственно точно так же можно не использовать ltrim все равно число будет приведено одинаково.

(Отредактировано автором: 03 Января, 2016 - 23:25:47)

 
My status
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB