Re: Behavior of the sleep function?
| From: | Christoph Becker | Date: | Tue, 10 Mar 2015 18:40:27 +0000 |
| Subject: | Re: Behavior of the sleep function? | ||
| References: | 1 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-324615@lists.php.net to get a copy of this message | ||
Jeffry Killen wrote:
> I am experimenting with flock to find out how it works.
>
> I set up a page with a form that uses javascript ajax async 'get'
> to query the server.
>
> The reason for using ajax is that the page will not reload so
> I can keep a count of the queries issued and simulate two different
> users trying to edit the file.
>
> I am assuming that the first query (which calls flock and invokes the
> sleep function)
> would block the second query.
>
> But the second query succeeds and the the first query returns after 10
> seconds
>
> Here is the code:
>
> <?php
>
> $_jsTest = '';
> $_error = '';
> if(!is_file('lab6_target.txt'))
> {
> if(is_writeable('./'))
> {
> $_fw = fopen('lab6_target.txt', 'w');
> fwrite($_fw, "some bs text for the sake of testing this turkey.");
> fclose($_fw);
> }
> }
> if($_GET)
> {
> if($_GET['tstNo'] == '1')
> {
> $_jsTest = $_GET['tst1'];
> $_fw = fopen('lab6_target.txt', 'a');
> flock($_fw, LOCK_EX); // LOCK_SH, LOCK_EX, LOCK_UN
> $_error = "starting 10 second sleep";
> header('Content-Type: text/plain');
> print $_error;
> sleep(10);
> fwrite($_fw, $_GET['tst1']);
> flock($_fw, LOCK_UN);
> fclose($_fw);
> exit;
> }
> else if($_GET['tstNo'] == '2')
> {
> $_jsTest = $_GET['tst1'];
> $_fw = fopen('lab6_target.txt', 'a');
> if(!$_fw)
> {
> header('Content-Type: text/plain');
> print "file not opened for write on second test";
> exit;
> }
> else
> {
> fwrite($_fw, $_GET['tst1']);
> fclose($_fw);
> header('Content-Type: text/plain');
> print "success";
> exit;
> }
> }
> }
> ?>
>
> Test Result: successstarting 10 second sleep
flock() implements *advisory* file locking, i.e. it works only if *all*
file accesses use flock() to probe for a lock. So, basically, you have
to call flock($_fw, LOCK_EX) also for $_GET['tstNo'] == '2'.
--
Christoph M. Becker