|
|
|
| Всем привет. Решение как бы готово, но не работает...
Начинаю с этого мета:
$.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:
Файл debug.log создало, но в нем пусто.
p.s. Сервер на FreeBSD | |
|
|
|
|
|
|
|
для: 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();
|
| |
|
|
|
|
|
|
|
для: TetRiska
(16.02.2014 в 15:51)
| | Аргументами:
/usr/bin/php ***/requests/sendMessage.php arg1 arg2 arg3 > /dev/null &
|
Агрументы будут доступны в глобальной переменной $argv. | |
|
|
|
|
|
|
|
для: Саня
(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;
|
| |
|
|
|
|
|
|
|
для: TetRiska
(18.02.2014 в 03:34)
| | 1. Это специальный аргумент, указывающий что аргументы интерпретатора закончились и начинаются аргументы, передаваемые в сам скрипт. Таким образом можно безопасно передавать в скрипт любые агрументы, не боясь, что они будут восприняты как аргументы php интерпретатора.
2. Конечно какая-то обработка данных нужна, иначе появляется потенциальная возможность провести shell injection.
Например в descr записать:
И получится не очень приятно:
/usr/bin/php sendMessage.php -- "cid=43&bid=1&reply=y&desc="; rm -rf . > /dev/null &
|
Лучше да, поместить во внешнее хранилище (mysql, файл, и т.п.).
Перед вызовом exec нужно закрыть сессию функцией session_write_close();
Вообще это не очень хорошая идея - использовать сессии. Можно схлопотать дедлок. | |
|
|
|
|
|
|
|
для: Саня
(18.02.2014 в 19:55)
| | понял, тогда лучше буду использовать промежуточную таблицу и передавать лишь ИД.
верно составил отправку без --, т.к. передается только 1 параметр - число?
exec('/usr/bin/php sendMessage.php '.$id.' > /dev/null &');
|
> Перед вызовом exec нужно закрыть сессию функцией session_write_close();
зачем? мне ведь нужно в сессию писать статистику по отправленным письмам, дабы ее в реальном времени сразу отображать оператору
> Можно схлопотать дедлок.
письма рассылать будут 2 оператора, каждый из операторов начав отправку, будет ожидать окончания ее, после чего сможет приступить к следующей отправке | |
|
|
|
|
|
|
|
для: TetRiska
(18.02.2014 в 21:28)
| | Закрывать сессию надо чтобы избежать возможного дедлока. Стандартный файловый обработчик сессии накладывает эксклюзивную блокировку на файл сессии при старте. Поэтому при запуске нового скрипта он будет ожидать освобождения блокировки, а скрипт, его запустивший, будет ожидать выполнение дочерней программы. Вот и дедлок. Причём не зависящий от количество операторов. | |
|
|
|
|
|
|
|
для: Саня
(20.02.2014 в 10:35)
| | А как тогда мониторить отправку? Хотел писать в сессии, т.к. не хотел затрагивать БД или файлы. Писалась бы статистика в сессию в цикле отправки. | |
|
|
|
|
|
|
|
для: TetRiska
(20.02.2014 в 12:28)
| | Да как угодно! Хоть сессиями, хоть ещё как. | |
|
|
|
|
|
|
|
для: Саня
(20.02.2014 в 15:15)
| | чего-то не совсем пойму. если закрыть сессию в скрипте который запускает фоновый скрипт рассылки, то в этом фоновом скрипте я то смогу открыть новую сессию и туда писать данные, но я не смогу выловить эту сессию в скрипте, который будет мониторить эту статистику | |
|
|
|
|
|
|
|
для: TetRiska
(20.02.2014 в 17:00)
| | Вы можете сохранить идентификатор сессии и по нему восстановить её в мониторном скрипте. Просто надо понимать, что одновременно с одной и той же сессией может работать только один скрипт. | |
|
|
|
|
|
|
|
для: Саня
(18.02.2014 в 19:55)
| | если не сложно, ответьте на вопрос, спасибо | |
|
|
|