Php blocking

The essence of a problem is those:

There is a database used on a site (for example, base for registration of users where their name enters the name and email), she lays in a text file postrochno (further, "file_base.dat."). Two users make active the server through the command line in a browser, for input svokh names and email. The server sends them to a script. Both users " begin movement " on skriptovomu to a stream (to the text php a file) from top to down, and, the First "runs" on a share of second faster the Second. When they reach{achieve} that place where the script executes their search, movement on a stream stops, in their browser the page generated by a script as html is deduced. That from file_base.dat to read the data, this file should be opened on reading (function - @file), to write down something in him , is necessary to open on recording (function - @fopen). In a script it looks so:



<?

… …

// We read the data from file - base

$f = @file ("file_base.dat", "r"); // here there is 2 user

// Here there is a text of a script

// We open file - base on recording

$fp = @fopen ("file_base.dat", "w"); // here there is 1 user

// We write down in file - base the data from higher

// Read file_base.dat - a variable $f

// Also we add one more line with the data of the new user

// We close file - base

@fclose ($fp);

… …

?>


That is, that the new user has appeared in ours file_base.dat, we read - out therefrom the information which we put in a variable $f, then we write down in the same file this variable $f (thus, file_base.dat we we copy completely) and below we finish one more line with the data of our new user. We see, that on reading and on recording file_base.dat opens in different places of our script. If both users, simultaneously, have reached{achieved} the place in this script, but one of file_base.dat only started to read the data, and another already has read them, has promoted hardly below and, during this moment, is on a mark of recording in a file file_base.dat the data. That, in this case, from our file file_base.dat remain nothing. In this connection, in php function of joint access @flock which is called to not suppose joint access to a file on reading and recording has been entered.



<?

… …

// We read the files - bases given from a file

$f = @file ("file_base.dat", "r"); // here there is 2 user

// Here there is a text of a script

// We open file - base on recording

$fp = @fopen ("file_base.dat", "w"); // here there is 1 user

// We block file - base on reading

@flock ($fp, lock_ex)

// We write down in file - base the data from higher

// Read file_base.dat - a variable $f

// Also we add one more line with the data of the new user

// We remove blocking

@flock ($fp, lock_un)

// We close file - base

@fclose ($fp);

… …

?>


Now, like it's OK, the file is blocked on reading when to him  something write. But, what will take place in our case when, 1 user has read the data of a file and has come to a mark of opening file_base.dat on recording, orkyl it  and has blocked on reading by function @flock, and 2 user, has come to this moment to a point where the data from a file are read out by function @file? 2 user will read nothing from this file because file_base.dat it is blocked by 1 user @flock command on reading. 2 user "will simply run" further on a stream of a script of anything from a file file_base.dat not having read, that is our variable $f will be empty. But, further he will write down in this file that earlier from him  considered. In a result, in ours file_base.dat one line with his  name and email will be written down only. That is, file_base.dat it will be lost.

In this connection, function has been thought up: read_file



function read_file ($path)

{

if (! is_file ($path)) {return false;}

elseif (! filesize ($path)) {return array ();}

elseif ($array=file ($path)) {return $array;}

else {while (! $array=file ($path)) {sleep (1);} return $array;}

}


The essence of her  is those: while the file is blocked on reading, the user who wants to count from him  the information, is in a cycle, that is, as though "costs{stands}" on a place, "does not run" further under the text of a script, expecting when the file will be unblocked on reading. In a result our script accepts such kind:



<?

function read_file ($path)

{

if (! is_file ($path)) {return false;}

elseif (! filesize ($path)) {return array ();}

elseif ($array=file ($path)) {return $array;}

else {while (! $array=file ($path)) {sleep (1);} return $array;}

}

… …

// Whether we check the file on reading is blocked,

// If it is blocked, we appoint a cycle with a stop,

// While blocking will not be removed{will not be taken off}, after removal of blocking,

// We read the files - bases given from a file

$f = read_file ("file_base.dat", "r"); // here there is 2 user

// Here there is a text of a script

// We open file - base on recording

$fp = @fopen ("file_base.dat", "w"); // here there is 1 user

// We block file - base on reading

@flock ($fp, lock_ex)

// We write down in file - base the data from higher

// Read file_base.dat - a variable $f

// Also we add one more line with the data of the new user

// We remove blocking

@flock ($fp, lock_un)

// We close file - base

@fclose ($fp);

… …

?>


