Многопоточность:

  • Автор темы maykoff
  • Дата начала
M

maykoff

#1
Проблема:
При обращении к скрипту должно выполняться два действия - вывод (фактически - страничка) и некоторое служебное действие, достаточно протяжённое по времени.
Вывод странички - с помощью smarty.
Заставить пользователя ждать , пока выполнится служебная часть скрипта - некрасиво(время - минуты или даже часы ), да и вывода никакого она на несёт.
Вижу вариант - заапускать служебный скрипт в /bin/ из этого скрипта.
Причём запущенный скрипт должен продолжать работать после завершения запустившего его скрипта столько, сколько потребуется.
Данные для запуска - один int(~10знаков)
У кого есть какие соображения на этот счёт?
Про вариант с Cron`ом помню, но не хотелось бы.
Заранее благодарен за внимание.
 

Murtas

Lotus team
11.04.2006
128
0
#2
может я чего-то не так понимаю, но такую задачку попробовал бы делать через exec

from Help exec()

Note: If you start a program using this function and want to leave it running in the background, you have to make sure that the output of that program is redirected to a file or some other output stream or else PHP will hang until the execution of the program ends.
 
M

maykoff

#3
скорее, это я не совсем точно описал проблему
скрипт:
Код:
#!/var/www/............./cgi-bin/php -q
<?php
include('/var/www/........../bin/func.php');
loging("runrunrun");
exit;
?>
не запускается директивой
Код:
<?php
echo "превед!";
exec("/var/www/....../bin/sending.php > /var/www/f...........a/bin/out.log 2>&1 &");
exit;
?>
при этом изначально запускалось огромное количество процессов, хотя в логах апача виден был только один.
грешили на виртуальность разборщика php, дали ему свой личный разборщик и убрали из патча линки (дали прямой путь)
все права и ownerы , естественно, соответствуют
скрипт не запускается
что делать - прямо не знаю.
 
M

maykoff

#4
Сейчас скрипт запускается, но виснет смертельно, приходится руками killить
Возможно, дело в каких-то специфических настройках апача или php?
был бы очень благодарен за описание настроек апача и phpinfo тех, у кого такая директива отрабатывает корректно (простите за наглость)

при этом скрипт не отрабатывает, вывод в out.log появляется
Ещё момент: при запуске из командной строки первого (запускающего) скрипта всё происходит в наилучшем виде, запускаемый скрипт отрабатывает корректно

при этом скрипт не отрабатывает, вывод в out.log появляется
Ещё момент: при запуске из командной строки первого (запускающего) скрипта всё происходит в наилучшем виде, запускаемый скрипт отрабатывает корректно
 
G

Gisma

#5
/**
* @desc If you want to run somenthing but php just keep processing data and don`t answer until the
* program is closed (run in background mode, without interfering the program), from the note ( If you
* start a program using this function ... PHP will hang until the execution of the program ends ),
* jonas function will certainly be useful for you:
*/
function execInBackground($path, $args = "") {
global $conf;

if (file_exists($path)) {
if (substr(php_uname(), 0, 7) == "Windows"){
pclose(popen("start \"$path\" \"" . $path . "\" " . $args, "r"));
} else {
exec( $path . " " . $args . " > /dev/null &");
}
}
}
Эта функция работает, если не срабатывает, то спешу тебя обрадовать у тебя ошибки в скрипте :)
я как человек который не раз е$ался c CLI могу утверждать точно;_)
 
M

maykoff

#6
простите, а в чём разница? поменяли имя файла вывода?
мы это пробовали - кучу имён перебрали :) - не помогло...
скрипт запускается и корректно отрабатывает из консоли, но призапуске через веб-интерфейс происходит фигня - при отпущеном выводе (не перенаправляя его директивой > )
- скрипт запускается до тех пор, пока не кончаются ресурсы сервера (при этом не отрабатывая), если же вывод в файл - запускается и виснет...
а насчёт неправильностьи скриптов - так их пока ещё нет, скриптов-то.
Смысл писать , если запустить не получается?
листинг скриптов я привёл - это практическти полный листинг, только домен попросили вырезать, чтоб не позориться (стадо умников с полными правами не могут скрипт запустить).
Если интересно - вот ещё листинг func.php из инклюдов :)
Код:
<?php
function loging($str)//запись хода выполнения скрипта
{
//$str=convert_cyr_string($str,"w","k"); //логинг в koi-8
set_magic_quotes_runtime(0);
$fl=@fopen('content.log','a');
@fwrite($fl,$str."\r\n");
@fclose($fl);
set_magic_quotes_runtime(1);
}
?>
 

Murtas

Lotus team
11.04.2006
128
0
#7
тестанул пару раз - все работет ... пользовался exec

сначала ping комаду перенаправил в файл, а потом результаты работы скрипта который просто выводит текст командой echo ... во втором случае нужно было знать сиситеме где находиться php.exe
 
G

Gisma

#8
я имел ввиду что проблемы в запускающем скрипте :ph34r:
поступайте как и все последовательно:
1. проверте, что exec работат (пусть выполнит команду ls)
2. проверте, работу перенаправления вывода
3. запускайте пхп скрипт
и т.д.
 
M

maykoff

#9
exec при запуске через веб не работает (см выше).
В том-то и проблема, включить поддержку exec мы не можем (мы её не отключали :ph34r:)
Exec работает, команда ls выполняется.
Всё хорошо.
Проблемы (см.выше) возникают, когда пытаюсь (!)через веб-интерфейс из одной пхп-шки запустить другую(!).
При той же операции из консоли всё отрабатываент в наилучшем виде.
Вывод пишется, куда ему и предначертано, скрипт работает.
Murtas, я не сомневаюсь, что у вас скрипт работал. Проблема в том, что он не работает у нас.
Практическую актуальность проблема уже потеряла ( служебный скрипт цепляю на хрон, а может отдельным демоном будет, ещё не полностью определился). Но интересно узнать - что ж это за фигня такая. Подозреваю, что дело в каких-то специфических настройках сервера или интерпретатора.
Но в каких, и где искать - просто теряюсь.
 
M

maykoff

#11
замечательно, тогда по прядку:
exec работает;
перенаправление в указанный файл происходит;
при запуске - фигня получается.
итд - второй день уже, не знаю уже, куда бы ещё ткнуться.
Возможно, проблема в разном окружении, но где именно - чёрт его знает .
Понятия не имею, где рыться
 
G

Gisma

#12
проблемы могут вылезти откуда угодно :ph34r: различия вызова пхп программы из-под консоли и из веба значительны (хотя бы переменные ENV и SERVER) поэтому я в свое время комментил все строки и сначала довел до работы простейший скрипт, а уж потом подключал библиотеки и ядра и т.д. и т.п.
 
M

maykoff

#13
листинг скриптов я привёл - это практическти полный листинг, только домен попросили вырезать, чтоб не позориться (стадо умников с полными правами не могут скрипт запустить).
 
M

maykoff

#15
только и остаётся что бубен. Остальные варианты, похоже, я исчерпал.
Пенрвый скрипт чудово всё выводит, как из консоли, так и из веба.
От второго добиться вывода так и не удалось.
Пытается запуститься, висит какое-то время, падает, сногва пытается запуститься, и так, пока его не kill



при этом в логах апача попытка запуска регистрируется единожды, а насамом деле он пытается запуститься неоднократно
 
M

maykoff

#16
Поздравьте, бубен помог, спасибо!
перекомпиллировали php как cli (был cgi), всё заработало.
Подозреваю, что проблема былва именно в окружении - во втором случае, (я до конца не понял) кажется, при запуске, php выстраивает для себя новое окружение.