Thread "Bitte warten"-Zwischenseite (16 answers)
Opened by amun-ra198 at 2008-02-29 23:01

amun-ra198
 2008-03-07 18:36
#106813 #106813
User since
2007-10-11
13 Artikel
BenutzerIn
[default_avatar]
@pq
ok, ich hatte nun die Gelegenheit mich mal mit dem von Dir freundlicherweise erstellten Skript zu beschäftigen. Ich hab das jetzt mal für meine Zwecke angepasst, nahezu nichts verändert. Leider habe ich das Problem, dass die Datei nicht erstellt wird und das Skript ewig in der Schleife läuft. Könntest du das bei dir mal ausprobieren? Hab ich da was übersehen?

Code (perl): (dl )
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#!/usr/bin/perl -w

# Skript Name: test1.pl
# Parameter: Aktionstyp = Prozess

use strict;
use warnings;
use CGI;
use Fcntl qw(:flock);

$| = 1;

my $cgi = CGI->new;
my $url = 'http://server/cgi-bin/test1.pl';

#print "Content-type: text/html \n\n";
#print $cgi->param('Aktionstyp');

# Aufteilen in zwei Subroutinen
my $merker = $cgi->param('Aktionstyp') || 'Anzeigen';
if ($merker eq 'Anzeigen') 
{
    show($cgi);
}
elsif ($merker eq 'Prozess')
{
    create($cgi);
}

# Erstellen des Prozesses und Redirect auf neue Seite
sub create
{
    my ($cgi) = @_;
    
    my $id = time() . $$;
    my $filename = "prozess.id$id";
    
    $SIG{CHLD} = 'IGNORE';
    
    if (my $pid = fork) 
    {
        print $cgi->redirect("$url?Aktionstyp=Anzeigen;id=$id");
        
        # Ende des Parent Prozesses
        exit;
    }
    else 
    {
                        # Beginn Anlegen der Datei
                        open my $fh, ">", $filename;
                        flock $fh, LOCK_EX;
                        close STDOUT;
                        close STDERR;
                        close STDIN;
                        
                        # Erstmal Warten (soll den Prozess simulieren)
                        sleep 10;
                        
                        close $fh;
                        # Ende Anlegen der Datei
                          
                        # Ende des Child Prozesses
                        exit;
    }
}

# Anzeigen des Ergebnisses, wenn ChildProzess fertig
sub show
{
        my ($cgi) = @_;
        my $id = $cgi->param('id') || '';
        
        print $cgi->header;
        print $cgi->start_html;
        
        my $filename = "prozess.id$id";
   
   my $meta = $cgi->start_html(
            my $meta_refresh =
            -head => $cgi->meta(
                {
                    -http_equiv => 'refresh',
                    -content    => "2; $url?w=show;id=$id",
                }
            ));
        
        if (open my $fh, "<", $filename) 
        {
                my $lock = flock $fh, LOCK_EX|LOCK_NB;
      
      if ($lock)
                {
                        print 'Fertig!';
                }
                else
                {
                        print $meta;
                        print 'Datei noch nicht freigegeben';
                }
        }
        else
        {
                print $meta;
                print 'Datei ist noch nicht da';
        }
        print $cgi->end_html;   
}


tausend dank

View full thread "Bitte warten"-Zwischenseite