Like it's OK. When 1 user started to write down the data in file_base.dat, 2 "sleeps" one second, expecting a unblocking file_base.dat when file_base.dat it is unblocked, he reads out from him  the information and begins movement further. But, there is one "but". If 2 user hardly is faster than 1 user "has reached" the place, has read half of data from ours file_base.dat which have not been blocked yet, and, during this moment, 1 "has reached" under the text of a script up to @flock ($fp, lock_ex), that is has blocked our file the variable $fp will have only half of data from ours file_base.dat because, during this moment file_base.dat has been blocked. In a result, in ours file_base.dat half of information from our base + one storka the new user will be written down. That is, again, file_base.dat we have lost.


Essence of the approach which is offered by us for the decision of this problem such:

During reading from a file or recording in him  of the data, on a site there is a text line with the name of this file when from a file the information was read or has entered the name, this text line leaves. While she is, someone means already uses a database on reading or recording, the user who wants to address to this base on reading or recording, is in a cycle, expecting while the text line will disappear. As soon as she disappears, he reads or writes to a database, itself thus creating the same text line, thus interfering with access of two and more users to base.


For what, on a site we shall create a folder for storage of text lines. For example, lock. Our file on a site lays in a folder database, means in a folder lock it is necessary to create a folder database. Now, when the user addresses to file_base.dat, for reading or recording in him , the absolute way http: // nash_sajt.ru/database/file_base.dat, in a folder http: // nash_sajt.ru/lock/database/appears a file - line file_base.dat.tmp, an absolute way - http: // nash_sajt.ru/lock/database/file_base.dat.tmp, closing access to file_base.dat as soon as the user considered or has written down the information in ours file - base, the text line file_base.dat.tmp leaves, opening access to other users to file_base.dat.



<?

// We declare a directory for time files

$lock_dir = "lock";

// Function for creation of time text files

function touchstring ($file) {

global $lock_dir;

$tmp = " $lock_dir / ". $ file. ".tmp ";

while (1) {

if (is_file ($tmp))

{

while (file_exists ($tmp))

{

$file_exist ++;

if ($file_exist> 10) {break;}

clearstatcache ();

sleep (1);

}

}

return touch ($tmp);

}

}

// Function excluding time text files

function delstring ($file) {

global $lock_dir;

$tmp = " $lock_dir / ". $ file. ".tmp ";

return unlink ($tmp);

}

// Alternative funkci @file

function filearray ($file) {

if (! is_readable ($file)) return false;

touchstring ($file);

$bufer = file ($file);

delstring ($file);

return $bufer;

}

// Alternative funkci @fopen

function openfile ($file, $mode) {

touchstring ($file);

return fopen ($file, $mode);

}

// Alternative funkci @fclose

function closefile ($fido, $file) {

$sito = fclose ($fido);

delstring ($file);

return $sito;

}

… …

// Whether we check there is the temporary file forbidding

// Reading and recording in file - base if he is, we stop

// The user in a cycle where he expects while a temporary file

// Will disappear, as tolko he disappears, we create same temporary

// The file, forbidding access to file - base, only after that is readable the data from

// Files - bases, we delete a temporary file, opening access to base

// To other users

$f = filearray ("database/file_base.dat"); // here there is 2 user

// Here there is a text of a script

// Whether we check there is the temporary file forbidding

// Reading and recording in file - base if he is, we stop

// The user in a cycle where he expects while a temporary file

// Will disappear, as tolko he disappears, we create same temporary

// The file, forbidding access to file - base, only after that is opened

// File - base on recording, a temporary file does not leave, closing access to base

// To other users

$fp = openfile ("database/file_base.dat", "w"); // here there is 1 user

// We write down in file - base the data from higher

// Read database/file_base.dat - a variable $f

// Also we add one more line with the data of the new user

// We close file - base, we delete a temporary file, opening access to base

// To other users

closefile ($fp, "database/file_base.dat");

// Pay attention, that in closefile two arguments: $fp and

// database/file_base.dat

… …

?>


In this situation we see, that when one user has reached{achieved} a point of reading with file_base.dat or, on the contrary, another tries to write down in file_base.dat the information, to us it is terrible nothing. Because, both in one, and in the other case, the small text file file_base.dat.tmp which does not give any has appeared to another in common to read or write in file_base.dat.


