Forum Webscript.Ru

Программирование => Perl => Тема начата: Integra от 27 Ноября 2006, 18:17:39

Название: Запуск PHP скрипта из Perl
Отправлено: Integra от 27 Ноября 2006, 18:17:39
Привет, господа! Тема, быть может, поднадоевшая, но помощь нужна. Задачка: есть ядро сайта на Perl, оно генерирует страницу (что-то выводит). Есть куча скриптов на PHP, которые что-то выводят. Требуется запустить эти скрипты из ядра. Пишем:
@php=`php /home/test.php`;
/*можно так, можно через трубы, системы и экзеки*/
В дочернем скрипте что-то выводим на стандартный поток вывода.
 Переменная php при этом остается пустой. Где ловить вывод PHPшных скриптов? Тот же вопрос возникает при решении обратной задачи: где ловить perl овских скриптов?
Название: Запуск PHP скрипта из Perl
Отправлено: ravshaniy от 04 Декабря 2006, 17:31:52
хы, как то и даже и не знаешь что в таких случаях сказать ), вроде вопрос серьезный потоки даже вывода, в принципе. я думаю вопрос серьезный и требует обсуждения в узких кругах )
Название: Запуск PHP скрипта из Perl
Отправлено: ravshaniy от 04 Декабря 2006, 17:33:12
я имею в виду что узкие круги как то не могут не отметить ветьеватость этого вопроса )
Название: Запуск PHP скрипта из Perl
Отправлено: Integra от 04 Декабря 2006, 17:56:52
интересно, где ж его взять, если не здесь
Название: Запуск PHP скрипта из Perl
Отправлено: ravshaniy от 04 Декабря 2006, 18:04:13
хы, мне кажется в решении какого то вопроса, в системном подходе к решению есть такие вещи как анализ - разложение сложной структуры до атомов ). попробуйте разбить ваш вопрос на простые три )
Название: Запуск PHP скрипта из Perl
Отправлено: Integra от 04 Декабря 2006, 18:06:49
рекомендую рассмотреть эту тему с точки зрения линуксового программирования, поверьте, она неделима, тк проблемы есть только(!) с выводом интерпретаторов php и perl
Название: Запуск PHP скрипта из Perl
Отправлено: ravshaniy от 04 Декабря 2006, 18:28:01
Цитировать
Integra:
линуксового программирования

вот такого конечно я еще не встречал )

программирование таки на мой взгляд это программирование прежде всего если уж на то пошло.

Ну да ладно, не думал что Вы будете настаивать на своем вопросе )

1. прежде всего мне кажется сомнительным запуск php скриптов написаных под веб, и генерящих страницу из коммандной строки. Мне кажется вы потеряете ряд переменных окружения и скрипт может дать ошибку.
* я бы посоветовал | use LWP;
2. не понимаю причем тут потоки ? к этому вопросу. но вообще они легко делаются
но в принципе если вам интересен этот вопрос советую *Линкольн Д.Штайн "Разработка сетевых программ на Perl"*

простите если не понял в чем ваш вопрос
Название: Запуск PHP скрипта из Perl
Отправлено: Integra от 04 Декабря 2006, 18:35:40
Линкольн-де-Штайна уже скачан, вот прочитаю Гради Буча, читать буду именно его:-)

Потоки в линуксах не делаются, там только процессы форкнуть можно. А потоки не делаются. Они есть. Это, например, print - типа как считать с клавиатуры, но если с другого скрипта чтото перенаправить в этот самый stdin, это хороший способ передачи параметров. Другое дело, что этого конкретно и не получаицо. Конкретно в случае с интерпретаторами.
Кстати, если мы запускаем скрипт php из php-скрипта, весь вывод интерпретатора мы ловим в результирующую переменную. У них эти потоки несчастные совпадают. А вот только пробуем как в первоначальном вопросе - получается трреш, ни php ничо не видит, ни perl
Название: Запуск PHP скрипта из Perl
Отправлено: ravshaniy от 04 Декабря 2006, 18:46:04
а вы бы код написали, так посмотреть, именно что вы делаете?
Название: Запуск PHP скрипта из Perl
Отправлено: Integra от 04 Декабря 2006, 18:49:50
На php все работает вот так:
 /*--------------------------*/
