Цитата:
Ну вот и все. Найден обход лимитов по памяти на хостинге ))
Это был сарказм?
Я же привел примеры того, как проверял это. Ну да, конечно у меня не хостинг, у меня VPS. Но все равно, честно говоря я не пойму как это работает, потому что register_shutdown_function() можно объявить где угодно, и скрипт может вылететь до этого объявления. Может интерпретатор проходит весь сценарий и выявляет все места где может регистрироваться функция завершения и перед выполнением всего сценария выделяет оперативку для этой функции?
В общем, я не знаю как это работает, но вроде оно работает. Погоняем, понаблюдаем, по-тестируем..
(Добавление)
Уф, вот собственно говоря что у меня таки получилось (script_runner.php):
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- <?PHP
- //Инициализация
- include(__DIR__ . '/_jobs_config.php');
- include(__DIR__ . '/../_lib/klogger.class.php');
- $log = new KLogger(LOG_PATH . '/script_runner.log', KLogger::DEBUG);
- $log->LogInfo('Start runner.');
- 'get_feeds',
- 'aggregate',
- //'make_ready_events'
- );
- $register_scripts = '';
- foreach($scripts as $script){
- $register_scripts .= $script . ', ';
- }
- $log->LogInfo('Register scripts: ' . $register_scripts);
- $last_script = file_get_contents(WORK_DIR . '/last_script.queue');//получаем последний отработавший скрипт
- $log->LogInfo('Last execution script: ' . $last_script);
- switch($last_script){//устанавливаем срипт, который должен выполниться после последнего выполненого
- case 'get_feeds':
- $current_script = $scripts[1];
- break;
- case 'aggregate':
- $current_script = $scripts[0];
- break;
- default:
- $current_script = $scripts[0];
- break;
- }
- $log->LogInfo('Current execution script: ' . $current_script);
- foreach($scripts as $script){//проверяем, есть ли уже какой-то работаеющий скрипт
- $shell_command = 'ps ax | grep ' . $script . '.' . EXT;
- $ps_out = `$shell_command`;
- $needle = COMMAND . WORK_DIR . '/' . $script . '.' . EXT;
- if ($pos === false){
- //print "Script '" . $script . "' is not running. Continue.\n";
- }else{//если какой либо из скриптов уже запещен, умираем...
- $log->LogError('Script '.$script.' is alrady runnig. Die.');
- }
- }
- //если дошло до сюда, то значит не один из скриптов не выполняется в данный момент, текущий установленный скрипт
- $log->LogInfo('No running scripts. Run ' . $current_script . '...');
- //print "No running scripts.\nRun current script!\n";
- register_shutdown_function('shutdown', $current_script);//регистрируем этот скрипт, как последний запускавшийся
- $exec = COMMAND . WORK_DIR . '/' . $current_script . '.' . EXT;
- $log->LogInfo('Exec: "' . $exec . '"');
- function shutdown($last_script){
- global $log;
- $log->LogInfo('The end work of script runner with script: ' . $last_script);
- }