In our variant there is one "hole" if suddenly the user has addressed to a database, having created a text line of blocking, nezakonchil as though a cycle (light pogas and the computer was switched off), and this text blocking line has remained to lay in a folder lock our program "podvisnet", not giving anybody to pass, because of this stayed flag.

We did not begin to complicate function by check on removal{distance} of this file - flag, and, have simply entered into functions his  creating, a limit "podvisanija" a computer of 10 seconds ($file_exist ++; if ($file_exist> 10) {break;}), in 10 seconds he automatically will leave from a cycle and will erase a temporary file. In it danger is covered, but she is insignificant smaller in comparison with what have been described above. We count, that the approach described above, will protect from a collapse{landslide} of a database which lays in a text file and it will not be especially appreciable flags of blocking when on a site of her , simultaneously uses up to 10 person. We know, that our script is executed by the server 0,5 sek, in this case his  bandwidth at one o'clock will make up to 1800 person. We shall reduce her  twice, 900 person, for a day 21600 person. Agree, and without mysql it is possible to do without.


For check of serviceability of these functions write down manually in a folder lock this most blocking file file_base.dat.tmp, in our case, it: http: // nash_sajt.ru/lock/database/file_base.dat.tmp, thus, blocking access to base http: // nash_sajt.ru/database/file_base.dat, start the program, address to base, you will see, that the flag works also a browser "costs{stands}" on a place, remove file_base.dat.tmp a file (unblocking) and podvisanie will end.


Now we have functions:

1. filearray, replacing @file

2. openfile, replacing @fopen

3. closefile, replacing @fclose



Creation of sites with an opportunity of seal PDF on example PDF:: AP

It would be desirable to consider advantages of format PDF (Portable Document Format), developed by company Sun Microsystems, and also where and why it is necessary to use format PDF at creation of sites.

Perhaps, to you some times there was a necessity of a seal of documents directly from the Internet. It can be bills, the receipts given for a seal on a pattern.

Probably, you also had to meet features of a seal of the similar documents which have been made out as HTML of a code directly from Internet Explorer. If nevertheless it was not necessary - necessarily it is necessary in the near future. The essence of these features consists that this browser in spite of the fact that is the most widespread at the moment of a spelling of clause{article}, is not able to print web-page correctly. The information on the unpacked{printed out} page starts to move down in the strange image, a background and other registration somewhere izchezaet, and the part of page can be cut off in general. As you understand, similar things are inadmissible, when it is necessary to give to the user an opportunity to unpack{print out} the document with which he will go to bank.

The situation is complicated even more when it is necessary to unpack{print out} a certain document on beforehand prepared pattern. Certainly, beforehand prepared patterns are seldom used on classical websites, however creation of sites is not limited to creation of HTML-pages. A site can be an intracorporate portal, B2B-system, a workplace of the operator eventually.

As practically at each ordinary user on a computer it is established Adobe Acrobat Reader or similar, it is possible to declare with confidence, that the documents which have been made out in format PDF to read will not make an opportunity.

So in what of advantage of format PDF? To list all them to me, for example, it is not obviously possible, therefore I shall try to mention the basic. First of all, as it was already spoken above, format PDF guarantees, that the document will be unpacked{will be printed out} in accuracy how he looks on the screen of the user. Second, any, absolutely any printer will unpack{will print out} the document with those spaces and positioning what you will set in generated file PDF, instead of according to sewed up adjustments in the printer. Besides it, some actions above PDF (for example, change) can be protected by the password. To all other, generation of multipage documents essentially becomes simpler. Those who was engaged in it and used HTML understand what not too simply to force to be broken off pages imeeno there where it is necessary for you. As you can see, before usual HTML more, than it is enough advantages of use PDF.

What is your name:         

Write the comments to clause{article}:                  

                   


Now, when the basic advantages of creation of sites with use of system of a seal of documents in format PDF are disassembled, we shall try to disassemble an example with use Perl and PDF:: API2.

Let's count, that the established and configured web-server, for example, Apache, and also Perl you near at hand already have.

First of all, it is necessary to establish module PDF:: API2 for Perl if you yet have not made it. To make it it is extraordinary simple. Simply execute the following command from under user Root:


1. perl-e shell-MCPAN



It is possible, if you did not use CPAN earlier, it will be necessary to answer some questions to initialize intsalljator. In most cases it is enough to answer "no" the first question « Are you ready for manual configuration? »

After will adjust CPAN, you will get in CPAN shell, before you will be about the following:



