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]   

> Без описания
nkl
Отправлено: 11 Декабря, 2014 - 09:41:25
Post Id



Посетитель


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


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




Цитата:
Ну вот и все. Найден обход лимитов по памяти на хостинге ))

Это был сарказм? Не понял
Я же привел примеры того, как проверял это. Ну да, конечно у меня не хостинг, у меня VPS. Но все равно, честно говоря я не пойму как это работает, потому что register_shutdown_function() можно объявить где угодно, и скрипт может вылететь до этого объявления. Может интерпретатор проходит весь сценарий и выявляет все места где может регистрироваться функция завершения и перед выполнением всего сценария выделяет оперативку для этой функции?
В общем, я не знаю как это работает, но вроде оно работает. Погоняем, понаблюдаем, по-тестируем.. Хм
(Добавление)
Уф, вот собственно говоря что у меня таки получилось (script_runner.php):
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. //Инициализация
  3. include(__DIR__ . '/_jobs_config.php');
  4. include(__DIR__ . '/../_lib/klogger.class.php');
  5. define('WORK_DIR', __DIR__);
  6. define('COMMAND', '/usr/bin/php ');
  7. define('EXT', 'php');
  8. define('LOG_PATH', '/var/log/feed');
  9.  
  10. $log = new KLogger(LOG_PATH . '/script_runner.log', KLogger::DEBUG);
  11. $log->LogInfo('Start runner.');
  12.  
  13. $scripts = array(// регистрируем список запускаемых скриптов при помощи этого файла
  14.         'get_feeds',
  15.         'aggregate',
  16.         //'make_ready_events'
  17. );
  18. $register_scripts = '';
  19. foreach($scripts as $script){
  20.         $register_scripts .= $script . ', ';
  21. }
  22.  
  23. $log->LogInfo('Register scripts: ' . $register_scripts);
  24.  
  25. $last_script = file_get_contents(WORK_DIR . '/last_script.queue');//получаем последний отработавший скрипт
  26.  
  27. $log->LogInfo('Last execution script: ' . $last_script);
  28.  
  29. switch($last_script){//устанавливаем срипт, который должен выполниться после последнего выполненого
  30.         case 'get_feeds':
  31.                 $current_script = $scripts[1];
  32.                 break;
  33.  
  34.         case 'aggregate':
  35.                 $current_script = $scripts[0];
  36.                 break;
  37.  
  38.         default:
  39.                 $current_script = $scripts[0];
  40.                 break;
  41. }
  42. $log->LogInfo('Current execution script: ' . $current_script);
  43.  
  44. foreach($scripts as $script){//проверяем, есть ли уже какой-то работаеющий скрипт
  45.        
  46.         $shell_command = 'ps ax | grep ' . $script . '.' . EXT;
  47.         $ps_out = `$shell_command`;
  48.         $needle = COMMAND . WORK_DIR . '/' . $script . '.' . EXT;
  49.         $pos = strripos($ps_out, $needle);
  50.        
  51.         if ($pos === false){
  52.                 //print "Script '" . $script . "' is not running. Continue.\n";
  53.         }else{//если какой либо из скриптов уже запещен, умираем...
  54.                 $log->LogError('Script '.$script.' is alrady runnig. Die.');
  55.                 register_shutdown_function('shutdown', $script);//пишем текущий работающий скрипт, как последний
  56.                 die("Script '" . $script . "' is alrady runnig. Die.\n");
  57.         }
  58. }
  59. //если дошло до сюда, то значит не один из скриптов не выполняется в данный момент, текущий установленный скрипт
  60. $log->LogInfo('No running scripts. Run ' . $current_script . '...');
  61.  
  62. //print "No running scripts.\nRun current script!\n";
  63.  
  64. register_shutdown_function('shutdown', $current_script);//регистрируем этот скрипт, как последний запускавшийся
  65.  
  66. $exec = COMMAND . WORK_DIR . '/' . $current_script . '.' . EXT;
  67. $log->LogInfo('Exec: "' . $exec . '"');
  68. exec($exec);
  69.  
  70. function shutdown($last_script){
  71.         global $log;
  72.         $log->LogInfo('The end work of script runner with script: ' . $last_script);
  73.         file_put_contents(WORK_DIR . '/last_script.queue', $last_script);
  74. }

