2010-11-26 3 views
1

Im пытается выполнить perl-скрипт из PHP-скрипта. У меня была эта работа с использованием различных методов, таких как exec, popen и proc_open, но у меня есть пара проблем, вокруг которых старый добрый Google не дает мне ответов.Запустить perl-файл из PHP-скрипта, но не дождаться выхода на Windows Server

Мне нужно запустить скрипт .pl (передавая одну переменную скрипту, который является числом) из файла php, но остановите PHP-скрипт от ожидания до завершения .pl. 4-5 часов для запуска на сервере). Я не ожидаю возврата из сценария perl (perl-скрипт записывает свой вывод в mysql db), поэтому мне просто нужно, чтобы он работал на сервере и продолжал скрипт php.

Есть некоторые препятствия, которые можно преодолеть при запуске на машинах Windows, работающих под управлением apache, php, mysql.

Я думаю, что я видел решение для Linux, но он должен оставаться на машине Windows.

Im ток пробуя proc_open подход, используя следующий код (35 на proc_open линии тест идентификатор Мне нужно передать в скрипт Perl):

$descriptorspec = array(
0 => array("pipe","r"), 
1 => array("pipe","w"), 
2 => array("file","./error.log","a") 
) ; 

proc_close(proc_open('perl perlscript.pl 35', $descriptorspec, $pipes)); 

$i = 0; 
while ($i < 1000) { 
    echo ++$i; 
} 

Теперь этот код действительно выполнить скрипт на языке Perl но цикл while Ive, размещенный после него (только для тестирования), никогда не выполняется (ive не дождался завершения скрипта perl, чтобы убедиться, что он это делает), поскольку он должен ждать завершения .pl.

+0

Это, кажется, дает ответ для Linux, но каждый может пролить свет на него для Windows-машины. Http: // StackOverflow.com/questions/3420949/php-using-proc-open-so-that-it-doesnt-wait-for-the-script-it-opens-running-to-fin – azzy81 2010-11-26 11:27:18

ответ

0

Спасибо всем, кто ответил на этот вопрос. После долгих исследований и возиться с различными решениями, я наконец получил кое-что, чтобы работать и удовлетворить наши потребности. Это далеко не идеально, но эй, это работает, поэтому я не собираюсь жаловаться слишком много.

Поскольку это похоже на то, что другие люди хотят знать, Id Id Id делится моим решением.

  1. Я скачал маленькую программу под названием HSTART (40kb) отсюда: http://www.ntwind.com/software/utilities/hstart.html

  2. Я извлек файлы в C: \ WINDOWS \ system32.

Программа hstart имеет возможность запускать командные файлы без открытия командного окна. Он не будет работать напрямую с файлом .pl, поэтому мне пришлось создать .bat для вызова .pl следующим образом.

  1. создал .bat файл тот же каталог, как мой .pl файл, который в основном называется скрипт на языке Perl, используя локально установленный Perl и передавая переменную. Как показано здесь:

    Perl script.pl% 1

  2. В моем PHP скрипт я использовал следующую команду для вызова мой файл Perl.

    $ cmd = 'hstart/NOCONSOLE "run.bat'. $ Id. '"> Log.log'; exec ($ cmd);

  3. Запуск php-файла заставляет hstart открываться с помощью noconsole из-за установленного флага, откройте файл perl с $ id, который я передал в качестве переменной, и отправьте весь вывод скрытого окна консоли в log.log, как указано в моя команда. Все, что я вижу, это perl.exe, запущенный в моем диспетчере задач.

Как я уже сказал, далек от совершенства, но он работает.

0

Я вижу 3 варианта:

  • Использование fork в вашем PERL скрипт раскошелиться от фактической работы с существующей сразу после развилки родительского процесса. Однако это может не работать корректно или вообще на Windows, но стоит попробовать.

    Пожалуйста, смотрите следующий "fork на Windows" ссылка:

  • Если PHP может запустить URL запрос (похожий на LWP Perl или wget), а затем конвертируйте свой Perl-скрипт t в скрипт CGI (тривиальный), вставьте его в свой каталог CGI Apache и вызовите его по правильному URL-адресу до http://localhost/.... Затем вычеркните URL-запрос через какой-либо временной тайм-аут PHP или обычный тайм-аут HTTP в худшем случае. В ДЕЙСТВИТЕЛЬНО худшем случае, сделайте тот же трюк из кода Perl, поскольку Perl может определенно поддерживать как вызов URL через библиотеки LWP, так и таймаут через alarm()

  • Необходимо, чтобы планировщик запускал ваш Perl-скрипт каждые X минут. Сценарий должен начинаться со следующей логики: if (-e $flag_file) { unlink $flag_file; do_long_work() } else { exit 0; } где $flag_file - специальное расположение на сервере (скажем C:\temp\myscript_start_perl.txt), а do_long_work() содержит фактическую работу, которую необходимо выполнить.

    Затем, когда скрипт PHP должен запустить скрипт Perl, он просто создает пустой файл флага (тот же C:\temp\myscript_start_perl.txt), который будет замечен скриптом Perl в следующий раз, когда планировщик выполнит его.

+0

Откат вилки не работает на Windows – 2010-11-26 12:06:28

0

Есть две возможности

  1. Использование программы "Старт"

    . Вы не сможете использовать трубы, а только аргументы командной строки.

  2. Создайте постоянно действующую программу Perl (запустите при запуске или с помощью Win32 :: Daemon). Подключайтесь к нему с помощью сокетов или http. Это легко, так как есть много готовых серверов на CPAN

Кроме того, это может быть возможно сделать это из другой программы Perl с использованием Win32 :: Работа или Win32 :: Process или какой-либо другой модуль CPAN.

0

Я недавно опубликовал модуль для выполнения задач, как это: Win32::Detached

Добавить его в свой сценарий на языке Perl, и он будет демоном себя, позволяя PHP скрипт двигаться дальше.

 Смежные вопросы

  • Нет связанных вопросов^_^