cpan shell - CPAN exploration and modules installation (v1.7602)

ReadLine support available (try ' install Bundle:: CPAN ')


cpan>



Type{Collect} install PDF :: API2 command and wait, while all will be established. If there will be problems, it is possible to use initial code PDF:: API2, located on search.cpan.org.

After installation PDF:: API2, leave from ustanohhika CPAN, having typed{collected}

exit

To check up, whether all was established how it is necessary, possible having typed{collected} in the console:

perl-e ' use PDF:: API2 '

If after input of the specified command has not followed any conclusion, means very well.

I also would advise to establish module XML:: Simple. To make it it is possible similarly for installation PDF:: API2. This module will allow us to create XML files with a configuration of a seal of documents in PDF.

So, we have established PDF:: API2 and we can start to be engaged in creation of sites with use of the specified module and to generate PDF files to a strike.

Create file PrintPDF.pm and write down in him  the following:


package PrintPDF;


use strict;

use XML:: Simple;

use PDF:: API2;


sub PrintPDF {

my $blobref = shift;

my $configref = shift;

my $hashref = shift;

}


1;


We have created new module Perl which has unique function PrintPDF and accepts parameters: the link to a variable containing a binary code of pattern PDF on which we shall print, the link to a variable containing XML a code of a configuration file and the link on khehsh which values will be used at a seal on a pattern.

Let's add function PrintPDF:


sub PrintPDF {

my $blobref = shift;

my $configref = shift;

my $hashref = shift;


my $pdf;

if (scalar $blobref = ~ m! ^PDF:: API2=HASH!) {

$pdf = $blobref;

} else {

$pdf = PDF:: API2-> openScalar ($$ blobref) or die $!;

}


my $fnt_orig = $pdf-> corefont ('Verdana',-encode =>'windows-1251 ');

my $size_orig = 7;

my ($fnt, $size, $color, $align);

my $xml = XMLin ($$ configref, ForceArray => 1);

return $pdf;

}


Now our function besides accepts parameters, does{makes} also the following things:

1.         Initializes object PDF:: API2, writing down a copy of object in $pdf

2.         Can receive as entrance parameter not only the link to a binary code of a pattern, but also available, created object PDF:: API2

3.         Sets default values: a font, the size, the coding, color and alignment

4.         Reads out in memory configuration XML a file


The following stage, the most complex  will be processing XML of a configuration file and a seal of the data:


sub PrintPDF {

my $blobref = shift;

my $configref = shift;

my $hashref = shift;


my $pdf;

if (scalar $blobref = ~ m! ^PDF:: API2=HASH!) {

$pdf = $blobref;

} else {

$pdf = PDF:: API2-> openScalar ($$ blobref) or die $!;

}


my $fnt_orig = $pdf-> corefont ('Verdana',-encode =>'windows-1251 ');

my $size_orig = 7;

my ($fnt, $size, $color, $align);

my $xml = XMLin ($$ configref, ForceArray => 1);


foreach my $page ({$xml-> {page}}) {

my $pdfpage = $pdf-> openpage ($ {$page-> {id}} [0]) or next;

my $gfx = $pdfpage-> gfx ();

foreach my $label ({$page-> {label}}) {

my $text;

my $x = $label-> {x};

my $y = $label-> {y};

if (defined $label-> {font}) {

$fnt = $pdf-> corefont ($ {$label-> {font}} [0],-encode =>'windows-1251 ');

} else {

$fnt = $fnt_orig;

}


if (defined $label-> {size}) {

$size = $ {$label-> {size}} [0];

} else {

$size = $size_orig;

}


if (defined $label-> {color}) {

$color = $ {$label-> {color}} [0]

} else {

$color = 'black';

}


if (defined $label-> {align}) {

$align = $ {$label-> {align}} [0];

} else {

$align = 'left';

}


foreach my $type ({$label-> {type}}) {

my $key = $type-> {value};

my $current = $hashref-> {$ type-> {value}};

$text. = $current. '' if $current;


}

$gfx-> textlabel ($label-> {x},

$label-> {y},

$fnt, $size,

$text,-color => $ color,-align => $ align

)

}

}

return $pdf;

}


Let's understand, that here occurs. And there is very simple thing: the cycle for each page described in XML a file is carried out. For each page the following actions are carried out:

1.         The requested page in a PDF-pattern opens

2.         Parameters of the requested text label (a font, the size, color, alignment, coordinates) are read out and if necessary become equivalent set to default hardly above