(Добавление)
А а вот собственно говоря и лог работы этого ранера:
Цитата:
2014-12-11 11:52:22 - INFO --> The end work of script runner with script: get_feeds
2014-12-11 11:53:01 - INFO --> Start runner.
2014-12-11 11:53:01 - INFO --> Register scripts: get_feeds, aggregate,
2014-12-11 11:53:01 - INFO --> Last execution script: get_feeds
2014-12-11 11:53:01 - INFO --> Current execution script: aggregate
2014-12-11 11:53:01 - INFO --> No running scripts. Run aggregate...
2014-12-11 11:53:01 - INFO --> Exec: "/usr/bin/php /home/user/www/project_name/cron/aggregate.php"
2014-12-11 11:54:01 - INFO --> Start runner.
2014-12-11 11:54:01 - INFO --> Register scripts: get_feeds, aggregate,
2014-12-11 11:54:01 - INFO --> Last execution script: get_feeds
2014-12-11 11:54:01 - INFO --> Current execution script: aggregate
2014-12-11 11:54:01 - ERROR --> Script aggregate is alrady runnig. Die.
2014-12-11 11:54:01 - INFO --> The end work of script runner with script: aggregate
2014-12-11 11:54:40 - INFO --> The end work of script runner with script: aggregate
2014-12-11 11:55:01 - INFO --> Start runner.
2014-12-11 11:55:01 - INFO --> Register scripts: get_feeds, aggregate,
2014-12-11 11:55:01 - INFO --> Last execution script: aggregate
2014-12-11 11:55:01 - INFO --> Current execution script: get_feeds
2014-12-11 11:55:01 - INFO --> No running scripts. Run get_feeds...
2014-12-11 11:55:01 - INFO --> Exec: "/usr/bin/php /home/user/www/project_name/cron/get_feeds.php"
2014-12-11 11:55:25 - INFO --> The end work of script runner with script: get_feeds
2014-12-11 11:56:01 - INFO --> Start runner.
2014-12-11 11:56:01 - INFO --> Register scripts: get_feeds, aggregate,
2014-12-11 11:56:01 - INFO --> Last execution script: get_feeds
2014-12-11 11:56:01 - INFO --> Current execution script: aggregate
2014-12-11 11:56:01 - INFO --> No running scripts. Run aggregate...
2014-12-11 11:56:01 - INFO --> Exec: "/usr/bin/php /home/user/www/project_name/cron/aggregate.php"
2014-12-11 11:57:01 - INFO --> Start runner.
2014-12-11 11:57:01 - INFO --> Register scripts: get_feeds, aggregate,
2014-12-11 11:57:01 - INFO --> Last execution script: get_feeds
2014-12-11 11:57:01 - INFO --> Current execution script: aggregate
2014-12-11 11:57:01 - ERROR --> Script aggregate is alrady runnig. Die.
2014-12-11 11:57:01 - INFO --> The end work of script runner with script: aggregate

Как видите, скрипты запускаются в строгой последовательности и никогда не запускается 2 одинаковых скрипта или 2 скрипта одновременно.
(Добавление)
Конечно здесь есть непонятные мне моменты, но вроде как все работает правильно. Буду добавлять еще скрипты в управляющий раннер и смотреть что будет получаться.
 
 Top
DeepVarvar Супермодератор
Отправлено: 11 Декабря, 2014 - 11:15:56
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




nkl пишет:
$register_scripts = '';
foreach($scripts as $script){
$register_scripts .= $script . ', ';
}

PHP:
скопировать код в буфер обмена
  1. $register_scripts = join(', ', $scripts);

И я не понимаю почему (зачем) обязательно надо хранить в файле последний отработанный скрипт?
 
 Top
nkl
Отправлено: 11 Декабря, 2014 - 12:44:19
Post Id



Посетитель


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


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




Что бы знать, какой должен быть запущен следующий скрипт. Мне нужно выполнять несколько скриптов в строгой последовательности, и только после того, как предыдущий был завершен, запускать следующий. И не в коем случае не параллельно. Именно поэтому мне сразу и не подошел сервер очередей, хотя esterio, как то сумел взять управление очередью в свои руки и то, только для того, что бы не ставить в очередь скрипт, который там уже стоит или выполняется. Но так и я смог, а вот именно с порядком выполнения так и не получилось совладать.

За join спасибо, век живи век учись Язычок
 
 Top
DeepVarvar Супермодератор
Отправлено: 11 Декабря, 2014 - 13:42:38
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




Очередь удобно хранить в JSON, есть встроенные ф-ции, которые кстати еще и быстрее чем стандартный пыховый сериалайз, и легко дописать/удалить элемент очереди из стека. Ато я чот не уловил - скриптов много разных, а пишешь ты почему-то в один файл одно имя только.
 
 Top
nkl
Отправлено: 12 Декабря, 2014 - 08:33:18
Post Id



Посетитель


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


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




Разобрался с непонятками в логах, теперь все выглядит более наглядно. Кроме того, добавил еще один скрипт в очередь (теперь их 3).
Цитата:
Register scripts: get_feeds, aggregate, make_ready_events

