Toon posts:

[Perl] PHP uitvoeren in Perl

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik gebruik al geruime tijd perl en weet er dus al het een en ander over. Nou ben ik dus bezig een perl script te schrijven voor een site. Het probleem echter is, is dat de hele site in PHP is gemaakt.

Ik gebruik die PHP templates dus voor mijn script. Alleen als ik het uitvoer worden de <? PHP ?> tags niet ingelezen door de PHP compiler (of hoe het ook heet).

Ik heb daar zelf een paar oplossingen voor bedacht, maar vraag me af of er een betere mannier voor is. Hier een paar oplossingen:
Perl:
1
2
3
4
5
6
7
8
9
10
11
12
# $main bevat de gegenereerde website.
$main =~ s/<\? include\(\"(.+?)\"\); \?>/&readvpage($1)/gie;
$main =~ s/<\? require\(\"(.+?)\"\); \?>/&readvpage($1)/gie;

sub readvpage {
    open(FILE,"$_[0]") or &error("Couldn't open $_[0] for reading: $! \n");
    @rdfile = <FILE>;
    close(FILE);
    local $file;
    foreach $line (@rdfile) {$file .= $line;}
    return $file;
}

Met deze oplossing leest hij de komplete site in.

Nu moet mijn perl script dus de gecompilde versie ervan hebben. Dat doe ik nu via een omweg:
Perl:
1
2
3
4
5
6
7
8
9
10
11
12
13
&writefile("rooster.php",$main);
print "Content-type:text/html\n\n";
print qq!
<html>
  <head>
    <meta http-equiv="refresh" content="0;URL=rooster.php">
  </head>
  <body>
    <font face="verdana" size="4">PHP Pagina is gegenereerd</font><br>
    <font face="verdana" size="2">Je word doorgestuurd.</font>
  </body>
</html>!;
exit;

Dit werkt niet echt handig. Je word doorgestuurd naar de gegenereerde php pagina.

Zou dit niet via een betere oplossing kunnen? Is er bijvoorbeeld een functie zodat je alles wat in rooster.php kan laten genereren en in een bestand kan zetten om het daarna weer in te lezen door mijn script?

Ik zit hier al een tijdje mee en kom er niet uit. Ik vond iets via de beruchte search optie als 'print "php rooster.php";' Maar dat print de inhoud niet in mn $main string :S. Misschien is er zo'n feature als in dos, maar dan in perl als: 'dir > dezemap.txt'. Zodat hij alle output in een bestand zet.

[ Voor 0% gewijzigd door Verwijderd op 05-09-2002 14:24 . Reden: perl code tags :) ]


  • Grum
  • Registratie: Juni 2001
  • Niet online
De phpcode door de php executable heentrekken en de output uitspugen.

Verwijderd

Topicstarter
Ja, dat wil ik ook dus doen, maar hoe doe je dat? Dat was me dus niet gelukt..

  • Grum
  • Registratie: Juni 2001
  • Niet online
Zet et in een tempfile en geef die aan de php executable ?

Wat lukt je niet ? :D

  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 30-08 21:01
Run PHP gewoon vanuit de shell. php /home/toz/HTML/start.php ofzo?

offtopic:
Grum, mag ik reageren op je sig? (Note: Je kan alleen PHP als je code clean werkt met error_reporting(E_ALL);) bullshit opmerking PHP is gemaakt om door n00bs te worden geprogrammeerd dus waarom is het fout als je een warning krijgt door PHP terwijl je script gewoon werkt. In C krijg je ook warnings, maar niemand zal zeggen dat je geen C kan als er warnings in zitten.

zeroxcool.net - curity.eu


  • Grum
  • Registratie: Juni 2001
  • Niet online
Ow ? is php daarvoor gemaakt ? .. en Perl dan ? .. dat ook ?

Bv in perl:
code:
1
2
grum@server:~ > perl -we '@a=(1);print @a[0];'
Scalar value @a[0] better written as $a[0] at -e line 1.


Het werkt, je krijgt een warning en dus is perl voor n00bs.

:?

Der is een verschil tussen aan syntax fouten gerelateerde warnings/errors en ECHTE warnings. Bij C kan je best iets echt zo bedoelen en ook willen (bv double->int conversie (of wat dan ook) zonder het expliciet aan te geven omdat het de standaard is dat dat toch gebeurd. Dit is heel anders dan in php gewoon quotes vergeten en dan het geluk hebben dat php door 'meedenkende' mensen is gemaakt.

Verwijderd

Topicstarter
ZeRoXcOol, jij hier :D? Ben niet echt active hier, maar vind het wel grappig een bekende tegen te komen :).

Grum: ik zal het ff anders uitleggen..

Ik schrijf de php dus in een temp file. Dan kan ik natuurlijk 'print "php rooster.php";' uit gaan voeren, maar dat werkt dus niet, het komt dan niet op het scherm terecht! Eerst moet de regel 'print "Content-type:text/html\n\n";' uitgevoerd worden, dan pas komt de output op het scherm :S en als ik daarna 'print "php rooster.php";' doet, dan verscheint dus in de html ipv de gegenereerde php code de string "php rooster.php". Snappie :)?

  • Grum
  • Registratie: Juni 2001
  • Niet online
