Запуск внешнего приложения в PHP

serg1k

Новичок
Запуск внешнего приложения в PHP

До этого момента делал так:
PHP:
system("/usr/bin/php index.php action=run id=$row[0] > /dev/null &");
На своем сервере все ок, но на обычных хостингах возникает проблема, когда отключены функции по-типу system().

Возможен запуск по типу file_get_contents("http://site/index.php?action=run&id=".$row[0])... Но...
Команда должна выполняться в фоне, т.е. чтобы пользователь мог дальше продолжать работу не дожидаясь ее выполнения.

Есть ли какой-то универсальны вариант, который будет работать везде?
 

serg1k

Новичок
Страницы не удаленные, а лежат на этом же сайте, т.е. один скрипт лежит, который и нужно запускать. Скрипт довольно тяжелый и запуск может происходить так:
PHP:
system("/usr/bin/php index.php action=run id=2 > /dev/null &");
system("/usr/bin/php index.php action=run id=16 > /dev/null &");
...
Т.е. несколько раз подряд запуск с разными параметрами, и нужно чтобы параллельно шло выполнение, без ожидания, пока выполниться предыдущая команда.
 

jrip

Новичок
А для каких задач подобное используется?

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

serg1k

Новичок
Система по работе с контентом, скрипты обработки.
С фреймами бы не очень хотелось именть дело.
 

fixxxer

К.О.
Партнер клуба
складываешь что надо сделать в очередь, запускаешь кроном скрипт который ее разгребает
 

jrip

Новичок
хм.. что-то мне подсказывает, что если там нельзя system, то и крона скорее всего нет.. и тут как раз, наверное, крон и имитируется...

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

serg1k

Новичок
Автор оригинала: fixxxer
складываешь что надо сделать в очередь, запускаешь кроном скрипт который ее разгребает
А можно поподробнее?

CRON на хостингах есть. Но добавить все запускаемые скрипты в крон вручную не вариант, потому что их довольно много. Нужно чтобы все это проходило через скрипт.

Я тут подумал, а реально в несколько потоков делать file_get_contents(...), только не через file_get_contents, а на сокетах например?
 

fixxxer

К.О.
Партнер клуба
зачем все добавлять? одного достаточно, который будет очередь разгребать.
 

TutanXamoN

Новичок
что я вижу из поставленной задачи так ето запуск скрипта с предопределёнными параметрами. Ставишь запуск крона с одним параметром. А там сам скрипт при первом запуске отработав будет запускать себя с другими параметрами.
при таком решении нет паралельного выполнения, но при заданных условиях я вижу только такой вариант.
 

fixxxer

К.О.
Партнер клуба
ну епрст
все разжевывать надо
делаешь табличку
processqueue(id auto_increment, script_name varchar, parameters varchar)
в крон пихам process_queue.php с нужной частотой (да хоть бы и раз в секунду)

lock processqueue
select * from processqueue order by id limit 1
if (empty($result)) {
unlock processqueue
} else {
delete from processqueue where id=$id
unlock processqueue
unserialize $parameters
include $script
}

конечно по хорошему лучше статусы еще вести, timestampы писать чтобы отслеживать что отвалилось...
 

jrip

Новичок
Автор так и не объяснил что же он хочет сделать.. кстати на счёт крона

"Команда должна выполняться в фоне, т.е. чтобы пользователь мог дальше продолжать работу не дожидаясь ее выполнения." - крон то как бы не совсем то решение, которое требовалось автору изначально.
 

fixxxer

К.О.
Партнер клуба
>ну погарячился немного, раз в минуту максимум
угу :)
 

serg1k

Новичок
Да, высад... Просто главная проблема - это сохранить "многопоточность". Если запуск производить как в моем первом посте, то создается несколько PHP процессов выполняющихся параллельно.

Похоже что нет подходящей замены system`у...
 

crocodile2u

http://vbolshov.org.ru
Просто главная проблема - это сохранить "многопоточность". Если запуск производить как в моем первом посте, то создается несколько PHP процессов выполняющихся параллельно.
так вот она какая - МНОГОПОТОЧНОСТЬ...

serg1k
Ты хоть проверил для начала свои слова?
 

cDLEON

Онанист РНРСlub
[offtop]
Гы-гы)
Тема напоминает старую, заезженную тему про многопроцессорность в СИ...
Аля void main0() void main1()....
[/offtop]
 
Сверху