Forum Webscript.Ru
Программирование => Perl => Тема начата: Integra от 27 Ноября 2006, 18:17:39
-
Привет, господа! Тема, быть может, поднадоевшая, но помощь нужна. Задачка: есть ядро сайта на Perl, оно генерирует страницу (что-то выводит). Есть куча скриптов на PHP, которые что-то выводят. Требуется запустить эти скрипты из ядра. Пишем:
@php=`php /home/test.php`;
/*можно так, можно через трубы, системы и экзеки*/
В дочернем скрипте что-то выводим на стандартный поток вывода.
Переменная php при этом остается пустой. Где ловить вывод PHPшных скриптов? Тот же вопрос возникает при решении обратной задачи: где ловить perl овских скриптов?
-
хы, как то и даже и не знаешь что в таких случаях сказать ), вроде вопрос серьезный потоки даже вывода, в принципе. я думаю вопрос серьезный и требует обсуждения в узких кругах )
-
я имею в виду что узкие круги как то не могут не отметить ветьеватость этого вопроса )
-
интересно, где ж его взять, если не здесь
-
хы, мне кажется в решении какого то вопроса, в системном подходе к решению есть такие вещи как анализ - разложение сложной структуры до атомов ). попробуйте разбить ваш вопрос на простые три )
-
рекомендую рассмотреть эту тему с точки зрения линуксового программирования, поверьте, она неделима, тк проблемы есть только(!) с выводом интерпретаторов php и perl
-
Integra:
линуксового программирования
вот такого конечно я еще не встречал )
программирование таки на мой взгляд это программирование прежде всего если уж на то пошло.
Ну да ладно, не думал что Вы будете настаивать на своем вопросе )
1. прежде всего мне кажется сомнительным запуск php скриптов написаных под веб, и генерящих страницу из коммандной строки. Мне кажется вы потеряете ряд переменных окружения и скрипт может дать ошибку.
* я бы посоветовал | use LWP;
2. не понимаю причем тут потоки ? к этому вопросу. но вообще они легко делаются
но в принципе если вам интересен этот вопрос советую *Линкольн Д.Штайн "Разработка сетевых программ на Perl"*
простите если не понял в чем ваш вопрос
-
Линкольн-де-Штайна уже скачан, вот прочитаю Гради Буча, читать буду именно его:-)
Потоки в линуксах не делаются, там только процессы форкнуть можно. А потоки не делаются. Они есть. Это, например, print - типа как считать с клавиатуры, но если с другого скрипта чтото перенаправить в этот самый stdin, это хороший способ передачи параметров. Другое дело, что этого конкретно и не получаицо. Конкретно в случае с интерпретаторами.
Кстати, если мы запускаем скрипт php из php-скрипта, весь вывод интерпретатора мы ловим в результирующую переменную. У них эти потоки несчастные совпадают. А вот только пробуем как в первоначальном вопросе - получается трреш, ни php ничо не видит, ни perl
-
а вы бы код написали, так посмотреть, именно что вы делаете?
-
На php все работает вот так:
/*--------------------------*/
echo "other-text";
exec("php result.php &",$ret);
echo $ret[3];
echo "other-text";
?>
Запускаемый скрипт содержит строчки:
/*--------------------------*/
Команда exec выполняет запуск внешней программы с командной строки unix, в данном случае \'php result.php &\' и заносит результат в переменную $ret. Получается массив, на третьей позиции - выведенный в стандартный выходной буфер текст. Можно не делать wait, скрипт работает быстро.
Первый скрипт перенесится на perl, и не выводится ничего.
Верно и обратное.
-
#!/usr/bin/perl
print "================\\n";
$test = `ls -la ./ &`;
print $test;
print "================\\n";
Такой пример линуксового программирования работает?
А вот зачем смешивать два скриптовых языка в пределах одного проекта мне непонятно, неужели нельзя переписать все на одном языке?
-
Пробовали аналогичное, работает. Но! Как только пишем `php p.php &` весь вывод куда-то неожиданно девается.
Или если пишем в php
ecec("perl ./t.pl",$res);
print_r($res);// отладочная расчепятка массива
$res - девственно пустой массив.
-
Integra:
echo "other-text";
exec("php result.php &",$ret);
echo $ret[3];
echo "other-text";
?>
Запускаемый скрипт содержит строчки:
я конечно могу ошибаться, но exec ни в перле ни в пхп не возвращает результат своего выполнения в скрипт который его вызывает. комманда exec создает паралельный процесс, у которого свой собственный вывод. единственное что вы вернете таким методом это 1 в случае безуспешного выполнение exec("php result.php &",$ret); кажется так, но опять же могу ошибаться я новичег
-
# php index.php
X-Powered-By: PHP/5.1.1
Content-type: text/html
# perl 12
================
X-Powered-By: PHP/5.1.1
Content-type: text/html
================
# cat 12
#!/usr/bin/perl
print "================\\n";
$test = `php ./index.php &`;
print $test;
print "================\\n";
-
NeoNox:
А вот зачем смешивать два скриптовых языка в пределах одного проекта мне непонятно, неужели нельзя переписать все на одном языке?
Не будем вдаваться в политику партии и мораль сей басни, но естьу нас тяжеленное ядро сайта на perl, и есть куча модулей на php. Сейчас временно! они запучкаются через редирект, но эту ситуацию нужно исправить. Переписывание ядра и модулей в проекте в ближайшее время не предполагается
-
по поводу возврата смотри документацию
perldoc -f exec
perldoc -f system
-
ravshaniy:
я конечно могу ошибаться, но exec ни в перле ни в пхп не возвращает результат своего выполнения в скрипт который его вызывает. комманда exec создает паралельный процесс, у которого свой собственный вывод. единственное что вы вернете таким методом это 1 в случае безуспешного выполнение exec("php result.php &",$ret); кажется так, но опять же могу ошибаться я новичег
Попробуйте, так работает. Это таинственный шОманизм интерпертатора php, видимо
-
Integra:
Не будем вдаваться в политику партии и мораль сей басни
Ну, то есть вы понимаете, что это потенциально очень тщательно разложенные грабли которые могут больно стукнуть по лбу? Я так понимаю, вам нужно использовать system вместо exec, это и будет ответом скорее всего.
-
Integra:
Попробуйте, так работает. Это таинственный шОманизм интерпертатора php, видимо
даже пытаться не буду, вы ошибаетесь
-
NeoNox:
# php index.phpX-Powered-By: PHP/5.1.1Content-type: text/html
# perl 12================X-Powered-By: PHP/5.1.1Content-type: text/html
================# cat 12#!/usr/bin/perl
print "================\\n";
$test = `php ./index.php &`;print $test;print "================\\n";
Переделано так:
#!/usr/bin/perl
print "Content-type: text/html";
print "================\\n";
$test = `php ./index.php &`;
print $test;
print "================\\n";
// запускаемый
#!/usr/bin/php
Content-type: text/html
echo "11111";
Apache выдает матюги:
Security Alert! The PHP CGI cannot be accessed directly.
Как бишь опция в перле называется, которая в php --enable-force-cgi-redirect?
Пробовали ``, system, exec, passthru, и конечно pipes, дабы подождать окончания запускаемого скрипта. Не видит!!!!!
то есть в php через пайп передаем данные в perl скрипт, а в перл-скрипте пишем print ;. Ни-че-го!
-
ravshaniy:
даже пытаться не буду, вы ошибаетесь
Apache/1.3.33 Server php 4
-
У меня выдает
Content-type: text/html================
X-Powered-By: PHP/5.1.1
Content-type: text/html
Content-type: text/html
echo "11111";================
Копайте пхп, к сожалению в настройках пхп я не силен, подсказать вам не смогу.
Integra:
Как бишь опция в перле называется, которая в php --enable-force-cgi-redirect?
Что она дает?
Integra:
то есть в php через пайп передаем данные в perl скрипт, а в перл-скрипте пишем print ;. Ни-че-го!
Пример покажите.
-
NeoNox:
Content-type: text/html================ X-Powered-By: PHP/5.1.1 Content-type: text/html
Content-type: text/html echo "11111";================
это я лоханулась, там нада в php писать еcho "Content-type: text/html"
У вас запускается, это уже радует!!!У вас какой Апач и ос? Может, у вас там гдето опция установлена, аналогичная --enable-force-cgi-redirect, это разрешение запуска скрипта из скрипта
-
NeoNox:
Пример покажите.
Пример с трубой
// php
#!/usr/bin/php
//exec("perl ./test.pl",$q);
//print_r($q);
echo "1";
$handle = popen(\'perl -e t.pl\', \'w\');
fwrite($handle,"test");
fclose($handle);
echo "2";
?>
// запускаемый
#!/usr/bin/perl
print "Content-Type: text/html\\n\\n";
print ;
print "2121";
В док php написано - popen кидает все на стандратный поток ввода
-
cat /etc/redhat-release
Red Hat Linux release 7.2 (Enigma)
Апачей у меня в системе штук 20. Я даже не думал что пхп установленно, как и с какими опциями он установлен, сами понимаете, я не ведаю.
Integra:
$handle = popen(\'perl -e t.pl\', \'w\');
Зачем ключ -е?
Перлового скрипта я тоже не понял, что он должен делать? Вы его с консоли запускали?
-
NeoNox:
Перлового скрипта я тоже не понял, что он должен делать? Вы его с консоли запускали?
Не сильна в опциях интерпретатора perl. Но мы и без ключа запускали, эффект тот же...Ничего не происходит.
Теперь о перловом скрипте: он должен генерировать страницу с выведенным стандартным потоком ввода.
Интересен эффект: если мы передаем через трубу данные
$handle = popen(\'usr/sbin/sendmai -t -i\', \'w\');
fwrite($handle,"From: me");
fclose($handle);
То утилита sendmail считывает все, что нада и работает как нада.
А на вашей апаче такая штука идет? Которая с каналами?
-
NeoNox:
Вы его с консоли запускали?
Мы его на каравановском сервере запускали :-) Выводит, собака, цифры 2121, а на STDIN - ни-че-го
-
Integra,
попробуйте этот вариант:// php
#!/usr/bin/php
//exec("perl ./test.pl",$q);
//print_r($q);
echo "1";
$handle = popen(\'perl -e t.pl\', \'w\');
fwrite($handle,"test"."\\n");
fclose($handle);
echo "2";
?>
// запускаемый
#!/usr/bin/perl
my $in = ;
print "Content-Type: text/html\\n\\n";
print , $in;
-
AnnA:
попробуйте этот вариант:
низачот к сожалению :-(
http://www.edunews.ru/sprav/test.php - пресловутые цифры 12 вместо 1test2
Не работает на линуксах и на виндах.
-
мой php тоже оставляет желать лучшего, но всё же - по аналогии - правильно было бы напечатать, то что получили:
// php
#!/usr/bin/php
//exec("perl ./test.pl",$q);
//print_r($q);
echo "1";
$handle = popen(\'perl -e t.pl\', \'w\');
fwrite($handle,"test"."\\n");
fclose($handle);
echo "$handle 2";
?>
-
AnnA:
Эффекта 0. И это логично. В линуксах когда мы закрываем трубу, отвисает процесс на другом конце трубы (до этого волшебного момента он блокирован), а потом читает ВСЕ из трубы. Это можно посмотреть, по моему, в man mknod или man pipe
-
Integra:
Теперь о перловом скрипте: он должен генерировать страницу с выведенным стандартным потоком ввода.
Ваш скрипт при всем вашем желании не умеет этого делать, послушайте Анну.
Integra:
Не сильна в опциях интерпретатора perl.
А стоит, если собираетесь писать на perl. perldoc perlrun
Integra:
А на вашей апаче такая штука идет? Которая с каналами?
Моя Апача вообще не знает о присутствии в системе пхп или перла, что правильно. Апачу свое, перлу свое. Мне не понятно ваше заблуждение относительно веб-сервиса и обязательной его связки со скриптовым языком. Вам для справки, когда написали перл, веб-сервер апачи еще не был придуман. И каналы с трубами и всем прочим к веб-серверу не имеют ни малейшего отношения.
Integra:
Мы его на каравановском сервере запускали :-) Выводит, собака, цифры 2121, а на STDIN - ни-че-го
Потому как и не обязан их выводить. Опишите построчно что делает каждая строка перлового скрипта, но сначала почитайте документацию, ибо вы заблуждаетесь.
-
если вы уже апач приплели, то можете просто генерить запрос
Запрос в PHP:
#array file ( string filename [, int use_include_path [, resource context]] )
Запрос в Perl:
use LWP;
my $def_url = shift || http://default.url\';
my ($line) = get_url_content($def_url);
#http://search.cpan.org/~gaas/libwww-perl-5.805/lib/LWP.pm#The_Response_Object
sub get_url_content {
my $url = $_[0];
my $agent = LWP::UserAgent->new;
my $request = HTTP::Request->new( GET => $url );
my $response = $agent->request($request);
$response->is_success or die "can\'t connect $url", $response->message, "\\n";
return $response->content();
}
-
NeoNox:
Моя Апача вообще не знает о присутствии в системе пхп или перла, что правильно. Апачу свое, перлу свое. Мне не понятно ваше заблуждение относительно веб-сервиса и обязательной его связки со скриптовым языком. Вам для справки, когда написали перл, веб-сервер апачи еще не был придуман. И каналы с трубами и всем прочим к веб-серверу не имеют ни малейшего отношения.
Не имеет, говорите? Имеет, однако, когда интерпертатор установлен в качесве модуля апаче. Там своя интересная специфика
-
ravshaniy
Опишите, пожалуйста, что ваш код делает.
-
отправляет запрос, получает ответ в переменную
-
ravshaniy:
При запросе таким образом мы просто получаем содержимое скрипта. Вот что на выводе:
#!/usr/bin/php Array ( - => #!/usr/bin/perl [1] => print "Content-Type: text/html\\n\\n"; [2] => print "ewdsadsadasd"; )
-
NeoNox:
Опишите построчно что делает каждая строка перлового скрипта, но сначала почитайте документацию, ибо вы заблуждаетесь.
print ; - должен печатать то, что есть в стандартном входном потоке. Пример из книжки. Остальное ясно.
Да, я заблуждаюсь, в чем- не знаю, но способ, как решить первоначальную проблему именно запуском скрипта из скрипта, так и не найден. А так как я заблуждаюсь, мне и нужна помощь.
-
Integra:
print ; - должен печатать то, что есть в стандартном входном потоке. Пример из книжки. Остальное ясно.
perl -e "print \'it works\'" | perl -le "print "
Integra:
Да, я заблуждаюсь, в чем- не знаю, но способ, как решить первоначальную проблему именно запуском скрипта из скрипта, так и не найден.
Я уже написал в начале прошлой страницы perldoc -f system, так сложно прочитать? Тем более вот здесь вы уже локализовали проблему
http://forums.webscript.ru/showthread.php?s=&postid=146691#post146691
которая решается путем установки флага
force_cgi_redirect = 0
в php.ini файле.
-
вот вам еще пример#cat test.pl
#!/usr/bin/perl
open (SP, "| perl ./t.pl");
print SP "stuff\\n";
close (SP);
# cat t.pl
#!/usr/bin/perl
print "Content-Type: text/html\\n\\n";
print ;
print "2121";
и пища для размышлений
http://perldoc.perl.org/perlipc.html
-
Integra:
При запросе таким образом мы просто получаем содержимое скрипта.
ну не содержимое а результат его работы между прочим
-
ravshaniy
Благодарю. Ваш способ есть решение проблемы! Спасибо за идею!