Wat wil je nou ?

Gegenereerde phpcode printen ?
Uitgevoerde gegenereerde phpcode printen ?

Je bent NOGAL onduidelijk. (Btw het is 'verschijnt')

Verwijderd

Topicstarter
Grum schreef op 05 september 2002 @ 11:21:
Zet et in een tempfile en geef die aan de php executable ?

Wat lukt je niet ? :D
Dat lukt me dus niet ;(. Help mij please, ik heb geen id hoe ik dit moet oplosse. _/-\o_

Verwijderd

Gebruik LWP::Simple om je geparste (php/shtml) content binnen te halen:

code:
1
2
use LWP::Simple;
my $parsed = get("http://blah/blah.php");


Is dit wat je bedoelt?

Verwijderd

Topicstarter
Bedankt, das een soort antwoord wat ik kon gebruiken. Alleen helaas zit er geen LWP module op de host :(. Kan dit via een langere stukje code misschien? Of moet ik contact opnemen met de server admin en vragen of hij die module erop wilt zetten?

Verwijderd

je kan zelf met sockets iets in elkaar knutselen. Al lijkt de oplossing LWP::Simple een betere. Vraag het idd. even aan de server admin. Misschien kan je hem zelf lokaal installeren dan heb je geen server admin nodig...

  • WAcKiN
  • Registratie: November 1999
  • Laatst online: 28-08-2023
Perl:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl -w
 
# Je PHP script
my $phpscript = "<html>Dit is PHP <b><?php print phpversion(); ?></b>!</html>";
 
# Ok, dit is nasty, maar bidirectionele pipes zijn dat ook.
open(PHP, "echo \"$phpscript\" | php -q |") || die "can't fork php: $!";
 
# We lezen het resultaat uit
while (<PHP>) {
    print;
}
 
# Meuh
close PHP || die "bad php: $! $?";

Als je dus PHP (cgi of cli versie) op je (*n?x) server hebt kan je dit dus doen.

Voordeel hiervan is dat je niet met tempfiles hoeft te werken (hoewel named pipes dus daarvoor zijn gemaakt).

Natuurlijk is die echo workaround nasty, maar bidirectionele pipes ook. En dit kon ik zo 123 half uit me hoofd doen. Zie http://www.perldoc.com/perl5.6.1/pod/perlipc.html voor meer info over inter process comms.

[ Voor 0% gewijzigd door WAcKiN op 05-09-2002 12:26 . Reden: geen [perl][/perl]? pfft! ]


Verwijderd

Topicstarter
Bedankt! Ik ben er dus nu al een tijdje mee aan het knutsellen en heb een test perl bestand gemaakt om te kijken of ik het aan de praat krijg. Dit is het resultaat:

Perl:
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl

$main = "<html>Dit is PHP <b><?php print phpversion(); ?></b>!</html>";

open(PHP, "echo \"$main\" | php -q |") || die "can't fork php: $!";
 
while (<PHP>) {
    print;
}

close(PHP);

exit;

Dit levert een hele mooie Internal Server Error op :(. Misschien heb ik iets fout getypt?

Hoe dan ook, als ik het op deze mannier doe krijg ik wel output:
Perl:
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl

$main = "<html>Dit is PHP <b><?php print phpversion(); ?></b>!</html>";

open(PHP, "echo \"$main\" | /usr/local/bin/php -q |") || die "can't fork php: $!";
 
while (<PHP>) {
    print;
}

close(PHP);

exit;

De output is dan:
HTML:
1
2
3
4
5
6
7
8
9
10
11
$main = "<html>Dit is PHP <b>4.0.5</b>!</html>";

open(PHP, "echo \"$main\" | /usr/local/bin/php -q |") || die "can't fork php: $!";
 
while (<PHP>) {
    print;
}

close(PHP);

exit;

Conclusie, met de 2e iets andere versie lukt het wel, alleen dan output hij het perl bestandje zelf..

Ik heb vast wel iets fouts gedaan, maar wat?

  • WAcKiN
  • Registratie: November 1999
  • Laatst online: 28-08-2023
euh, wat er mis gaat is dat je je perl script door PHP haalt, en niet door een perl interpreter (mod_perl of cgi)? :]

Verwijderd

Topicstarter
Hmm het werkte niet op die mannier dus. Ik heb een goede oplossing gevonden en ik denk laat ik het maar posten voor de rest van de wereld :)
Perl:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl

$main = "<?php phpinfo(); phpinfo(INFO_MODULES); ?>";

&writefile("phpscript.php",$main);
$location = "phpscript.php";

print "Location: $location\n";
print "Content-type: text/html\n\n";

sub writefile {
    local $filename = shift(@_);
    open(FILE,">$filename") or &error("Couldn't open $filename for writing: $! \n");
    flock(FILE,2);
    seek(FILE,0,0);
    print FILE @_;
    close(FILE);
}

Veel plezier met deze code!!

Verwijderd

Hmm het werkte niet op die mannier dus. Ik heb een goede oplossing gevonden en ik denk laat ik het maar posten voor de rest van de wereld
Geen LWP::Simple dus...

Toch zou je het volgende nog kunnen overwegen:

Perl:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
use IO::Socket;

# GET

my $Terminator = "\015\012";

my $Host = "blah.nl";
my $Page = "blah.php";
my $Port = 80;

my $GET = "GET /$Page HTTP/1.0${Terminator}Host: $Host$Terminator$Terminator";

my $handle = IO::Socket::INET->new(Proto => "tcp", PeerAddr  => $Host, PeerPort  => $Port) || die

$handle->autoflush(1);  
print $handle $GET;
my @HTTP_doc = <$handle>;
close $handle;

# Strip HTTP header

$" = "";
my $Content = "@HTTP_doc";
$Content =~ s/^(.|$Terminator)+$Terminator$Terminator//;


Geen LWP::Simple nodig, toch hetzelfde resultaat

Verwijderd

Topicstarter
Thanx voor scriptje, maar nu krijg ik met deze script:
Perl:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/usr/bin/perl

use CGI::Carp qw(fatalsToBrowser);

&writefile("phptest.php","<?php phpinfo(); phpinfo(INFO_MODULES); ?>");

use IO::Socket;

# GET

my $Terminator = "\015\012";

my $Host = "tsclan.nl";
my $Page = "~tsmember/phptest.php";
my $Port = 80;

my $GET = "GET /$Page HTTP/1.0${Terminator}Host: $Host$Terminator$Terminator";
my $handle = IO::Socket::INET->new(PeerAddr  => $Host, PeerPort  => $Port, Proto => 'tcp') || die "Error: $!"; 

$handle->autoflush(1);    
print $handle $GET;
my @HTTP_doc = <$handle>;
close($handle);

# Strip HTTP header

$" = "";
my $main = "@HTTP_doc";
$main =~ s/^(.|$Terminator)+$Terminator$Terminator//;

print "Content-type: text/html\n\n";
print $main;

exit;

sub writefile {
    local $filename = shift(@_);
    open(FILE,">$filename") or &error("Couldn't open $filename for writing: $! \n");
    flock(FILE,2);
    seek(FILE,0,0);
    print FILE @_;
    close(FILE);
}
deze output ineens:
HTML:
1
2
3
4
5
6
7
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>302 Found</TITLE>
</HEAD><BODY>
<H1>Found</H1>
The document has moved <A HREF="http://www.tsclan.nl/~tsmember/phptest.php">here</A>.<P>
</BODY></HTML>
Hmm error 302, die had ik niet verwacht, is wat ik vraag wel technies mogenlijk? Of doe ik het gewoon fout?

  • Morphine
  • Registratie: Februari 2002
  • Laatst online: 19-05 18:28
hmm :) wat zou dat nou zijn :p

www.tsclan.nl ;)

Verwijderd

Topicstarter
hehe, ben voor jou bezig hoor, maatje ;) rooster.pl en zcomment.cgi zijn gefixt volgens jou template, nu nog zonder die php redirect en het is af. Dan kunnen we de script altijd nog uitbreiden

Verwijderd

Hmm error 302, die had ik niet verwacht, is wat ik vraag wel technies mogenlijk?
Kan gebeuren, plak eens "www." voor de hostnaam, dan werkt ie wel...
Pagina: 1