Recently I had to setup a script to curl 10k urls, but it could only do 500 requests at any one time. 501 requests would cause a 503 server error, or even a 500. In order to work under that limit, I created a function that returns the number of currently running processes on the machine in an extremely fast and efficient way.
It gets the number of running processes in the most efficient way possible, by doing a simple stat
on the /proc
directory for the number of hard links. In unix, each hard link in the /proc
directory corresponds to a running process. So /proc/1234
would be a hard link for the process id 1234. Since each process has a unique process ID it has a corresponding hard link.
The upside to this method is that it is incredibly fast and efficient. The downside is it won't tell you how many of those processes are php, httpd, exim, sshd, etc.
This command will give you the same thing from the command line, such as from the Bash shell.
$ stat -c '%h' /proc
Here is the function. Note it is for php 5.3.0, though if you are running less than that it is no big deal in terms of performance, this baby is super quick.
/** askapache_get_process_count() * Returns the number of running processes * * @version 1.4 * * @return int */ function askapache_get_process_count() { static $ver, $runs = 0; // check if php version supports clearstatcache params, but only check once if ( is_null( $ver ) ) $ver = version_compare( PHP_VERSION, '5.3.0', '>=' ); // Only call clearstatcache() if function called more than once */ if ( $runs++ > 0 ) { // checks if $runs > 0, then increments $runs by one. // if php version is >= 5.3.0 if ( $ver ) { clearstatcache( true, '/proc' ); } else { // if php version is < 5.3.0 clearstatcache(); } } $stat = stat( '/proc' ); // if stat succeeds and nlink value is present return it, otherwise return 0 return ( ( false !== $stat && isset( $stat[3] ) ) ? $stat[3] : 0 ); }
This example will continually sleep for 5 seconds until the process count is less than the max_procs.
$max_procs = 200; $proc_count = askapache_get_process_count(); do { $proc_count = askapache_get_process_count(); error_log( "ALERT!! procs > max_procs: {$proc_count} > {$max_procs}.. SLEEP FOR 5 SECS " ); sleep( 5 ); } while ( $proc_count > $max_procs );
void clearstatcache ([ bool $clear_realpath_cache = false [, string $filename ]] )
When you use stat(), lstat(), or any of the other functions listed in the affected functions list (below), PHP caches the information those functions return in order to provide faster performance. However, in certain cases, you may want to clear the cached information. For instance, if the same file is being checked multiple times within a single script, and that file is in danger of being removed or changed during that script's operation, you may elect to clear the status cache. In these cases, you can use the clearstatcache() function to clear the information that PHP caches about a file.
You should also note that PHP doesn't cache information about non-existent files. So, if you call file_exists() on a file that doesn't exist, it will return FALSE until you create the file. If you create the file, it will return TRUE even if you then delete the file. However unlink() clears the cache automatically.
Note:
This function caches information about specific filenames, so you only need to call clearstatcache() if you are performing multiple operations on the same filename and require the information about that particular file to not be cached.
No value is returned.
array stat ( string $filename )
Gathers the statistics of the file named by filename. If filename is a symbolic link, statistics are from the file itself, not the symlink.
lstat() is identical to stat() except it would instead be based off the symlinks status.
Numeric | Associative (since PHP 4.0.6) | Description |
---|---|---|
0 | dev | device number |
1 | ino | inode number * |
2 | mode | inode protection mode |
3 | nlink | number of links |
4 | uid | userid of owner * |
5 | gid | groupid of owner * |
6 | rdev | device type, if inode device |
7 | size | size in bytes |
8 | atime | time of last access (Unix timestamp) |
9 | mtime | time of last modification (Unix timestamp) |
10 | ctime | time of last inode change (Unix timestamp) |
11 | blksize | blocksize of filesystem IO ** |
12 | blocks | number of 512-byte blocks allocated ** |
* On Windows this will always be 0.
** Only valid on systems supporting the st_blksize type - other systems (e.g. Windows) return -1.
In case of error, stat() returns FALSE.
Note:
Because PHP's integer type is signed and many platforms use 32bit integers, some filesystem functions may return unexpected results for files which are larger than 2GB.