echo "other-text";
exec("php result.php &",$ret);
echo $ret[3];
echo "other-text";
?>
Запускаемый скрипт содержит строчки:


 /*--------------------------*/
Команда exec выполняет запуск внешней программы с командной строки unix, в данном случае \'php result.php &\' и заносит результат в переменную $ret. Получается массив, на третьей позиции - выведенный в стандартный выходной буфер текст. Можно не делать wait, скрипт работает быстро.

Первый скрипт перенесится на perl, и не выводится ничего.
Верно и обратное.
Название: Запуск PHP скрипта из Perl
Отправлено: NeoNox от 04 Декабря 2006, 19:06:14
#!/usr/bin/perl

print "================\\n";

$test = `ls -la ./ &`;
print $test;
print "================\\n";

Такой пример линуксового программирования работает?

А вот зачем смешивать два скриптовых языка в пределах одного проекта мне непонятно, неужели нельзя переписать все на одном языке?
Название: Запуск PHP скрипта из Perl
Отправлено: Integra от 04 Декабря 2006, 19:12:42
Пробовали аналогичное, работает. Но! Как только пишем `php p.php &` весь вывод куда-то неожиданно девается.
Или если пишем в php
ecec("perl ./t.pl",$res);
print_r($res);// отладочная расчепятка массива
$res - девственно пустой массив.
Название: Запуск PHP скрипта из Perl
Отправлено: ravshaniy от 04 Декабря 2006, 19:16:22
Цитировать
Integra:
echo "other-text";
exec("php result.php &",$ret);
echo $ret[3];
echo "other-text";
?>
Запускаемый скрипт содержит строчки:

я конечно могу ошибаться, но exec ни в перле ни в пхп не возвращает результат своего выполнения в  скрипт который его вызывает. комманда exec создает паралельный процесс, у которого свой собственный вывод. единственное что вы вернете таким методом это 1 в случае безуспешного выполнение exec("php result.php &",$ret); кажется так, но опять же могу ошибаться я новичег
Название: Запуск PHP скрипта из Perl
Отправлено: NeoNox от 04 Декабря 2006, 19:16:31
# 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";
Название: Запуск PHP скрипта из Perl
Отправлено: Integra от 04 Декабря 2006, 19:18:30
Цитировать
NeoNox:
А вот зачем смешивать два скриптовых языка в пределах одного проекта мне непонятно, неужели нельзя переписать все на одном языке?

Не будем вдаваться в политику партии и мораль сей басни, но естьу нас тяжеленное ядро сайта на perl, и есть куча модулей на php. Сейчас временно! они запучкаются через редирект, но эту ситуацию нужно исправить. Переписывание ядра и модулей в проекте в ближайшее время не предполагается
Название: Запуск PHP скрипта из Perl
Отправлено: NeoNox от 04 Декабря 2006, 19:19:03
по поводу возврата смотри документацию
perldoc -f exec
perldoc -f system
Название: Запуск PHP скрипта из Perl
Отправлено: Integra от 04 Декабря 2006, 19:20:55
Цитировать
ravshaniy:
я конечно могу ошибаться, но exec ни в перле ни в пхп не возвращает результат своего выполнения в скрипт который его вызывает. комманда exec создает паралельный процесс, у которого свой собственный вывод. единственное что вы вернете таким методом это 1 в случае безуспешного выполнение exec("php result.php &",$ret); кажется так, но опять же могу ошибаться я новичег



Попробуйте, так работает. Это таинственный шОманизм интерпертатора php, видимо
Название: Запуск PHP скрипта из Perl
Отправлено: NeoNox от 04 Декабря 2006, 19:22:25
Цитировать
Integra:
Не будем вдаваться в политику партии и мораль сей басни