3.         Each text label can consist of several fields, each of which will be divided{shared} by a blank

4.         Value for each field is read out and enters the name in a variable $text

5.         In pdf a pattern the text label with the set parameters is placed

After performance of the specified cycle it is received generated PDF a file which the truth is stored{kept} while as object in a variable $pdf.

As you understand, one more necessary stage is creation of a PDF-pattern and a configuration file. As a pattern we shall use an empty PDF-pattern of size A4.

And the example of a XML-file, which contents will be necessary for passing our function:

Pay attention, that the point (0,0) in coordinate plane PDF of a file is in the bottom left corner, instead of top left.





1


30

center




20

center




10




10






The last, that it is necessary for us to make at last to generate PDF - to write the small reference{manipulation} to our module PrintPDF.pm. For this purpose create file PrintPDF.pl and write down in him  the following:


*!/usr/bin/perl


use strict;

use PrintPDF;

use CGI qw (param);


my $hashref = {};

$hashref-> {name} = param ('name');

$hashref-> {text} = param ('text');

if ($hashref-> {name} = ~m! [ueehjooajaiju] $!) {

$hashref-> {prefix} = 'Dear';

} else {

$hashref-> {prefix} = 'Dear';

}


my ($xml, $blob);

open (HANDLE, 'config.xml') or die $!;

