Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Запустить скрипт в фоне из другого скрипта
 
 автор: TetRiska   (16.02.2014 в 00:19)   письмо автору
 
 

Всем привет. Решение как бы готово, но не работает...

Начинаю с этого мета:

$.post('/requests/prepareMessage.php',{
   'ml':$('#mail').val()
},function(data){
   if(data.length > 0){
      if(data != 'Hacking attempt!'){
         //--monitoring
      }
   }
});

в prepareMessage.php:

exec("***/requests/sendMessage.php > /dev/null &");
echo 'OK';

в sendMessage.php писал следующие варианты:

1. создание файла и запись в него значения - ничего не произошло, ошибок в логах нет
file_put_contents('***/debug.log', 1);

2. инициализация сессии и запись в нее значения - ничего не произошло, ошибок в логах нет
session();
$_SESSION['test'] = 1;

3. инициализация сессии с применением текущего значения (id) и запись в нее значения - ничего не произошло, ошибок в логах нет
session_id('s61ghor49vuc6aap4n18phr713');
session();
$_SESSION['test'] = 1;

Получается, что файл sendMessage.php не срабатывает. Не знаю почему. Пробовал еще такую проверку:

в prepareMessage.php:

exec("***/requests/sendMessage.php >> ***/debug.log &");
echo 'OK';

в sendMessage.php:

echo 1;

Файл debug.log создало, но в нем пусто.

p.s. Сервер на FreeBSD

  Ответить  
 
 автор: TetRiska   (16.02.2014 в 15:51)   письмо автору
 
   для: TetRiska   (16.02.2014 в 00:19)
 

в общем сделал так, работает:
exec("/usr/bin/php ***/requests/sendMessage.php > /dev/null &");

вот только не пойму как мне в скрипт sendMessage.php передать параметры, которые приходят в скрипт prepareMessage.php в таком виде:
$cid = isset($_POST['ci']) ? $_POST['ci'] : 0;
$bid = isset($_POST['bi']) ? $_POST['bi'] : 0;
$reply = isset($_POST['rl']) ? $_POST['rl'] : 'y';
$email = isset($_POST['em']) ? $_POST['em'] : array();

  Ответить  
 
 автор: Саня   (17.02.2014 в 15:41)   письмо автору
 
   для: TetRiska   (16.02.2014 в 15:51)
 

Аргументами:

/usr/bin/php ***/requests/sendMessage.php arg1 arg2 arg3 > /dev/null &

Агрументы будут доступны в глобальной переменной $argv.

  Ответить  
 
 автор: TetRiska   (18.02.2014 в 03:34)   письмо автору
 
   для: Саня   (17.02.2014 в 15:41)
 

примерно так я сделал из примеров:
exec('/usr/bin/php sendMessage.php -- "cid=43&bid=1&reply=y&desc=Привет "Вася"" > /dev/null &'); 

1. только не пойму зачем -- перед параметрами
2. передаваемые параметры никакими функциями проверки не нужно оборачивать? Т.к. будут передаваться числа, текст с " < и тд. Или все же надежней перед запуском скрипта в фоне, записать все данные в промежуточную таблицу и передать лишь ид?

Сейчас пробую записать сессию в скрипте sendMessage.php и потом получить ее на сайте, ничего не выходит, сессия полностью сбрасывается, разве я не верно делаю?
exec('/usr/bin/php sendMessage.php -- "'.session_id().'" > /dev/null &');

в sendMessage.php:
session_id($argv[2]);
session_start();

$_SESSION['start'] = 1; 

  Ответить  
 
 автор: Саня   (18.02.2014 в 19:55)   письмо автору
 
   для: TetRiska   (18.02.2014 в 03:34)
 

1. Это специальный аргумент, указывающий что аргументы интерпретатора закончились и начинаются аргументы, передаваемые в сам скрипт. Таким образом можно безопасно передавать в скрипт любые агрументы, не боясь, что они будут восприняты как аргументы php интерпретатора.

2. Конечно какая-то обработка данных нужна, иначе появляется потенциальная возможность провести shell injection.

Например в descr записать:
"; rm -rf .


И получится не очень приятно:
/usr/bin/php sendMessage.php -- "cid=43&bid=1&reply=y&desc="; rm -rf . > /dev/null &


Лучше да, поместить во внешнее хранилище (mysql, файл, и т.п.).

Перед вызовом exec нужно закрыть сессию функцией session_write_close();
Вообще это не очень хорошая идея - использовать сессии. Можно схлопотать дедлок.

  Ответить  
 
 автор: TetRiska   (18.02.2014 в 21:28)   письмо автору
 
   для: Саня   (18.02.2014 в 19:55)
 

понял, тогда лучше буду использовать промежуточную таблицу и передавать лишь ИД.
верно составил отправку без --, т.к. передается только 1 параметр - число?
exec('/usr/bin/php sendMessage.php '.$id.' > /dev/null &');

> Перед вызовом exec нужно закрыть сессию функцией session_write_close();
зачем? мне ведь нужно в сессию писать статистику по отправленным письмам, дабы ее в реальном времени сразу отображать оператору
> Можно схлопотать дедлок.
письма рассылать будут 2 оператора, каждый из операторов начав отправку, будет ожидать окончания ее, после чего сможет приступить к следующей отправке

  Ответить  
 
 автор: Саня   (20.02.2014 в 10:35)   письмо автору
 
   для: TetRiska   (18.02.2014 в 21:28)
 

Закрывать сессию надо чтобы избежать возможного дедлока. Стандартный файловый обработчик сессии накладывает эксклюзивную блокировку на файл сессии при старте. Поэтому при запуске нового скрипта он будет ожидать освобождения блокировки, а скрипт, его запустивший, будет ожидать выполнение дочерней программы. Вот и дедлок. Причём не зависящий от количество операторов.

  Ответить  
 
 автор: TetRiska   (20.02.2014 в 12:28)   письмо автору
 
   для: Саня   (20.02.2014 в 10:35)
 

А как тогда мониторить отправку? Хотел писать в сессии, т.к. не хотел затрагивать БД или файлы. Писалась бы статистика в сессию в цикле отправки.

  Ответить  
 
 автор: Саня   (20.02.2014 в 15:15)   письмо автору
 
   для: TetRiska   (20.02.2014 в 12:28)
 

Да как угодно! Хоть сессиями, хоть ещё как.

  Ответить  
 
 автор: TetRiska   (20.02.2014 в 17:00)   письмо автору
 
   для: Саня   (20.02.2014 в 15:15)
 

чего-то не совсем пойму. если закрыть сессию в скрипте который запускает фоновый скрипт рассылки, то в этом фоновом скрипте я то смогу открыть новую сессию и туда писать данные, но я не смогу выловить эту сессию в скрипте, который будет мониторить эту статистику

  Ответить  
 
 автор: Саня   (21.02.2014 в 16:44)   письмо автору
 
   для: TetRiska   (20.02.2014 в 17:00)
 

Вы можете сохранить идентификатор сессии и по нему восстановить её в мониторном скрипте. Просто надо понимать, что одновременно с одной и той же сессией может работать только один скрипт.

  Ответить  
 
 автор: TetRiska   (20.02.2014 в 02:41)   письмо автору
 
   для: Саня   (18.02.2014 в 19:55)
 

если не сложно, ответьте на вопрос, спасибо

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования