5
\$\begingroup\$

Here is a recursive function that I wrote to search a file-system to a child depth defined by $depth.

Could it be optimized more?

function stringSearch($working_dir,&$results_array,$depth)
{
    global $search_string;
    global $dir_count;
    global $file_count;
    global $working_url;
    global $max_depth;

    if($max_depth>=($depth+1))
    {
        $dir_array = glob($working_dir.'/*', GLOB_ONLYDIR);
        foreach($dir_array as $new_path)
        {
            stringSearch($new_path,$results_array,($depth+1));
            $dir_count++;
        }
    }

    $handle = opendir($working_dir);
    while ($file = readdir($handle)) 
    {
        if(is_file($working_dir.'/'.$file))
        {
            if(stripos(str_replace('_',' ',$file),$search_string))
                $results_array[] = array('file'=>$file,'path'=>$working_dir,'url'=>$working_url.str_replace($_SERVER["DOCUMENT_ROOT"],'',$working_dir));

            $file_count++;
        }
    }

    return;
}
\$\endgroup\$
4
  • 2
    \$\begingroup\$ Should look into DirectoryIterator (us2.php.net/directoryiterator), may help clean up your code a bit. \$\endgroup\$
    – Digital Precision
    Nov 12, 2011 at 19:17
  • \$\begingroup\$ Hmm. . . I'd call out to find -name '*' -maxdepth 3 . . . :) (Syntax might not quite be correct, I'm currently on a windows machine, assumed Linux) \$\endgroup\$
    – Levi Morrison
    Nov 12, 2011 at 19:20
  • \$\begingroup\$ Thanks, I'll check it out. I also found that making $results_array global rather than passing by reference greatly improved performance. \$\endgroup\$
    – cbm3384
    Nov 12, 2011 at 19:21
  • 6
    \$\begingroup\$ also have a look at RecursiveDirectoryIterator, RecursiveIteratorIterator, RegexIterator, GlobIterator and FilterIterator. Or just look at all the iterators. In any case, you dont want that piece of code of yours. \$\endgroup\$
    – Gordon
    Nov 12, 2011 at 19:35

1 Answer 1

1
\$\begingroup\$

I answered this moments ago, but same applies

https://stackoverflow.com/questions/8108175/php-usleep-to-prevent-script-timeout/8108229#8108229

If you simply use : $handle = opendir($working_dir); you can find yourself waiting for the script to timeout on non existing directories. So atleast use:

if (! $handle = opendir($working_dir)) 
  exit(0);

Its generally way faster to just check if functions are even possible before you start them, although it might feel like your implementing way to many if statements, but if statements are fast and most errors are not ;)

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.