$xml = join (");

close HANDLE;


open (HANDLE, 'blank.pdf') or die $!;

$blob = join (">, HANDLEstringify ();



In the same catalogue we put files config.xml and blank.pdf, we draw for this file the form similar below-mentioned and we look, how it is healthy - to print documents in PDF.

What is your name:         

Write the comments to clause{article}:                  

                   


In process ehksperimentirovanija, probably it is required to you:

?         $pdf-> importpage ($pdf, $source_page, $new_page) copies page number{room} $source_page in page with number{room} $new_page in the document $pdf

?         my $gif = $pdf-> image_gif ($image_path); $gfx-> image ($gif, $width, $height); and so it is possible to insert gif on page




For those who wants more, than HTML

For those who wants independently to learn to do{make} locally sites to program, using languages: php, sgi, moreover with support of a database (mysql). All this you can, if establish the local server on the komp``jutere.


In this clause{article} I do not allow detailed instructions and comments as it will turn out the whole Talmud. I not super-muper the user, and in programming on rnr only beginning{starting} so I ask do not write to me the letter with the request to prompt something. I not so know much.


For what this local server is necessary?

He is necessary that locally on a computer, not leaving in the Internet to test scripts on php, sgi. For those who in it in general boom - boom, I shall prompt. For example, you already own html, Sss. You want to make a site and to place on the paid server where, naturally, there is a support php, cgi, a database mysql. This site will update often. On him will be placed: a multipage photo gallery, lists, archive, etc. Problems as though any, but in due course when razrostetsja, it  all it will be more complex  to serve, update a site, etc. For example, you have changed the main menu of a site (have added one more link) and with horror understand, that prijdet`sja perezakachat` all pages where there is it chertovo the menu. Certainly, it is possible to use the menu on a script java <http: // www.internet-technologies.ru/? url=http%3A%2F%2Fwww.sothink.com%2Fwebtools%2Fdhtmlmenu%2Fdownload.htm>, and having changed only one file *.js to solve all problem. And if it is necessary to add a photo in a photo gallery, to add new recordings in the multipage list, then that? In that case you need to master the programming language on "rnr". It  with a head will suffice you at the beginning.


With the help of language "rnr" you can create:


- Multipage photo galleries, lists + the menu

- Archives + a calendar

- vehb-forms for a subscription of visitors to news of your site

- Block structure of a site (header, footer, content, menu) for simplification obnovlenij on the server of your provider and it is a lot of another


Convenience of programming on rnr is attractive that, that you write pages on html, and inside a code only in the necessary places insert scripts. It is possible to write in general all on rnr, here there are no restrictions. You create as want, simply flight fajntazii!

Those who in programming as the boom - boom you pridet`sja it  to master, differently cannot be.

There is other way for beginning{starting}. For faster practical study, in the Internet there are «-«-chen` many different resources of free-of-charge scripts on rnr. You can download them, open and look through as they are written. It to you will help to master much faster rnr.

Still I to you porekomenduju to find the good literature as it also is important. For example, I began with book Larri Ul`mana - " Bases of programming on RNR ". It is the self-instruction manual. The electronic address of the edition: http://www.dmkpress.ru <http: // www.internet-technologies.ru/? url=http%3A%2F%2Fwww.dmkpress.ru>


So we shall start.


The excellent{different} server which is called - appserv-win32


Site: appserv open project http://www.appservnetwork.com/ <http: // www.internet-technologies.ru/? url=http%3A%2F%2Fwww.appservnetwork.com%2F>

There on the first page at once it is possible to see what versions "appserv"


That enters into a package appserv-win32-2.4.1


- php 4.3.8

- apache 1.3.31

- mysql 4.0.20

- zend optimizer 2.5.3

- phpmyadmin 2.6.0-rc1

- perl 5.8.4


Note. The problem is possible{probable} for at whom costs{stands} windows 98. appserv can will not be established.

And other server - Denver - 2 - will be established. But he less progressive than appserv and swears in a browser much. I shall describe their differences below in the text.


At once I warn. That juzat` the server you should have even minimal knowledge in use of the Server and in programming.

Therefore, FOR BEGINNING{STARTING}, I recommend to begin about Denver - 2 http://web.dklab.ru <http: // www.internet-technologies.ru/? url=http%3A%2F%2Fweb.dklab.ru>

On this site rather detailed information on installation and use of the Server Denver - 2. And in general, if you only have started to be engaged osvaivaniem jobs on the local server, on a site http://web.dklab.ru <http: // www.internet-technologies.ru/? url=http%3A%2F%2Fweb.dklab.ru> you will find quite good support. At their forum it is possible to find practically any answer to the arisen problem.


For those who juzaet "Denver - 2".

I started about Denver (a), but have passed on appserv-win32.

This server works stably and without glitches.


Those who wants locally juzat` ready free-of-charge sites and quite good forums:

php-nuke, phpbb and in this spirit - appserv-win32 - SIMPLY the FIND.


After installation the Server will be located (by default) in c:appserv

To see as he raboteaet:

Load your browser and enter: http://localhost <http: // www.internet-technologies.ru/? url=http%3A%2F%2Flocalhost> (press enter)

The page of the local server from the menu will be loaded. If it will be loaded, all works.

Working folder for a premise{room} in him  of a site, scripts for job in this server:


c:appservwww


For example, you have downloaded any free-of-charge unpretentious script on rnr.

Razzipovav archive in a folder, you for example, name a folder, in which this script - testscript

This folder to you needs to be inserted in www


It will turn out that: c:appservwwwtestscript


Start a browser and enter the address: http://localhost/testscript/ <http: // www.internet-technologies.ru/? url=http%3A%2F%2Flocalhost%2Ftestscript%2F>


If in a folder testscript there is no file index.php which is started by default you need to register completely the address. For example, in a folder there is a file calendar.php you and write completely the address: http://localhost/testscript/calendar.php <http: // www.internet-technologies.ru/? url=http%3A%2F%2Flocalhost%2Ftestscript%2Fcalendar.php>


Vualja!!! If all have made correctly all should work if no try put other any free-of-charge script. Only at uploading such scripts necessarily look requirements to it .

On page for uploading a script always there is an accompanying information. If she  no, in skachanom archive, most likely there is text a file where there is such information. There should be specified, that the script demands only presence of the RNR-MODULE. If there it is written, that the database mysql do not download is still necessary if you do not have operational experience with a database.


If you want to establish at once two servers they will bite among themselves.

But it is possible to bypass and this problem.

To establish two servers (appserv-win32 and Denver - 2) it is necessary for you:

First, naturally, to establish Denver - 2, then appserv-win32.

If you start appserv-win32 he will be started without problems. And Denver will not be.



That all taki to start Denver you need to rename 2 files because of which there is a conflict.

For example, simply add any symbol in the beginning of a file (*).:

Was php4ts.dll began #php4ts.dll


If at you costs{stands} winxp, a way to files such:

- php4ts.dll (is in a folder: c:windowssystem32)

- my.ini ((is in a folder: c:windowsmy.ini)


After you have finished job in Denver, you again need to rename above-stated 2-va a file back to start appserv-win32. Inconveniently, but there's nothing to be done.


Nuances.


If you want juzat` cgi-scripts it is better to use Denver. The truth it is necessary to establish the additional module activeperl.


In appserv-win32 that juzat` cgi-scripts, it is necessary to change a way to the interpreter perl.