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

Форум PHP

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Запустить скрипт в фоне из другого скрипта

Сообщения:  [1-10]   [11-12] 

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

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

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

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

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

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

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

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

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

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

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

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

  Ответить  
 
 автор: 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 оператора, каждый из операторов начав отправку, будет ожидать окончания ее, после чего сможет приступить к следующей отправке

  Ответить  
 
 автор: Саня   (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 в 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; 

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

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

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

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

  Ответить  

Сообщения:  [1-10]   [11-12] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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