Ну, то есть вы понимаете, что это потенциально очень тщательно разложенные грабли которые могут больно стукнуть по лбу? Я так понимаю, вам нужно использовать system вместо exec, это и будет ответом скорее всего.
Название: Запуск PHP скрипта из Perl
Отправлено: ravshaniy от 04 Декабря 2006, 19:35:44
Цитировать
Integra:
Попробуйте, так работает. Это таинственный шОманизм интерпертатора php, видимо

даже пытаться не буду, вы ошибаетесь
Название: Запуск PHP скрипта из Perl
Отправлено: Integra от 04 Декабря 2006, 19:39:23
Цитировать
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 ;. Ни-че-го!
Название: Запуск PHP скрипта из Perl
Отправлено: Integra от 04 Декабря 2006, 19:40:48
Цитировать
ravshaniy:
даже пытаться не буду, вы ошибаетесь

Apache/1.3.33 Server php 4
Название: Запуск PHP скрипта из Perl
Отправлено: NeoNox от 04 Декабря 2006, 19:46:59
У меня выдает
Цитировать
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 ;. Ни-че-го!

Пример покажите.
Название: Запуск PHP скрипта из Perl
Отправлено: Integra от 04 Декабря 2006, 19:52:02
Цитировать
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, это разрешение запуска скрипта из скрипта
Название: Запуск PHP скрипта из Perl
Отправлено: Integra от 04 Декабря 2006, 19:55:42
Цитировать
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 кидает все на стандратный поток ввода
Название: Запуск PHP скрипта из Perl
Отправлено: NeoNox от 04 Декабря 2006, 20:05:28
cat /etc/redhat-release
Red Hat Linux release 7.2 (Enigma)

Апачей у меня в системе штук 20. Я даже не думал что пхп установленно, как и с какими опциями он установлен, сами понимаете, я не ведаю.

Цитировать
Integra:
$handle = popen(\'perl -e t.pl\', \'w\');

Зачем ключ -е?

Перлового скрипта я тоже не понял, что он должен делать? Вы его с консоли запускали?
Название: Запуск PHP скрипта из Perl
Отправлено: Integra от 04 Декабря 2006, 20:19:51
Цитировать
NeoNox:
Перлового скрипта я тоже не понял, что он должен делать? Вы его с консоли запускали?


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


Теперь о перловом скрипте: он должен генерировать страницу с выведенным стандартным потоком ввода.


Интересен эффект: если мы передаем через трубу данные
$handle = popen(\'usr/sbin/sendmai -t -i\', \'w\');
fwrite($handle,"From: me");
fclose($handle);


То утилита sendmail считывает все, что нада и работает как нада.

А на вашей апаче такая штука идет? Которая с каналами?
Название: Запуск PHP скрипта из Perl
Отправлено: Integra от 04 Декабря 2006, 20:23:43
Цитировать
NeoNox:
 Вы его с консоли запускали?

Мы его на каравановском сервере запускали :-) Выводит, собака, цифры 2121, а на STDIN - ни-че-го
Название: Запуск PHP скрипта из Perl
Отправлено: AnnA от 04 Декабря 2006, 20:35:31
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;
Название: Запуск PHP скрипта из Perl
Отправлено: Integra от 04 Декабря 2006, 20:44:37
Цитировать
AnnA:
попробуйте этот вариант:

низачот к сожалению :-(
http://www.edunews.ru/sprav/test.php - пресловутые цифры 12 вместо 1test2

Не работает на линуксах и на виндах.
Название: Запуск PHP скрипта из Perl
Отправлено: AnnA от 04 Декабря 2006, 20:50:13
мой 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";
?>
Название: Запуск PHP скрипта из Perl
Отправлено: Integra от 04 Декабря 2006, 20:58:44
Цитировать
AnnA:


Эффекта 0. И это логично. В линуксах когда мы закрываем трубу, отвисает процесс на другом конце трубы (до этого волшебного момента он блокирован), а потом читает ВСЕ из трубы. Это можно посмотреть, по моему, в man mknod или man pipe
Название: Запуск PHP скрипта из Perl
Отправлено: NeoNox от 04 Декабря 2006, 23:33:11
Цитировать
Integra:
Теперь о перловом скрипте: он должен генерировать страницу с выведенным стандартным потоком ввода.

Ваш скрипт при всем вашем желании не умеет этого делать, послушайте Анну.

Цитировать
Integra:
Не сильна в опциях интерпретатора perl.

А стоит, если собираетесь писать на perl. perldoc perlrun

Цитировать
Integra:
А на вашей апаче такая штука идет? Которая с каналами?

Моя Апача вообще не знает о присутствии в системе пхп или перла, что правильно. Апачу свое, перлу свое. Мне не понятно ваше заблуждение относительно веб-сервиса и обязательной его связки со скриптовым языком. Вам для справки, когда написали перл, веб-сервер апачи еще не был придуман. И каналы с трубами и всем прочим к веб-серверу не имеют ни малейшего отношения.

Цитировать
Integra:
Мы его на каравановском сервере запускали :-) Выводит, собака, цифры 2121, а на STDIN - ни-че-го

Потому как и не обязан их выводить. Опишите построчно что делает каждая строка перлового скрипта, но сначала почитайте документацию, ибо вы заблуждаетесь.
Название: Запуск PHP скрипта из Perl
Отправлено: ravshaniy от 05 Декабря 2006, 10:56:44
если вы уже апач приплели, то можете просто генерить запрос

Запрос в 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();
}
Название: Запуск PHP скрипта из Perl
Отправлено: Integra от 05 Декабря 2006, 13:20:59
Цитировать
NeoNox:
Моя Апача вообще не знает о присутствии в системе пхп или перла, что правильно. Апачу свое, перлу свое. Мне не понятно ваше заблуждение относительно веб-сервиса и обязательной его связки со скриптовым языком. Вам для справки, когда написали перл, веб-сервер апачи еще не был придуман. И каналы с трубами и всем прочим к веб-серверу не имеют ни малейшего отношения.

