in reply to using loop/array to write files

I think you may have had a problem while cut'n'pasting, since I don't see where you flock each of the new files and line 22 by my (vim's) count contains only the closing brace for the while loop. Perhaps you could repost the code, or even just the lines that are missing? Also, you seem to have a single element list in void context on the line immediately after the open (within the while loop). It looks like it might've been part of a function call but I'm not certain.

Beyond that, I'm curious why you are locking the newly created files. Is this script supposed to be run while the server is active and other processes are possibly attempting to read these files? If the reading process has good enough error checking (ie, an empty file is assumed to be 0) then it probably shouldn't matter. *shrug*

As for the FTP issue, how exactly are you executing the script via FTP? Is there a SITE command set up to execute programs? That sound like it might be a huge security hole. I'm not a security expert, however. As for the actual question (re: slowness), I don't really have any ideas. Perhaps if you post the missing lines...

Ah well, those are my (unfortunately rather unhelpful) thoughts. Hope you can make something from them, and see if you can get those missing lines here and I'll take another look through. Good luck.

bbfu
Seasons don't fear The Reaper.
Nor do the wind, the sun, and the rain.
We can be like they are.

  • Comment on (bbfu) Re: using loop/array to write files

Replies are listed 'Best First'.
Re: (bbfu) Re: using loop/array to write files
by Anonymous Monk on Sep 09, 2001 at 22:42 UTC
    I am not flocking each of the new files. I put the flock command after I open the first file. I thought locking the file is a good idea, since it is written to when a new ad is posted.

    I am not executing the script via FTP, I just have my FTP program open when I executed the script via my browser.

    And by line 22, I meant the line after "close (HITS_FILE);"

    I started the while loop with this line:while ($line = <FILE>) { and closed with a bracket just before: close FILE;

    Other than that, does the code look okay?
      The file lock does not good there. You have the following race:
      1. process 1 starts up and decides what file to create
      2. process 2 starts up and decides to create the same file.
      3. process 1 creates the file, and locks it.
      4. process 2 opens said file and tries to lock it.
      5. process 1 writes the file and exits.
      6. process 2 finally gets the file, overwrites what process 1 does and exits
      The fact is that while conceptually file locking is really simple, virtually nobody gets it right in practice. What you need to do instead is have a lockfile that always exists which, before doing operations that you want protected, you open and lock.

      That is the lock has to come before the process begins making any sort of decisions. And generally that means that you don't want to lock the file(s) you are going to work with.