И выполнятся они должны в той последовательности, в которой они зареганы.
Цитата:
2014-12-12 9:14:27 - INFO --> The end work of script runner with script: get_feeds.
2014-12-12 9:15:01 - INFO --> Start runner.
2014-12-12 9:15:01 - INFO --> Register scripts: get_feeds, aggregate, make_ready_events
2014-12-12 9:15:01 - INFO --> Last execution script: get_feeds
2014-12-12 9:15:01 - INFO --> Current execution script: aggregate
2014-12-12 9:15:01 - INFO --> No running scripts. Run aggregate...
2014-12-12 9:15:01 - INFO --> Exec: "/usr/bin/php /home/user/www/project_name/cron/aggregate.php"
2014-12-12 9:16:01 - INFO --> Start runner.
2014-12-12 9:16:01 - INFO --> Register scripts: get_feeds, aggregate, make_ready_events
2014-12-12 9:16:01 - INFO --> Last execution script: get_feeds
2014-12-12 9:16:01 - INFO --> Current execution script: aggregate
2014-12-12 9:16:01 - WARN --> Script aggregate is alrady runnig. Die.
2014-12-12 9:16:01 - WARN --> The end work of script runner because aggregate is already running.
2014-12-12 9:17:00 - INFO --> The end work of script runner with script: aggregate.
2014-12-12 9:17:00 - INFO --> Start runner.
2014-12-12 9:17:00 - INFO --> Register scripts: get_feeds, aggregate, make_ready_events
2014-12-12 9:17:00 - INFO --> Last execution script: aggregate
2014-12-12 9:17:00 - INFO --> Current execution script: make_ready_events
2014-12-12 9:17:00 - INFO --> No running scripts. Run make_ready_events...
2014-12-12 9:17:00 - INFO --> Exec: "/usr/bin/php /home/user/www/project_name/cron/make_ready_events.php"
2014-12-12 9:17:04 - INFO --> The end work of script runner with script: make_ready_events.
2014-12-12 9:18:01 - INFO --> Start runner.
2014-12-12 9:18:01 - INFO --> Register scripts: get_feeds, aggregate, make_ready_events
2014-12-12 9:18:01 - INFO --> Last execution script: make_ready_events
2014-12-12 9:18:01 - INFO --> Current execution script: get_feeds
2014-12-12 9:18:01 - INFO --> No running scripts. Run get_feeds...
2014-12-12 9:18:01 - INFO --> Exec: "/usr/bin/php /home/user/www/project_name/cron/get_feeds.php"
2014-12-12 9:18:26 - INFO --> The end work of script runner with script: get_feeds.
2014-12-12 9:19:02 - INFO --> Start runner.
2014-12-12 9:19:02 - INFO --> Register scripts: get_feeds, aggregate, make_ready_events
2014-12-12 9:19:02 - INFO --> Last execution script: get_feeds
2014-12-12 9:19:02 - INFO --> Current execution script: aggregate
2014-12-12 9:19:02 - INFO --> No running scripts. Run aggregate...
2014-12-12 9:19:02 - INFO --> Exec: "/usr/bin/php /home/user/www/project_name/cron/aggregate.php"
2014-12-12 9:20:02 - INFO --> Start runner.
2014-12-12 9:20:02 - INFO --> Register scripts: get_feeds, aggregate, make_ready_events
2014-12-12 9:20:02 - INFO --> Last execution script: get_feeds
2014-12-12 9:20:02 - INFO --> Current execution script: aggregate
2014-12-12 9:20:02 - WARN --> Script aggregate is alrady runnig. Die.
2014-12-12 9:20:02 - WARN --> The end work of script runner because aggregate is already running.

Как видите, я по крону каждую минуту запускаю этот скрипт-ранер и он автоматом определяет, какой скрипт должен быть запущен, на основе того, какой скрипт запускался до этого, имя которого и пишется в файл. У меня не такая уж и большая последовательность (в ходе ведения этой темы я её слегка сократил с 5 до 3 скриптов), и потом, мне нужно знать только 1, какой скрипт был завершен последний раз, а на основании этого я уже знаю, какой скрипт необходимо запустить следующим.
Пока вроде все работает как надо. Если кому нужна новая версия этого скрипт-ранера, то вот исходник:
Спойлер (Отобразить)

Ксласс Klogger думаю сами найдете на просторах...
В общем: проблема решена, тему можно закрывать. Всем спасибо за участие! Улыбка
 
 Top
dXdYdZ
Отправлено: 12 Декабря, 2014 - 11:42:01
Post Id


Посетитель


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


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




Сталкивался с подобной задачей. Нашёл оригинальное решение.
PHP:
скопировать код в буфер обмена
  1.  
  2. //Функция сообщает, что процесс с заданным номером запущен
  3. function start_process($number)
  4.     {
  5.     //Блокируем доступ к файлу процесса
  6.     $fp=fopen ("processes/proc_".(string)$number,"w+");//открытие
  7.     if($fp)
  8.         {
  9.         if(flock($fp,LOCK_EX+LOCK_NB))
  10.                 return $fp;
  11.          else
  12.                 return false;
  13.         }
  14.     return $fp;
  15.     }
  16. //Получаем файл процесса
  17. $process_file=start_process($number);
  18. //Проверяем, доступен ли файл, и, следовательно, свободен ли процесс
  19. if($process_file===false)
  20.     exit;

(Добавление)
В Вашем случае, кроме этого, надо ещё где-то текущий этап сохранять
(Добавление)
Ой, не заметил, что тему можно закрыть уже. Ну да ладно. Раз уж написал-пусть будет.
(Добавление)
Плюс этого способа в том, что даже при аварийном вылете скрипта в любом месте всё работает как надо.
 
 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