Не имеет, говорите? Имеет, однако, когда интерпертатор установлен в качесве модуля апаче. Там своя интересная специфика
Название: Запуск PHP скрипта из Perl
Отправлено: Integra от 05 Декабря 2006, 13:39:48
ravshaniy
Опишите, пожалуйста, что ваш код делает.
Название: Запуск PHP скрипта из Perl
Отправлено: ravshaniy от 05 Декабря 2006, 13:50:33
отправляет запрос, получает ответ в переменную
Название: Запуск PHP скрипта из Perl
Отправлено: Integra от 05 Декабря 2006, 14:09:09
Цитировать
ravshaniy:

При запросе таким образом мы просто получаем содержимое скрипта. Вот что на выводе:
#!/usr/bin/php Array (
Название: Запуск PHP скрипта из Perl
Отправлено: Integra от 05 Декабря 2006, 14:35:54
Цитировать
NeoNox:
Опишите построчно что делает каждая строка перлового скрипта, но сначала почитайте документацию, ибо вы заблуждаетесь.


print ; - должен печатать то, что есть в стандартном входном потоке.  Пример из книжки. Остальное ясно.

Да, я  заблуждаюсь, в чем- не знаю, но способ, как решить первоначальную проблему именно запуском скрипта из скрипта, так и не найден. А так как я заблуждаюсь, мне и нужна помощь.
Название: Запуск PHP скрипта из Perl
Отправлено: NeoNox от 05 Декабря 2006, 15:07:00
Цитировать
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 файле.
Название: Запуск PHP скрипта из Perl
Отправлено: NeoNox от 05 Декабря 2006, 15:18:11
вот вам еще пример#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
Название: Запуск PHP скрипта из Perl
Отправлено: ravshaniy от 05 Декабря 2006, 15:29:33
Цитировать
Integra:
При запросе таким образом мы просто получаем содержимое скрипта.

ну не содержимое а результат его работы между прочим
Название: Запуск PHP скрипта из Perl
Отправлено: Integra от 05 Декабря 2006, 15:37:52
ravshaniy
Благодарю. Ваш способ есть решение проблемы! Спасибо за идею!